r600/sb: handle scratch mem reads on r600

On r600 we use the scratch mem with read/read_ind, in that case
sb should track the rw_gpr as a dst instead of a src.

This stops the whole shader being optimised out.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie
2018-02-06 14:17:46 +10:00
parent cd34deb585
commit 22fc5eff80
2 changed files with 24 additions and 6 deletions

View File

@@ -778,8 +778,15 @@ void bc_finalizer::finalize_cf(cf_node* c) {
int reg = -1;
unsigned mask = 0;
for (unsigned chan = 0; chan < 4; ++chan) {
value *v = c->src[chan];
value *v;
if (ctx.hw_class == HW_CLASS_R600 && c->bc.op == CF_OP_MEM_SCRATCH &&
(c->bc.type == 2 || c->bc.type == 3))
v = c->dst[chan];
else
v = c->src[chan];
if (!v || v->is_undef())
continue;

View File

@@ -832,12 +832,23 @@ int bc_parser::prepare_ir() {
do {
c->src.resize(4);
for(int s = 0; s < 4; ++s) {
if (c->bc.comp_mask & (1 << s))
c->src[s] =
if (ctx.hw_class == HW_CLASS_R600 && c->bc.op == CF_OP_MEM_SCRATCH &&
(c->bc.type == 2 || c->bc.type == 3)) {
c->dst.resize(4);
for(int s = 0; s < 4; ++s) {
if (c->bc.comp_mask & (1 << s))
c->dst[s] =
sh->get_gpr_value(true, c->bc.rw_gpr, s, false);
}
} else {
c->src.resize(4);
for(int s = 0; s < 4; ++s) {
if (c->bc.comp_mask & (1 << s))
c->src[s] =
sh->get_gpr_value(true, c->bc.rw_gpr, s, false);
}
}
if (((flags & CF_RAT) || (!(flags & CF_STRM))) && (c->bc.type & 1)) { // indexed write