diff options
author | Rob Clark <[email protected]> | 2019-02-11 11:39:43 -0500 |
---|---|---|
committer | Rob Clark <[email protected]> | 2019-02-16 16:28:00 -0500 |
commit | c1a27ba9baf7c1d6ce15a3c9b2d9cb1eafa72918 (patch) | |
tree | f13746e33871f7ea0d9d66e5a936e30457bac3e9 /src/freedreno/ir3/ir3_cp.c | |
parent | 947848524dbc145400a960347079286ffa84c58a (diff) |
freedreno/ir3: HIGH reg w/a for a6xx
It seems like some instructions (noticed this w/ cat3), cannot read HIGH
regs.. cat1 (mov/cov) can, and possibly some/all of cat2.
The blob seems to stick w/ an extra mov into low regs. So lets do the
same.
This fixes WGID on a6xx, which unsurprisingly is related to a lot of
deqp compute fails.
Signed-off-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/freedreno/ir3/ir3_cp.c')
-rw-r--r-- | src/freedreno/ir3/ir3_cp.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/freedreno/ir3/ir3_cp.c b/src/freedreno/ir3/ir3_cp.c index e8e8cc311e3..76e13a05bf6 100644 --- a/src/freedreno/ir3/ir3_cp.c +++ b/src/freedreno/ir3/ir3_cp.c @@ -27,6 +27,7 @@ #include <math.h> #include "ir3.h" +#include "ir3_compiler.h" #include "ir3_shader.h" /* @@ -88,6 +89,12 @@ static bool valid_flags(struct ir3_instruction *instr, unsigned n, unsigned flags) { unsigned valid_flags; + + if ((flags & IR3_REG_HIGH) && + (opc_cat(instr->opc) > 1) && + (instr->block->shader->compiler->gpu_id >= 600)) + return false; + flags = cp_flags(flags); /* If destination is indirect, then source cannot be.. at least @@ -243,6 +250,7 @@ static void combine_flags(unsigned *dstflags, struct ir3_instruction *src) *dstflags |= srcflags & IR3_REG_IMMED; *dstflags |= srcflags & IR3_REG_RELATIV; *dstflags |= srcflags & IR3_REG_ARRAY; + *dstflags |= srcflags & IR3_REG_HIGH; /* if src of the src is boolean we can drop the (abs) since we know * the source value is already a postitive integer. This cleans |