gallivm: handle texel swizzles correctly for d3d10-style sample opcodes
unlike OpenGL, the texel swizzle is embedded in the instruction, so honor that. (Technically we now execute both the sampler_view swizzle and the per-instruction swizzle but this should be quite ok.) v2: add documentation note as it's not obvious. Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
This commit is contained in:
@@ -1859,6 +1859,19 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
|
||||
deriv_ptr,
|
||||
lod_bias, explicit_lod, scalar_lod,
|
||||
texel);
|
||||
|
||||
if (inst->Src[1].Register.SwizzleX != PIPE_SWIZZLE_RED ||
|
||||
inst->Src[1].Register.SwizzleY != PIPE_SWIZZLE_GREEN ||
|
||||
inst->Src[1].Register.SwizzleZ != PIPE_SWIZZLE_BLUE ||
|
||||
inst->Src[1].Register.SwizzleW != PIPE_SWIZZLE_ALPHA) {
|
||||
unsigned char swizzles[4];
|
||||
swizzles[0] = inst->Src[1].Register.SwizzleX;
|
||||
swizzles[1] = inst->Src[1].Register.SwizzleY;
|
||||
swizzles[2] = inst->Src[1].Register.SwizzleZ;
|
||||
swizzles[3] = inst->Src[1].Register.SwizzleW;
|
||||
|
||||
lp_build_swizzle_soa_inplace(&bld->bld_base.base, texel, swizzles);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1954,6 +1967,20 @@ emit_fetch_texels( struct lp_build_tgsi_soa_context *bld,
|
||||
NULL,
|
||||
NULL, explicit_lod, scalar_lod,
|
||||
texel);
|
||||
|
||||
if (is_samplei &&
|
||||
(inst->Src[1].Register.SwizzleX != PIPE_SWIZZLE_RED ||
|
||||
inst->Src[1].Register.SwizzleY != PIPE_SWIZZLE_GREEN ||
|
||||
inst->Src[1].Register.SwizzleZ != PIPE_SWIZZLE_BLUE ||
|
||||
inst->Src[1].Register.SwizzleW != PIPE_SWIZZLE_ALPHA)) {
|
||||
unsigned char swizzles[4];
|
||||
swizzles[0] = inst->Src[1].Register.SwizzleX;
|
||||
swizzles[1] = inst->Src[1].Register.SwizzleY;
|
||||
swizzles[2] = inst->Src[1].Register.SwizzleZ;
|
||||
swizzles[3] = inst->Src[1].Register.SwizzleW;
|
||||
|
||||
lp_build_swizzle_soa_inplace(&bld->bld_base.base, texel, swizzles);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -1730,6 +1730,8 @@ Resource Sampling Opcodes
|
||||
|
||||
Those opcodes follow very closely semantics of the respective Direct3D
|
||||
instructions. If in doubt double check Direct3D documentation.
|
||||
Note that the swizzle on SVIEW (src1) determines texel swizzling
|
||||
after lookup.
|
||||
|
||||
.. opcode:: SAMPLE - Using provided address, sample data from the
|
||||
specified texture using the filtering mode identified
|
||||
|
Reference in New Issue
Block a user