Commit abcc40e7 authored by Roland Scheidegger's avatar Roland Scheidegger

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: default avatarJose Fonseca <jfonseca@vmware.com>
parent f2be6399
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment