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
Signed-off-by: Gert Wollny <gw.foss...@gmail.com>
---
* An additional note: sb seems to completely ignore the existence of ALU_EXT. 
This is probably not a problem, since only additional cache lines are 
defined with it and sb re-schedules everything anyway, but it could provide
an opportunity for more optimisation if it were possible to emit it. 

* I have no write access to mesa-git.

 src/gallium/drivers/r600/r600_shader.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_shader.c 
b/src/gallium/drivers/r600/r600_shader.c
index b49c79c040..7a8eea77d7 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -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);
 
-- 
2.16.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to