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:
@@ -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;
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user