gallium: more fog extraction fixes
authorZack Rusin <zackr@vmware.com>
Tue, 7 Jul 2009 01:33:56 +0000 (21:33 -0400)
committerZack Rusin <zackr@vmware.com>
Tue, 7 Jul 2009 01:35:15 +0000 (21:35 -0400)
fix the cases when fog coord/front face/point coord are used in the same
shader.

src/mesa/state_tracker/st_atom_shader.c
src/mesa/state_tracker/st_mesa_to_tgsi.c
src/mesa/state_tracker/st_program.c

index c02ccc3528302aca00ee4cb11252a2574cc7e258..299aa762c201841743cdbbd37ce89da199235910 100644 (file)
@@ -137,22 +137,15 @@ find_translated_vp(struct st_context *st,
 
       for (inAttr = 0; inAttr < FRAG_ATTRIB_MAX; inAttr++) {
          if (fragInputsRead & (1 << inAttr)) {
+            stfp->input_to_slot[inAttr] = numIn;
+            numIn++;
             if ((fragInputsRead & FRAG_BIT_FOGC)) {
-               if (stfp->Base.UsesPointCoord) {
-                  stfp->input_to_slot[inAttr] = numIn;
-                  numIn++;
+               /* leave placeholders for the
+                * extra registers we extract from fog */
+               if (stfp->Base.UsesFrontFacing ||
+                   stfp->Base.UsesPointCoord) {
+                  numIn += 2;
                }
-               if (stfp->Base.UsesFrontFacing) {
-                  stfp->input_to_slot[inAttr] = numIn;
-                  numIn++;
-               }
-               if (stfp->Base.UsesFogFragCoord) {
-                  stfp->input_to_slot[inAttr] = numIn;
-                  numIn++;
-               }
-            } else {
-               stfp->input_to_slot[inAttr] = numIn;
-               numIn++;
             }
          }
          else {
index 3140ebe04adb09cd91baf05dd38d2e9e35dc87dd..8aef3fc6dcf597c29e3b964ea5cabe2a06f55f05 100644 (file)
@@ -122,8 +122,15 @@ map_register_file_index(
                                      SWIZZLE_X,
                                      SWIZZLE_X,
                                      SWIZZLE_X);
+            /* register after fog */
+            return inputMapping[index] + 1;
          } else {
-            /* fixme: point coord */
+            *swizzle = MAKE_SWIZZLE4(SWIZZLE_Z,
+                                     SWIZZLE_W,
+                                     SWIZZLE_Z,
+                                     SWIZZLE_W);
+            /* register after frontface */
+            return inputMapping[index] + 2;
          }
       }
       /* inputs are mapped according to the user-defined map */
index 9a346fbde0c7d05217bd4ce765c5c3dda71d7a44..18d10468317c439e9e80afa89ff4def94b1e8c94 100644 (file)
@@ -433,20 +433,34 @@ st_translate_fragment_program(struct st_context *st,
             stfp->input_semantic_index[slot] = 1;
             interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
             break;
-         case FRAG_ATTRIB_FOGC:
-            if (stfp->Base.UsesPointCoord) {
-               stfp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
-               stfp->input_semantic_index[slot] = num_generic++;
-               interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
-            } else if (stfp->Base.UsesFrontFacing) {
-               stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
-               stfp->input_semantic_index[slot] = 0;
-               interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
-            } else {
+         case FRAG_ATTRIB_FOGC: {
+            int extra_decls = 0;
+            if (stfp->Base.UsesFogFragCoord) {
                stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
                stfp->input_semantic_index[slot] = 0;
                interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
+               input_flags[slot] = stfp->Base.Base.InputFlags[attr];
+               ++extra_decls;
            }
+            if (stfp->Base.UsesFrontFacing) {
+               GLint idx = slot + extra_decls;
+               stfp->input_semantic_name[idx] = TGSI_SEMANTIC_FACE;
+               stfp->input_semantic_index[idx] = 0;
+               interpMode[idx] = TGSI_INTERPOLATE_CONSTANT;
+               input_flags[idx] = stfp->Base.Base.InputFlags[attr];
+               ++extra_decls;
+            }
+            if (stfp->Base.UsesPointCoord) {
+               GLint idx = slot + extra_decls;
+               stfp->input_semantic_name[idx] = TGSI_SEMANTIC_GENERIC;
+               stfp->input_semantic_index[idx] = num_generic++;
+               interpMode[idx] = TGSI_INTERPOLATE_PERSPECTIVE;
+               input_flags[idx] = stfp->Base.Base.InputFlags[attr];
+               ++extra_decls;
+            }
+            fs_num_inputs += extra_decls - 1;
+            continue;
+         }
             break;
          case FRAG_ATTRIB_TEX0:
          case FRAG_ATTRIB_TEX1: