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:
Roland Scheidegger
2013-07-27 16:36:25 +02:00
parent f2be639972
commit abcc40e7f0
2 changed files with 29 additions and 0 deletions

View File

@@ -1859,6 +1859,19 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
deriv_ptr, deriv_ptr,
lod_bias, explicit_lod, scalar_lod, lod_bias, explicit_lod, scalar_lod,
texel); 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 static void
@@ -1954,6 +1967,20 @@ emit_fetch_texels( struct lp_build_tgsi_soa_context *bld,
NULL, NULL,
NULL, explicit_lod, scalar_lod, NULL, explicit_lod, scalar_lod,
texel); 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 static void

View File

@@ -1730,6 +1730,8 @@ Resource Sampling Opcodes
Those opcodes follow very closely semantics of the respective Direct3D Those opcodes follow very closely semantics of the respective Direct3D
instructions. If in doubt double check Direct3D documentation. 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 .. opcode:: SAMPLE - Using provided address, sample data from the
specified texture using the filtering mode identified specified texture using the filtering mode identified