From abcc40e7f05fcc1fd28f226f132f500a703d1e5d Mon Sep 17 00:00:00 2001 From: Roland Scheidegger Date: Sat, 27 Jul 2013 16:36:25 +0200 Subject: [PATCH] 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 --- .../auxiliary/gallivm/lp_bld_tgsi_soa.c | 27 +++++++++++++++++++ src/gallium/docs/source/tgsi.rst | 2 ++ 2 files changed, 29 insertions(+) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c index 4355b3a92d1..c199385998c 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c @@ -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 diff --git a/src/gallium/docs/source/tgsi.rst b/src/gallium/docs/source/tgsi.rst index 4d26c465579..0557ce0f94b 100644 --- a/src/gallium/docs/source/tgsi.rst +++ b/src/gallium/docs/source/tgsi.rst @@ -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 -- 2.30.2