gallium: fix translation of extended swizzles, per-component negation
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 23 Jul 2008 15:56:20 +0000 (09:56 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 23 Jul 2008 15:56:20 +0000 (09:56 -0600)
src/mesa/state_tracker/st_mesa_to_tgsi.c

index 150545d..9029f12 100644 (file)
@@ -39,8 +39,6 @@
 #include "shader/prog_instruction.h"
 #include "shader/prog_parameter.h"
 
-#define TGSI_DEBUG 0
-
 
 /*
  * Map mesa register file to TGSI register file.
@@ -56,8 +54,8 @@ map_register_file(
       return TGSI_FILE_NULL;
    case PROGRAM_TEMPORARY:
       return TGSI_FILE_TEMPORARY;
-   //case PROGRAM_LOCAL_PARAM:
-   //case PROGRAM_ENV_PARAM:
+   /*case PROGRAM_LOCAL_PARAM:*/
+   /*case PROGRAM_ENV_PARAM:*/
 
       /* Because of the longstanding problem with mesa arb shaders
        * where constants, immediates and state variables are all
@@ -230,21 +228,27 @@ compile_instruction(
          outputMapping,
          immediateMapping);
 
-      for( j = 0; j < 4; j++ ) {
-         GLuint swz;
-
-         swz = GET_SWZ( inst->SrcReg[i].Swizzle, j );
-         if( swz > SWIZZLE_W ) {
-            tgsi_util_set_src_register_extswizzle(
-               &fullsrc->SrcRegisterExtSwz,
-               swz,
-               j );
+      /* swizzle (ext swizzle also depends on negation) */
+      {
+         GLuint swz[4];
+         GLboolean extended = (inst->SrcReg[i].NegateBase != NEGATE_NONE &&
+                               inst->SrcReg[i].NegateBase != NEGATE_XYZW);
+         for( j = 0; j < 4; j++ ) {
+            swz[j] = GET_SWZ( inst->SrcReg[i].Swizzle, j );
+            if (swz[j] > SWIZZLE_W)
+               extended = GL_TRUE;
+         }
+         if (extended) {
+            for (j = 0; j < 4; j++) {
+               tgsi_util_set_src_register_extswizzle(&fullsrc->SrcRegisterExtSwz,
+                                                     swz[j], j);
+            }
          }
          else {
-            tgsi_util_set_src_register_swizzle(
-               &fullsrc->SrcRegister,
-               swz,
-               j );
+            for (j = 0; j < 4; j++) {
+               tgsi_util_set_src_register_swizzle(&fullsrc->SrcRegister,
+                                                  swz[j], j);
+            }
          }
       }