glsl_to_tgsi: fix shaders with indirect addressing of temps
authorBryan Cain <bryancain3@gmail.com>
Tue, 3 May 2011 04:12:18 +0000 (23:12 -0500)
committerBryan Cain <bryancain3@gmail.com>
Mon, 1 Aug 2011 22:59:07 +0000 (17:59 -0500)
Fixes several Piglit tests, although it's a step backwards for optimization.

src/mesa/state_tracker/st_glsl_to_tgsi.cpp

index 4cb2f377e9840b896ec7e1ae2db222b022a2d9db..75ab9c5de7c572820dc796fd3448ca57b2028637 100644 (file)
@@ -485,7 +485,7 @@ glsl_to_tgsi_visitor::emit(ir_instruction *ir, unsigned op,
    else {
       for (i=0; i<3; i++) {
          if(inst->src[i].reladdr) {
-            switch(dst.file) {
+            switch(inst->src[i].file) {
             case PROGRAM_TEMPORARY:
                this->indirect_addr_temps = true;
                break;
@@ -3928,9 +3928,17 @@ get_mesa_program(struct gl_context *ctx,
 
    /* Perform optimizations on the instructions in the glsl_to_tgsi_visitor. */
    v->copy_propagate();
-   v->eliminate_dead_code();
-   v->merge_registers();
-   v->renumber_registers();
+   
+   /* FIXME: These passes to optimize temporary registers don't work when there
+    * is indirect addressing of the temporary register space.  We need proper 
+    * array support so that we don't have to give up these passes in every 
+    * shader that uses arrays.
+    */
+   if (!v->indirect_addr_temps) {
+      v->merge_registers();
+      v->eliminate_dead_code();
+      v->renumber_registers();
+   }
    
    /* Write the END instruction. */
    v->emit(NULL, TGSI_OPCODE_END);