gallium: fix tgsi SAMPLE_L opcode to use separate source for explicit lod
authorRoland Scheidegger <sroland@vmware.com>
Tue, 12 Feb 2013 15:41:56 +0000 (16:41 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Tue, 12 Feb 2013 15:51:11 +0000 (16:51 +0100)
It looks like using coord.w as explicit lod value is a mistake, most likely
because some dx10 docs had it specified that way. Seems this was changed though:
http://msdn.microsoft.com/en-us/library/windows/desktop/hh447229%28v=vs.85%29.aspx
- let's just hope it doesn't depend on runtime build version or something.
Not only would this need translation (so go against the stated goal these
opcodes should be close to dx10 semantics) but it would prevent usage of this
opcode with cube arrays, which is apparently possible:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb509699%28v=vs.85%29.aspx
(Note not only does this show cube arrays using explicit lod, but also the
confusion with this opcode: it lists an explicit lod parameter value, but then
states last component of location is used as lod).
(For "true" hw drivers, only nv50 had code to handle it, and it appears the
code was already right for the new semantics, though fix up the seemingly
wrong c/d arguments while there.)

v2: fix comment, separate out other changes.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
src/gallium/auxiliary/tgsi/tgsi_exec.c
src/gallium/auxiliary/tgsi/tgsi_info.c
src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h
src/gallium/docs/source/tgsi.rst
src/gallium/state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp

index cb6564ad079ac5f65ff6ca86257eba71d6104056..3a19fe2a64f760d8cba9d40605d1244609591090 100644 (file)
@@ -241,13 +241,10 @@ analyse_sample(struct analysis_context *ctx,
       tex_info->sampler_unit = inst->Src[2].Register.Index;
 
       if (modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV ||
+          modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_LOD ||
           modifier == LP_BLD_TEX_MODIFIER_LOD_BIAS || shadow) {
          /* We don't track insts with additional regs, although we could */
          indirect = TRUE;
-      }  else {
-         if (modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_LOD) {
-            readmask |= TGSI_WRITEMASK_W;
-         }
       }
 
       for (chan = 0; chan < 4; ++chan) {
index 52a60dd43b6fd8a84b7e73046af3e92598a1bf30..808e8168824159edacbb4a8bb1c41c69067d7349 100644 (file)
@@ -1428,9 +1428,8 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
       explicit_lod = NULL;
    }
    else if (modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_LOD) {
-      /* lod bias comes from src 3.r but explicit lod from 0.a */
       lod_bias = NULL;
-      explicit_lod = lp_build_emit_fetch( &bld->bld_base, inst, 0, 3 );
+      explicit_lod = lp_build_emit_fetch( &bld->bld_base, inst, 3, 0 );
    }
    else if (modifier == LP_BLD_TEX_MODIFIER_LOD_ZERO) {
       lod_bias = NULL;
index 6da7d42455cc3cefbf3aa36ee3240a3bb3b2baa0..03f194209869237d713feb212290b4c8b62dfa98 100644 (file)
@@ -2154,7 +2154,7 @@ exec_sample(struct tgsi_exec_machine *mach,
          control = tgsi_sampler_lod_bias;
       }
       else if (modifier == TEX_MODIFIER_EXPLICIT_LOD) {
-         FETCH(&c1, 0, TGSI_CHAN_W);
+         FETCH(&c1, 3, TGSI_CHAN_X);
          lod = &c1;
          control = tgsi_sampler_lod_explicit;
       }
index f8a3cb665f9efa508dd040bf51082ad34cb2b8a8..f289ebcda5adbdb62a794c634d0430cd11e5783c 100644 (file)
@@ -190,7 +190,7 @@ static const struct tgsi_opcode_info opcode_info[TGSI_OPCODE_LAST] =
    { 1, 4, 0, 0, 0, 0, OTHR, "SAMPLE_C",    TGSI_OPCODE_SAMPLE_C },
    { 1, 4, 0, 0, 0, 0, OTHR, "SAMPLE_C_LZ", TGSI_OPCODE_SAMPLE_C_LZ },
    { 1, 5, 0, 0, 0, 0, OTHR, "SAMPLE_D",    TGSI_OPCODE_SAMPLE_D },
-   { 1, 3, 0, 0, 0, 0, OTHR, "SAMPLE_L",    TGSI_OPCODE_SAMPLE_L },
+   { 1, 4, 0, 0, 0, 0, OTHR, "SAMPLE_L",    TGSI_OPCODE_SAMPLE_L },
    { 1, 3, 0, 0, 0, 0, OTHR, "GATHER4",     TGSI_OPCODE_GATHER4 },
    { 1, 2, 0, 0, 0, 0, OTHR, "SVIEWINFO",   TGSI_OPCODE_SVIEWINFO },
    { 1, 2, 0, 0, 0, 0, OTHR, "SAMPLE_POS",  TGSI_OPCODE_SAMPLE_POS },
index 75e27a666f166c52a5e8e5c36970742a44a394c5..4a1b811b30b6e5657c5720b367cdf693e0d6d921 100644 (file)
@@ -176,7 +176,7 @@ OP14(SAMPLE_B)
 OP14(SAMPLE_C)
 OP14(SAMPLE_C_LZ)
 OP15(SAMPLE_D)
-OP13(SAMPLE_L)
+OP14(SAMPLE_L)
 OP13(GATHER4)
 OP12(SVIEWINFO)
 OP13(SAMPLE_POS)
index 31b679621dacdb84bb1dbf46545d6cd3ae9bb767..f13dd8fdffa659b0642801ca06e59687288f3289 100644 (file)
@@ -1423,11 +1423,10 @@ instructions. If in doubt double check Direct3D documentation.
 
 .. opcode:: SAMPLE_L - SAMPLE_L is identical to the SAMPLE opcode except
                that the LOD is provided directly as a scalar value,
-               representing no anisotropy. Source addresses A channel
-               is used as the LOD.
-               SAMPLE_L dst, address, sampler_view, sampler
+               representing no anisotropy.
+               SAMPLE_L dst, address, sampler_view, sampler, explicit_lod
                e.g.
-               SAMPLE_L TEMP[0], TEMP[1], SVIEW[0], SAMP[0]
+               SAMPLE_L TEMP[0], TEMP[1], SVIEW[0], SAMP[0], TEMP[2].x
 
 .. opcode:: GATHER4 - Gathers the four texels to be used in a bi-linear
                filtering operation and packs them into a single register.
index aaa46f19e8c9287edf997d77fedbca55383304d0..ed1f8dac948abf9b3e681126c2d7465bf9e9803e 100644 (file)
@@ -470,14 +470,9 @@ struct sm4_to_tgsi_converter
                        case SM4_OPCODE_SAMPLE_D: // dst, coord, res, samp, ddx, ddy
                                ureg_SAMPLE_D(ureg, _dst(), _src(1), resources[_idx(SM4_FILE_RESOURCE, 2)], samplers[_idx(SM4_FILE_SAMPLER, 3)], _src(4), _src(5));
                                break;
-                       case SM4_OPCODE_SAMPLE_L: // dst, coord, res, samp, bias.x
-                       {
-                               struct ureg_dst tmp = _tmp();
-                               ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_XYZ), _src(1));
-                               ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), ureg_swizzle(_src(4), 0, 0, 0, 0));
-                               ureg_SAMPLE_L(ureg, _dst(), ureg_src(tmp), resources[_idx(SM4_FILE_RESOURCE, 2)], samplers[_idx(SM4_FILE_SAMPLER, 3)]);
+                       case SM4_OPCODE_SAMPLE_L: // dst, coord, res, samp, lod.x
+                               ureg_SAMPLE_L(ureg, _dst(), _src(1), resources[_idx(SM4_FILE_RESOURCE, 2)], samplers[_idx(SM4_FILE_SAMPLER, 3)], _src(4));
                                break;
-                       }
                        default:
                                ok = false;
                                break;