freedreno: fix bogus IMM const reg index
authorRob Clark <robclark@freedesktop.org>
Wed, 24 Apr 2013 21:45:00 +0000 (17:45 -0400)
committerRob Clark <robclark@freedesktop.org>
Thu, 25 Apr 2013 01:09:46 +0000 (21:09 -0400)
We were assigning incorrect const register for immediates, and
potentially writing immediate const to the wrong location.  This fixes
an incorrect-rendering bug with xonotic.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/freedreno_compiler.c
src/gallium/drivers/freedreno/freedreno_state.c

index b9cac8f122808541087dcce37d4c2a92210b382a..1a596f50f6b345f6bac86ca38abc345248ea3d9e 100644 (file)
@@ -201,8 +201,8 @@ compile_init(struct fd_compile_context *ctx, struct fd_program_stateobj *prog,
                                ctx->input_export_idx[decl->Range.First] =
                                                semantic_idx(&decl->Semantic);
                        }
-                       ctx->num_regs[decl->Declaration.File] +=
-                                       1 + decl->Range.Last - decl->Range.First;
+                       ctx->num_regs[decl->Declaration.File] =
+                                       MAX2(ctx->num_regs[decl->Declaration.File], decl->Range.Last + 1);
                        break;
                }
                case TGSI_TOKEN_TYPE_IMMEDIATE: {
index 070a0429a0c6ca523de7be6c1a17aebe84cbbc92..064a2faf78724d70e43b2715f23438af0110e719 100644 (file)
@@ -279,7 +279,7 @@ emit_constants(struct fd_ringbuffer *ring, uint32_t base,
        if (shader) {
                for (i = 0; i < shader->num_immediates; i++) {
                        OUT_PKT3(ring, CP_SET_CONSTANT, 5);
-                       OUT_RING(ring, base);
+                       OUT_RING(ring, start_base + (4 * (shader->first_immediate + i)));
                        OUT_RING(ring, shader->immediates[i].val[0]);
                        OUT_RING(ring, shader->immediates[i].val[1]);
                        OUT_RING(ring, shader->immediates[i].val[2]);