mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
r600g/sb: Add dependency tracking for scratch ops
Signed-off-by: Glenn Kennard <glenn.kennard@gmail.com> Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
a100d906b2
commit
cd34deb585
8 changed files with 22 additions and 4 deletions
|
|
@ -78,6 +78,7 @@ struct r600_shader {
|
|||
boolean uses_kill;
|
||||
boolean fs_write_all;
|
||||
boolean two_side;
|
||||
boolean needs_scratch_space;
|
||||
/* Number of color outputs in the TGSI shader,
|
||||
* sometimes it could be higher than nr_cbufs (bug?).
|
||||
* Also with writes_all property on eg+ it will be set to max CB number */
|
||||
|
|
|
|||
|
|
@ -311,7 +311,7 @@ void bc_finalizer::finalize_alu_group(alu_group_node* g, node *prev_node) {
|
|||
value *d = n->dst.empty() ? NULL : n->dst[0];
|
||||
|
||||
if (d && d->is_special_reg()) {
|
||||
assert((n->bc.op_ptr->flags & AF_MOVA) || d->is_geometry_emit() || d->is_lds_oq() || d->is_lds_access());
|
||||
assert((n->bc.op_ptr->flags & AF_MOVA) || d->is_geometry_emit() || d->is_lds_oq() || d->is_lds_access() || d->is_scratch());
|
||||
d = NULL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -725,6 +725,11 @@ int bc_parser::prepare_fetch_clause(cf_node *cf) {
|
|||
n->src.push_back(get_cf_index_value(n->bc.resource_index_mode == V_SQ_CF_INDEX_1));
|
||||
}
|
||||
}
|
||||
|
||||
if (n->bc.op == FETCH_OP_READ_SCRATCH) {
|
||||
n->src.push_back(sh->get_special_value(SV_SCRATCH));
|
||||
n->dst.push_back(sh->get_special_value(SV_SCRATCH));
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -855,6 +860,10 @@ int bc_parser::prepare_ir() {
|
|||
c->flags |= NF_DONT_KILL;
|
||||
}
|
||||
}
|
||||
else if (c->bc.op == CF_OP_MEM_SCRATCH) {
|
||||
c->src.push_back(sh->get_special_value(SV_SCRATCH));
|
||||
c->dst.push_back(sh->get_special_value(SV_SCRATCH));
|
||||
}
|
||||
|
||||
if (!burst_count--)
|
||||
break;
|
||||
|
|
@ -889,6 +898,9 @@ int bc_parser::prepare_ir() {
|
|||
c->src.push_back(sh->get_special_value(SV_GEOMETRY_EMIT));
|
||||
c->dst.push_back(sh->get_special_value(SV_GEOMETRY_EMIT));
|
||||
}
|
||||
} else if (c->bc.op == CF_OP_WAIT_ACK) {
|
||||
c->src.push_back(sh->get_special_value(SV_SCRATCH));
|
||||
c->dst.push_back(sh->get_special_value(SV_SCRATCH));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@ int r600_sb_bytecode_process(struct r600_context *rctx,
|
|||
|
||||
// if conversion breaks the dependency tracking between CF_EMIT ops when it removes
|
||||
// the phi nodes for SV_GEOMETRY_EMIT. Just disable it for GS
|
||||
if (sh->target != TARGET_GS && sh->target != TARGET_HS)
|
||||
if ((sh->target != TARGET_GS && sh->target != TARGET_HS) || pshader->needs_scratch_space)
|
||||
SB_RUN_PASS(if_conversion, 1);
|
||||
|
||||
// if_conversion breaks info about uses, but next pass (peephole)
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ enum special_regs {
|
|||
SV_LDS_RW,
|
||||
SV_LDS_OQA,
|
||||
SV_LDS_OQB,
|
||||
SV_SCRATCH
|
||||
};
|
||||
|
||||
class node;
|
||||
|
|
@ -517,6 +518,9 @@ public:
|
|||
v = v->gvn_source;
|
||||
return v;
|
||||
}
|
||||
bool is_scratch() {
|
||||
return is_special_reg() && select == sel_chan(SV_SCRATCH, 0);
|
||||
}
|
||||
|
||||
bool is_float_0_or_1() {
|
||||
value *v = gvalue();
|
||||
|
|
|
|||
|
|
@ -708,7 +708,7 @@ void ra_split::split_vec(vvec &vv, vvec &v1, vvec &v2, bool allow_swz) {
|
|||
|
||||
assert(!o->is_dead());
|
||||
|
||||
if (o->is_undef() || o->is_geometry_emit())
|
||||
if (o->is_undef() || o->is_geometry_emit() || o->is_scratch())
|
||||
continue;
|
||||
|
||||
if (allow_swz && o->is_float_0_or_1())
|
||||
|
|
|
|||
|
|
@ -1670,7 +1670,7 @@ unsigned post_scheduler::try_add_instruction(node *n) {
|
|||
value *d = a->dst.empty() ? NULL : a->dst[0];
|
||||
|
||||
if (d && d->is_special_reg()) {
|
||||
assert((a->bc.op_ptr->flags & AF_MOVA) || d->is_geometry_emit() || d->is_lds_oq() || d->is_lds_access());
|
||||
assert((a->bc.op_ptr->flags & AF_MOVA) || d->is_geometry_emit() || d->is_lds_oq() || d->is_lds_access() || d->is_scratch());
|
||||
d = NULL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ sb_ostream& operator << (sb_ostream &o, value &v) {
|
|||
case SV_LDS_RW: o << "LDS_RW"; break;
|
||||
case SV_LDS_OQA: o << "LDS_OQA"; break;
|
||||
case SV_LDS_OQB: o << "LDS_OQB"; break;
|
||||
case SV_SCRATCH: o << "SCRATCH"; break;
|
||||
default: o << "???specialreg"; break;
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue