mesa: check dst reg in _mesa_find_free_register()
authorBrian Paul <brianp@vmware.com>
Fri, 11 Dec 2009 16:16:25 +0000 (09:16 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 11 Dec 2009 16:16:27 +0000 (09:16 -0700)
If a register was only being used as a destination (as will happen when
generated condition-codes) we missed its use.  So we'd errantly return
a register index that was really in-use, not free.

Fixes bug 25579.

src/mesa/shader/program.c

index 2cd6eb8a389d556ac7c8bae3ce18e31cff1a6cde..18d4ef97597d0af7259de9bfcaa6ba25bfbfe538 100644 (file)
@@ -813,9 +813,17 @@ _mesa_find_free_register(const struct gl_program *prog, GLuint regFile)
       const struct prog_instruction *inst = prog->Instructions + i;
       const GLuint n = _mesa_num_inst_src_regs(inst->Opcode);
 
-      for (k = 0; k < n; k++) {
-         if (inst->SrcReg[k].File == regFile) {
-            used[inst->SrcReg[k].Index] = GL_TRUE;
+      /* check dst reg first */
+      if (inst->DstReg.File == regFile) {
+         used[inst->DstReg.Index] = GL_TRUE;
+      }
+      else {
+         /* check src regs otherwise */
+         for (k = 0; k < n; k++) {
+            if (inst->SrcReg[k].File == regFile) {
+               used[inst->SrcReg[k].Index] = GL_TRUE;
+               break;
+            }
          }
       }
    }