From 45eef9af03639a409ef54b136bb4902b9825864b Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 30 Nov 2016 16:43:42 -0500 Subject: [PATCH] freedreno/a5xx: fix negative branches Looks like immed branch offset size increased again.. making what we think is a small negative number look to hw like a huge positive number. And things go badly when shader tries to jump to hyperspace. Signed-off-by: Rob Clark --- src/gallium/drivers/freedreno/ir3/instr-a3xx.h | 3 +++ src/gallium/drivers/freedreno/ir3/ir3.c | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/freedreno/ir3/instr-a3xx.h b/src/gallium/drivers/freedreno/ir3/instr-a3xx.h index 87083fd1e81..0d369b605f7 100644 --- a/src/gallium/drivers/freedreno/ir3/instr-a3xx.h +++ b/src/gallium/drivers/freedreno/ir3/instr-a3xx.h @@ -296,6 +296,9 @@ typedef struct PACKED { int32_t immed : 20; uint32_t dummy1 : 12; } a4xx; + struct PACKED { + uint32_t immed : 32; + } a5xx; }; /* dword1: */ diff --git a/src/gallium/drivers/freedreno/ir3/ir3.c b/src/gallium/drivers/freedreno/ir3/ir3.c index c0a39d70def..7c925ee7cb0 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3.c +++ b/src/gallium/drivers/freedreno/ir3/ir3.c @@ -129,7 +129,9 @@ static int emit_cat0(struct ir3_instruction *instr, void *ptr, { instr_cat0_t *cat0 = ptr; - if (info->gpu_id >= 400) { + if (info->gpu_id >= 500) { + cat0->a5xx.immed = instr->cat0.immed; + } else if (info->gpu_id >= 400) { cat0->a4xx.immed = instr->cat0.immed; } else { cat0->a3xx.immed = instr->cat0.immed;