Mesa (mesa_7_5_branch): gallium: more fog extraction fixes

Zack Rusin zack at kemper.freedesktop.org
Tue Jul 7 01:31:54 UTC 2009


Module: Mesa
Branch: mesa_7_5_branch
Commit: a4d952358d8fd0f9d135c91c37969acdcf394f0a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a4d952358d8fd0f9d135c91c37969acdcf394f0a

Author: Zack Rusin <zackr at vmware.com>
Date:   Mon Jul  6 21:33:56 2009 -0400

gallium: more fog extraction fixes

fix the cases when fog coord/front face/point coord are used in the same
shader.

---

 src/mesa/state_tracker/st_atom_shader.c  |   21 ++++++------------
 src/mesa/state_tracker/st_mesa_to_tgsi.c |    9 +++++++-
 src/mesa/state_tracker/st_program.c      |   34 +++++++++++++++++++++--------
 3 files changed, 39 insertions(+), 25 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
index c02ccc3..299aa76 100644
--- a/src/mesa/state_tracker/st_atom_shader.c
+++ b/src/mesa/state_tracker/st_atom_shader.c
@@ -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 {
diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c
index 3140ebe..8aef3fc 100644
--- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
+++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
@@ -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 */
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 9a346fb..18d1046 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -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:




More information about the mesa-commit mailing list