Mesa (master): r300/compiler: Fix bug in rc_find_free_temporary

Nicolai Hähnle nh at kemper.freedesktop.org
Wed Aug 26 23:51:37 UTC 2009


Module: Mesa
Branch: master
Commit: 2114acb044b1d8860350a9f14890fce1e2f315f0
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2114acb044b1d8860350a9f14890fce1e2f315f0

Author: Nicolai Hähnle <nhaehnle at gmail.com>
Date:   Wed Aug 26 22:53:24 2009 +0200

r300/compiler: Fix bug in rc_find_free_temporary

Find used temporaries even if they are only written to in dead code.
This fixes a bug in the NQSSADCE stage.

Signed-off-by: Nicolai Hähnle <nhaehnle at gmail.com>

---

 .../drivers/dri/r300/compiler/radeon_program.c     |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_program.c b/src/mesa/drivers/dri/r300/compiler/radeon_program.c
index 208d3b9..bbbf0dd 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_program.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_program.c
@@ -79,13 +79,19 @@ GLint rc_find_free_temporary(struct radeon_compiler * c)
 
 	for (struct rc_instruction * rcinst = c->Program.Instructions.Next; rcinst != &c->Program.Instructions; rcinst = rcinst->Next) {
 		const struct prog_instruction *inst = &rcinst->I;
-		const GLuint n = _mesa_num_inst_src_regs(inst->Opcode);
+		const GLuint nsrc = _mesa_num_inst_src_regs(inst->Opcode);
+		const GLuint ndst = _mesa_num_inst_dst_regs(inst->Opcode);
 		GLuint k;
 
-		for (k = 0; k < n; k++) {
+		for (k = 0; k < nsrc; k++) {
 			if (inst->SrcReg[k].File == PROGRAM_TEMPORARY)
 				used[inst->SrcReg[k].Index] = GL_TRUE;
 		}
+
+		if (ndst) {
+			if (inst->DstReg.File == PROGRAM_TEMPORARY)
+				used[inst->DstReg.Index] = GL_TRUE;
+		}
 	}
 
 	for (i = 0; i < MAX_PROGRAM_TEMPS; i++) {




More information about the mesa-commit mailing list