Mesa (mesa_7_6_branch): mesa: check dst reg in _mesa_find_free_register()
Brian Paul
brianp at kemper.freedesktop.org
Fri Dec 11 16:20:40 UTC 2009
Module: Mesa
Branch: mesa_7_6_branch
Commit: 5076a4f53a2f34cc9116b45951037f639885c7a1
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5076a4f53a2f34cc9116b45951037f639885c7a1
Author: Brian Paul <brianp at vmware.com>
Date: Fri Dec 11 09:16:25 2009 -0700
mesa: check dst reg in _mesa_find_free_register()
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 | 14 +++++++++++---
1 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c
index 2cd6eb8..18d4ef9 100644
--- a/src/mesa/shader/program.c
+++ b/src/mesa/shader/program.c
@@ -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;
+ }
}
}
}
More information about the mesa-commit
mailing list