st/nine: Use TGSI_SEMANTIC_GENERIC for fog
authorAxel Davy <davyaxel0@gmail.com>
Tue, 9 Apr 2019 20:52:28 +0000 (22:52 +0200)
committerAxel Davy <davyaxel0@gmail.com>
Tue, 30 Apr 2019 17:18:52 +0000 (19:18 +0200)
We used TGSI_SEMANTIC_FOG for fog,
however on vs/ps 3, fog is allowed to have
4 components (even on the ff pipeline according
to a wine test).
Since gallium's TGSI_SEMANTIC_FOG has only one
component, use TGSI_SEMANTIC_GENERIC instead.

Fixes:
https://github.com/iXit/Mesa-3D/issues/346

Signed-off-by: Axel Davy <davyaxel0@gmail.com>
src/gallium/state_trackers/nine/nine_ff.c
src/gallium/state_trackers/nine/nine_shader.c

index 4ef258c876d748cddb4bb186a555b403166e85ae..b38205d61000a3121bd196c379ff4a3d40543b1b 100644 (file)
@@ -420,7 +420,7 @@ nine_ff_build_vs(struct NineDevice9 *device, struct vs_build_ctx *vs)
     oCol[0] = ureg_saturate(ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0));
     oCol[1] = ureg_saturate(ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 1));
     if (key->fog || key->passthrough & (1 << NINE_DECLUSAGE_FOG)) {
-        oFog = ureg_DECL_output(ureg, TGSI_SEMANTIC_FOG, 0);
+        oFog = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 16);
         oFog = ureg_writemask(oFog, TGSI_WRITEMASK_X);
     }
 
@@ -1000,35 +1000,35 @@ nine_ff_build_vs(struct NineDevice9 *device, struct vs_build_ctx *vs)
         struct ureg_src input;
         struct ureg_dst output;
         input = vs->aWgt;
-        output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 18);
+        output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 19);
         ureg_MOV(ureg, output, input);
     }
     if (key->passthrough & (1 << NINE_DECLUSAGE_BLENDINDICES)) {
         struct ureg_src input;
         struct ureg_dst output;
         input = vs->aInd;
-        output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 19);
+        output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 20);
         ureg_MOV(ureg, output, input);
     }
     if (key->passthrough & (1 << NINE_DECLUSAGE_NORMAL)) {
         struct ureg_src input;
         struct ureg_dst output;
         input = vs->aNrm;
-        output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 20);
+        output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 21);
         ureg_MOV(ureg, output, input);
     }
     if (key->passthrough & (1 << NINE_DECLUSAGE_TANGENT)) {
         struct ureg_src input;
         struct ureg_dst output;
         input = build_vs_add_input(vs, NINE_DECLUSAGE_TANGENT);
-        output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 21);
+        output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 22);
         ureg_MOV(ureg, output, input);
     }
     if (key->passthrough & (1 << NINE_DECLUSAGE_BINORMAL)) {
         struct ureg_src input;
         struct ureg_dst output;
         input = build_vs_add_input(vs, NINE_DECLUSAGE_BINORMAL);
-        output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 22);
+        output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 23);
         ureg_MOV(ureg, output, input);
     }
     if (key->passthrough & (1 << NINE_DECLUSAGE_FOG)) {
@@ -1546,7 +1546,7 @@ nine_ff_build_ps(struct NineDevice9 *device, struct nine_ff_ps_key *key)
         ureg_MOV(ureg, ureg_writemask(oCol, TGSI_WRITEMASK_W), ps.rCurSrc);
     } else
     if (key->fog) {
-        struct ureg_src vFog = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_FOG, 0, TGSI_INTERPOLATE_PERSPECTIVE);
+        struct ureg_src vFog = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_GENERIC, 16, TGSI_INTERPOLATE_PERSPECTIVE);
         ureg_LRP(ureg, ureg_writemask(oCol, TGSI_WRITEMASK_XYZ), _XXXX(vFog), ps.rCurSrc, _CONST(21));
         ureg_MOV(ureg, ureg_writemask(oCol, TGSI_WRITEMASK_W), ps.rCurSrc);
     } else {
index 050a32d332742eb01ec2e4c47f55c378f7cbcb3e..212fd60255a2eadc1dacd1e3e9842ac508704d36 100644 (file)
@@ -1299,7 +1299,7 @@ _tx_dst_param(struct shader_translator *tx, const struct sm1_dst_param *param)
         case 1:
             if (ureg_dst_is_undef(tx->regs.oFog))
                 tx->regs.oFog =
-                    ureg_saturate(ureg_DECL_output(tx->ureg, TGSI_SEMANTIC_FOG, 0));
+                    ureg_saturate(ureg_DECL_output(tx->ureg, TGSI_SEMANTIC_GENERIC, 16));
             dst = tx->regs.oFog;
             break;
         case 2:
@@ -2039,15 +2039,16 @@ sm1_declusage_to_tgsi(struct tgsi_declaration_semantic *sem,
      * are close together or low.
      *
      *
-     * POSITION >= 1: 10 * index + 6
-     * COLOR >= 2: 10 * (index-1) + 7
+     * POSITION >= 1: 10 * index + 7
+     * COLOR >= 2: 10 * (index-1) + 8
+     * FOG: 16
      * TEXCOORD[0..15]: index
-     * BLENDWEIGHT: 10 * index + 18
-     * BLENDINDICES: 10 * index + 19
-     * NORMAL: 10 * index + 20
-     * TANGENT: 10 * index + 21
-     * BINORMAL: 10 * index + 22
-     * TESSFACTOR: 10 * index + 23
+     * BLENDWEIGHT: 10 * index + 19
+     * BLENDINDICES: 10 * index + 20
+     * NORMAL: 10 * index + 21
+     * TANGENT: 10 * index + 22
+     * BINORMAL: 10 * index + 23
+     * TESSFACTOR: 10 * index + 24
      */
 
     switch (dcl->usage) {
@@ -2059,7 +2060,7 @@ sm1_declusage_to_tgsi(struct tgsi_declaration_semantic *sem,
             sem->Index = 0;
         } else {
             sem->Name = TGSI_SEMANTIC_GENERIC;
-            sem->Index = 10 * index + 6;
+            sem->Index = 10 * index + 7;
         }
         break;
     case D3DDECLUSAGE_COLOR:
@@ -2068,13 +2069,13 @@ sm1_declusage_to_tgsi(struct tgsi_declaration_semantic *sem,
             sem->Index = index;
         } else {
             sem->Name = TGSI_SEMANTIC_GENERIC;
-            sem->Index = 10 * (index-1) + 7;
+            sem->Index = 10 * (index-1) + 8;
         }
         break;
     case D3DDECLUSAGE_FOG:
         assert(index == 0);
-        sem->Name = TGSI_SEMANTIC_FOG;
-        sem->Index = 0;
+        sem->Name = TGSI_SEMANTIC_GENERIC;
+        sem->Index = 16;
         break;
     case D3DDECLUSAGE_PSIZE:
         assert(index == 0);
@@ -2091,27 +2092,27 @@ sm1_declusage_to_tgsi(struct tgsi_declaration_semantic *sem,
         break;
     case D3DDECLUSAGE_BLENDWEIGHT:
         sem->Name = TGSI_SEMANTIC_GENERIC;
-        sem->Index = 10 * index + 18;
+        sem->Index = 10 * index + 19;
         break;
     case D3DDECLUSAGE_BLENDINDICES:
         sem->Name = TGSI_SEMANTIC_GENERIC;
-        sem->Index = 10 * index + 19;
+        sem->Index = 10 * index + 20;
         break;
     case D3DDECLUSAGE_NORMAL:
         sem->Name = TGSI_SEMANTIC_GENERIC;
-        sem->Index = 10 * index + 20;
+        sem->Index = 10 * index + 21;
         break;
     case D3DDECLUSAGE_TANGENT:
         sem->Name = TGSI_SEMANTIC_GENERIC;
-        sem->Index = 10 * index + 21;
+        sem->Index = 10 * index + 22;
         break;
     case D3DDECLUSAGE_BINORMAL:
         sem->Name = TGSI_SEMANTIC_GENERIC;
-        sem->Index = 10 * index + 22;
+        sem->Index = 10 * index + 23;
         break;
     case D3DDECLUSAGE_TESSFACTOR:
         sem->Name = TGSI_SEMANTIC_GENERIC;
-        sem->Index = 10 * index + 23;
+        sem->Index = 10 * index + 24;
         break;
     case D3DDECLUSAGE_SAMPLE:
         sem->Name = TGSI_SEMANTIC_COUNT;
@@ -3735,7 +3736,7 @@ shader_add_ps_fog_stage(struct shader_translator *tx, struct ureg_src src_col)
         ureg_MUL(ureg, fog_factor, tx_src_scalar(fog_factor), ureg_imm1f(ureg, -1.442695f));
         ureg_EX2(ureg, fog_factor, tx_src_scalar(fog_factor));
     } else {
-        fog_vs = ureg_scalar(ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_FOG, 0,
+        fog_vs = ureg_scalar(ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_GENERIC, 16,
                                             TGSI_INTERPOLATE_PERSPECTIVE),
                                             TGSI_SWIZZLE_X);
         ureg_MOV(ureg, fog_factor, fog_vs);
@@ -3768,7 +3769,7 @@ static void parse_shader(struct shader_translator *tx)
     }
 
     if (IS_VS && tx->version.major < 3 && ureg_dst_is_undef(tx->regs.oFog) && info->fog_enable) {
-        tx->regs.oFog = ureg_DECL_output(tx->ureg, TGSI_SEMANTIC_FOG, 0);
+        tx->regs.oFog = ureg_DECL_output(tx->ureg, TGSI_SEMANTIC_GENERIC, 16);
         ureg_MOV(tx->ureg, ureg_writemask(tx->regs.oFog, TGSI_WRITEMASK_X), ureg_imm1f(tx->ureg, 0.0f));
     }