Mesa (mesa_7_5_branch): gallium: fix the front face semantics

Zack Rusin zack at kemper.freedesktop.org
Wed Jul 1 14:42:54 UTC 2009


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

Author: Zack Rusin <zack at kde.org>
Date:   Wed Jul  1 10:42:58 2009 -0400

gallium: fix the front face semantics

mesa allocates both frontface and pointcoord registers within the fog
coordinate register, by using swizzling. to make it cleaner and easier
for drivers we want each of them in its own register. so when doing
compilation from the mesa IR to tgsi allocate new registers for both
and add new semantics to the respective declarations.

---

 src/gallium/drivers/softpipe/sp_setup.c         |   27 ++++++++++------------
 src/gallium/drivers/softpipe/sp_state_derived.c |    1 +
 src/gallium/include/pipe/p_shader_tokens.h      |    3 +-
 src/mesa/state_tracker/st_atom_shader.c         |   19 ++++++++++++++-
 src/mesa/state_tracker/st_mesa_to_tgsi.c        |   23 ++++++++++++++++++-
 src/mesa/state_tracker/st_program.c             |    7 +++++-
 6 files changed, 60 insertions(+), 20 deletions(-)

diff --git a/src/gallium/drivers/softpipe/sp_setup.c b/src/gallium/drivers/softpipe/sp_setup.c
index e5be652..1eb23cd 100644
--- a/src/gallium/drivers/softpipe/sp_setup.c
+++ b/src/gallium/drivers/softpipe/sp_setup.c
@@ -785,11 +785,10 @@ static void setup_tri_coefficients( struct setup_context *setup )
          assert(0);
       }
 
-      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FOG) {
-         /* FOG.y = front/back facing  XXX fix this */
-         setup->coef[fragSlot].a0[1] = 1.0f - setup->quad.input.facing;
-         setup->coef[fragSlot].dadx[1] = 0.0;
-         setup->coef[fragSlot].dady[1] = 0.0;
+      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FACE) {
+         setup->coef[fragSlot].a0[0] = 1.0f - setup->quad.input.facing;
+         setup->coef[fragSlot].dadx[0] = 0.0;
+         setup->coef[fragSlot].dady[0] = 0.0;
       }
    }
 }
@@ -1096,11 +1095,10 @@ setup_line_coefficients(struct setup_context *setup,
          assert(0);
       }
 
-      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FOG) {
-         /* FOG.y = front/back facing  XXX fix this */
-         setup->coef[fragSlot].a0[1] = 1.0f - setup->quad.input.facing;
-         setup->coef[fragSlot].dadx[1] = 0.0;
-         setup->coef[fragSlot].dady[1] = 0.0;
+      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FACE) {
+         setup->coef[fragSlot].a0[0] = 1.0f - setup->quad.input.facing;
+         setup->coef[fragSlot].dadx[0] = 0.0;
+         setup->coef[fragSlot].dady[0] = 0.0;
       }
    }
    return TRUE;
@@ -1342,11 +1340,10 @@ setup_point( struct setup_context *setup,
          assert(0);
       }
 
-      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FOG) {
-         /* FOG.y = front/back facing  XXX fix this */
-         setup->coef[fragSlot].a0[1] = 1.0f - setup->quad.input.facing;
-         setup->coef[fragSlot].dadx[1] = 0.0;
-         setup->coef[fragSlot].dady[1] = 0.0;
+      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FACE) {
+         setup->coef[fragSlot].a0[0] = 1.0f - setup->quad.input.facing;
+         setup->coef[fragSlot].dadx[0] = 0.0;
+         setup->coef[fragSlot].dady[0] = 0.0;
       }
    }
 
diff --git a/src/gallium/drivers/softpipe/sp_state_derived.c b/src/gallium/drivers/softpipe/sp_state_derived.c
index 6b6a4c3..7555100 100644
--- a/src/gallium/drivers/softpipe/sp_state_derived.c
+++ b/src/gallium/drivers/softpipe/sp_state_derived.c
@@ -110,6 +110,7 @@ softpipe_get_vertex_info(struct softpipe_context *softpipe)
             break;
 
          case TGSI_SEMANTIC_GENERIC:
+         case TGSI_SEMANTIC_FACE:
             /* this includes texcoords and varying vars */
             src = draw_find_vs_output(softpipe->draw, TGSI_SEMANTIC_GENERIC,
                                       spfs->info.input_semantic_index[i]);
diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
index 4dafdd6..b00cfe3 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -131,7 +131,8 @@ struct tgsi_declaration_range
 #define TGSI_SEMANTIC_PSIZE    4
 #define TGSI_SEMANTIC_GENERIC  5
 #define TGSI_SEMANTIC_NORMAL   6
-#define TGSI_SEMANTIC_COUNT    7 /**< number of semantic values */
+#define TGSI_SEMANTIC_FACE     7
+#define TGSI_SEMANTIC_COUNT    8 /**< number of semantic values */
 
 struct tgsi_declaration_semantic
 {
diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
index ee649be..c02ccc3 100644
--- a/src/mesa/state_tracker/st_atom_shader.c
+++ b/src/mesa/state_tracker/st_atom_shader.c
@@ -137,8 +137,23 @@ 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++;
+               }
+               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 {
             stfp->input_to_slot[inAttr] = UNUSED;
diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c
index 43c9afc..3140ebe 100644
--- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
+++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
@@ -101,8 +101,10 @@ map_register_file(
  */
 static GLuint
 map_register_file_index(
+   GLuint procType,
    GLuint file,
    GLuint index,
+   GLuint *swizzle,
    const GLuint inputMapping[],
    const GLuint outputMapping[],
    const GLuint immediateMapping[],
@@ -110,6 +112,20 @@ map_register_file_index(
 {
    switch( file ) {
    case TGSI_FILE_INPUT:
+      if (procType == TGSI_PROCESSOR_FRAGMENT &&
+          index == FRAG_ATTRIB_FOGC) {
+         if (GET_SWZ(*swizzle, 0) == SWIZZLE_X) {
+            /* do nothing we're, ok */
+         } else if (GET_SWZ(*swizzle, 0) == SWIZZLE_Y) {
+            /* replace the swizzle with xxxx */
+            *swizzle = MAKE_SWIZZLE4(SWIZZLE_X,
+                                     SWIZZLE_X,
+                                     SWIZZLE_X,
+                                     SWIZZLE_X);
+         } else {
+            /* fixme: point coord */
+         }
+      }
       /* inputs are mapped according to the user-defined map */
       return inputMapping[index];
 
@@ -236,8 +252,10 @@ compile_instruction(
    fulldst = &fullinst->FullDstRegisters[0];
    fulldst->DstRegister.File = map_register_file( inst->DstReg.File, 0, NULL, GL_FALSE );
    fulldst->DstRegister.Index = map_register_file_index(
+      procType,
       fulldst->DstRegister.File,
       inst->DstReg.Index,
+      NULL,
       inputMapping,
       outputMapping,
       NULL,
@@ -246,6 +264,7 @@ compile_instruction(
 
    for (i = 0; i < fullinst->Instruction.NumSrcRegs; i++) {
       GLuint j;
+      GLuint swizzle = inst->SrcReg[i].Swizzle;
 
       fullsrc = &fullinst->FullSrcRegisters[i];
 
@@ -264,8 +283,10 @@ compile_instruction(
             immediateMapping,
             indirectAccess );
          fullsrc->SrcRegister.Index = map_register_file_index(
+            procType,
             fullsrc->SrcRegister.File,
             inst->SrcReg[i].Index,
+            &swizzle,
             inputMapping,
             outputMapping,
             immediateMapping,
@@ -278,7 +299,7 @@ compile_instruction(
          GLboolean extended = (inst->SrcReg[i].Negate != NEGATE_NONE &&
                                inst->SrcReg[i].Negate != NEGATE_XYZW);
          for( j = 0; j < 4; j++ ) {
-            swz[j] = GET_SWZ( inst->SrcReg[i].Swizzle, j );
+            swz[j] = GET_SWZ( swizzle, j );
             if (swz[j] > SWIZZLE_W)
                extended = GL_TRUE;
          }
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 72ca852..9a346fb 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -437,11 +437,16 @@ st_translate_fragment_program(struct st_context *st,
             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 {
                stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
                stfp->input_semantic_index[slot] = 0;
+               interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
 	    }
-            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
             break;
          case FRAG_ATTRIB_TEX0:
          case FRAG_ATTRIB_TEX1:




More information about the mesa-commit mailing list