Merge branch 'mesa_7_6_branch' into mesa_7_7_branch
[mesa.git] / src / mesa / state_tracker / st_mesa_to_tgsi.c
index bda45c01882386d35f10b6ecc1f27e66c9d4c744..bd94c9d79e8054afff6a9bede8f014ed49b80dbb 100644 (file)
@@ -151,7 +151,7 @@ dst_register( struct st_translate *t,
       return t->address[index];
 
    default:
-      assert( 0 );
+      debug_assert( 0 );
       return ureg_dst_undef();
    }
 }
@@ -173,8 +173,9 @@ src_register( struct st_translate *t,
 
    case PROGRAM_STATE_VAR:
    case PROGRAM_NAMED_PARAM:
+   case PROGRAM_ENV_PARAM:
    case PROGRAM_UNIFORM:
-   case PROGRAM_CONSTANT:
+   case PROGRAM_CONSTANT:       /* ie, immediate */
       return t->constants[index];
 
    case PROGRAM_INPUT:
@@ -187,7 +188,7 @@ src_register( struct st_translate *t,
       return ureg_src(t->address[index]);
 
    default:
-      assert( 0 );
+      debug_assert( 0 );
       return ureg_src_undef();
    }
 }
@@ -216,7 +217,7 @@ translate_texture_target( GLuint textarget,
    case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_CUBE;
    case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_RECT;
    default:
-      assert( 0 );
+      debug_assert( 0 );
       return TGSI_TEXTURE_1D;
    }
 }
@@ -277,7 +278,7 @@ static struct ureg_src swizzle_4v( struct ureg_src src,
 
 
 /**
- * Translate SWZ instructions into a single MAD.  EG:
+ * Translate a SWZ instruction into a MOV, MUL or MAD instruction.  EG:
  *
  *   SWZ dst, src.x-y10 
  * 
@@ -386,7 +387,7 @@ static void emit_swz( struct st_translate *t,
                 swizzle_4v( imm, add_swizzle ) );
    }
    else {
-      assert(0);
+      debug_assert(0);
    }
 
 #undef IMM_ZERO
@@ -480,14 +481,6 @@ translate_opcode( unsigned op )
       return TGSI_OPCODE_MOV;
    case OPCODE_MUL:
       return TGSI_OPCODE_MUL;
-   case OPCODE_NOISE1:
-      return TGSI_OPCODE_NOISE1;
-   case OPCODE_NOISE2:
-      return TGSI_OPCODE_NOISE2;
-   case OPCODE_NOISE3:
-      return TGSI_OPCODE_NOISE3;
-   case OPCODE_NOISE4:
-      return TGSI_OPCODE_NOISE4;
    case OPCODE_NOP:
       return TGSI_OPCODE_NOP;
    case OPCODE_NRM3:
@@ -522,8 +515,6 @@ translate_opcode( unsigned op )
       return TGSI_OPCODE_SSG;
    case OPCODE_SUB:
       return TGSI_OPCODE_SUB;
-   case OPCODE_SWZ:
-      return TGSI_OPCODE_SWZ;
    case OPCODE_TEX:
       return TGSI_OPCODE_TEX;
    case OPCODE_TXB:
@@ -539,7 +530,7 @@ translate_opcode( unsigned op )
    case OPCODE_END:
       return TGSI_OPCODE_END;
    default:
-      assert( 0 );
+      debug_assert( 0 );
       return TGSI_OPCODE_NOP;
    }
 }
@@ -578,7 +569,7 @@ compile_instruction(
    case OPCODE_ELSE:
    case OPCODE_ENDLOOP:
    case OPCODE_IF:
-      assert(num_dst == 0);
+      debug_assert(num_dst == 0);
       ureg_label_insn( ureg,
                        translate_opcode( inst->Opcode ),
                        src, num_src,
@@ -615,6 +606,21 @@ compile_instruction(
                  src, num_src );
       break;
 
+   case OPCODE_NOISE1:
+   case OPCODE_NOISE2:
+   case OPCODE_NOISE3:
+   case OPCODE_NOISE4:
+      /* At some point, a motivated person could add a better
+       * implementation of noise.  Currently not even the nvidia
+       * binary drivers do anything more than this.  In any case, the
+       * place to do this is in the GL state tracker, not the poor
+       * driver.
+       */
+      ureg_MOV( ureg, dst[0], ureg_imm1f(ureg, 0.5) );
+      break;
+                
+
+
    default:
       ureg_insn( ureg, 
                  translate_opcode( inst->Opcode ), 
@@ -722,7 +728,7 @@ st_translate_mesa_program(
 
    ureg = t->ureg;
 
-   _mesa_print_program(program);
+   /*_mesa_print_program(program);*/
 
    /*
     * Declare input attributes.
@@ -761,7 +767,7 @@ st_translate_mesa_program(
                                               outputSemanticIndex[i] );
             break;
          default:
-            assert(0);
+            debug_assert(0);
             return 0;
          }
       }
@@ -781,7 +787,7 @@ st_translate_mesa_program(
    /* Declare address register.
     */
    if (program->NumAddressRegs > 0) {
-      assert( program->NumAddressRegs == 1 );
+      debug_assert( program->NumAddressRegs == 1 );
       t->address[0] = ureg_DECL_address( ureg );
    }
 
@@ -864,8 +870,19 @@ out:
    if (!tokens) {
       debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__);
       _mesa_print_program(program);
-      assert(0);
+      debug_assert(0);
    }
 
    return tokens;
 }
+
+
+/**
+ * Tokens cannot be free with _mesa_free otherwise the builtin gallium
+ * malloc debugging will get confused.
+ */
+void
+st_free_tokens(const struct tgsi_token *tokens)
+{
+   FREE((void *)tokens);
+}