r300/compiler: fix buffer underflow when setting SEM_WAIT on last instruction
authorMarek Olšák <maraeo@gmail.com>
Wed, 4 Jan 2012 04:18:58 +0000 (05:18 +0100)
committerMarek Olšák <maraeo@gmail.com>
Thu, 5 Jan 2012 17:29:11 +0000 (18:29 +0100)
Do it after we check whether inst_end != -1.
Also move the code structure at the beginning of r300_fragment_shader_code
to detect underflows easily with valgrind.

src/gallium/drivers/r300/compiler/r500_fragprog_emit.c
src/gallium/drivers/r300/r300_fs.h

index bfd4aa82b95ed396306c26f87ed61e3ad771c649..87b96d15079b1af32d8437a3ec3062d925f6f4d3 100644 (file)
@@ -650,9 +650,6 @@ void r500BuildFragmentProgramHwCode(struct radeon_compiler *c, void *user)
                }
        }
 
-       /* Make sure TEX_SEM_WAIT is set on the last instruction */
-       code->inst[code->inst_end].inst0 |= R500_INST_TEX_SEM_WAIT;
-
        if (code->max_temp_idx >= compiler->Base.max_temp_regs)
                rc_error(&compiler->Base, "Too many hardware temporaries used");
 
@@ -674,6 +671,9 @@ void r500BuildFragmentProgramHwCode(struct radeon_compiler *c, void *user)
                code->inst[ip].inst0 = R500_INST_TYPE_OUT | R500_INST_TEX_SEM_WAIT;
        }
 
+       /* Make sure TEX_SEM_WAIT is set on the last instruction */
+       code->inst[code->inst_end].inst0 |= R500_INST_TEX_SEM_WAIT;
+
        /* Enable full flow control mode if we are using loops or have if
         * statements nested at least four deep. */
        if (s.MaxBranchDepth >= 4 || s.LoopsReserved > 0) {
index 45c9e8801c3d1cbbe965061a241ab691ae3fa725..39eb73da65d20071d136a0fafa9266ca57aed67a 100644 (file)
@@ -31,6 +31,7 @@
 #include "r300_shader_semantics.h"
 
 struct r300_fragment_shader_code {
+    struct rX00_fragment_program_code code;
     struct tgsi_shader_info info;
     struct r300_shader_semantics inputs;
 
@@ -48,7 +49,6 @@ struct r300_fragment_shader_code {
     uint32_t us_out_w;          /* R300_US_W_FMT:     0x46b4 */
 
     struct r300_fragment_program_external_state compare_state;
-    struct rX00_fragment_program_code code;
 
     unsigned cb_code_size;
     uint32_t *cb_code;