r600: Take ALU_EXTENDED into account when evaluating jump offsets
authorGert Wollny <gw.fossdev@gmail.com>
Sat, 24 Feb 2018 10:31:22 +0000 (11:31 +0100)
committerDave Airlie <airlied@redhat.com>
Mon, 26 Feb 2018 00:29:48 +0000 (10:29 +1000)
ALU_EXTENDED needs 4 DWORDS instead of the usual 2, hence if the last ALU
clause within a IF-JUMP or ELSE branch is ALU_EXTENDED the target jump
offset needs to be adjusted accordingly.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104654
Cc: <mesa-stable@lists.freedesktop.org>
Signed-off-by: Gert Wollny <gw.fossdev@gmail.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_shader.c

index b49c79c0404a2ba456adfc7c071d7a19ce214c06..9f6780f219efac6ab95f2b400629957d10bcf11e 100644 (file)
@@ -10409,17 +10409,22 @@ static int tgsi_else(struct r600_shader_ctx *ctx)
 
 static int tgsi_endif(struct r600_shader_ctx *ctx)
 {
+       int offset = 2;
        pops(ctx, 1);
        if (ctx->bc->fc_stack[ctx->bc->fc_sp - 1].type != FC_IF) {
                R600_ERR("if/endif unbalanced in shader\n");
                return -1;
        }
 
+       /* ALU_EXTENDED needs 4 DWords instead of two, adjust jump target offset accordingly */
+       if (ctx->bc->cf_last->eg_alu_extended)
+                       offset += 2;
+
        if (ctx->bc->fc_stack[ctx->bc->fc_sp - 1].mid == NULL) {
-               ctx->bc->fc_stack[ctx->bc->fc_sp - 1].start->cf_addr = ctx->bc->cf_last->id + 2;
+               ctx->bc->fc_stack[ctx->bc->fc_sp - 1].start->cf_addr = ctx->bc->cf_last->id + offset;
                ctx->bc->fc_stack[ctx->bc->fc_sp - 1].start->pop_count = 1;
        } else {
-               ctx->bc->fc_stack[ctx->bc->fc_sp - 1].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
+               ctx->bc->fc_stack[ctx->bc->fc_sp - 1].mid[0]->cf_addr = ctx->bc->cf_last->id + offset;
        }
        fc_poplevel(ctx);