r600g/sb: add support for multiple streams to SB backend

This adds a peephole and removes an assert that isn't
actually valid with some of the stream emit instructions.

Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie 2015-07-09 16:36:16 +10:00
parent d503bbbf30
commit 3d497e0d91
2 changed files with 15 additions and 5 deletions

View file

@ -764,8 +764,6 @@ void bc_finalizer::finalize_cf(cf_node* c) {
mask |= (1 << chan);
}
assert(reg >= 0 && mask);
if (reg >= 0)
update_ngpr(reg);

View file

@ -757,10 +757,22 @@ int bc_parser::prepare_ir() {
c->bc.end_of_program = eop;
} else if (flags & CF_EMIT) {
c->flags |= NF_DONT_KILL | NF_DONT_HOIST | NF_DONT_MOVE;
/* quick peephole */
cf_node *prev = static_cast<cf_node *>(c->prev);
if (c->bc.op == CF_OP_CUT_VERTEX &&
prev && prev->is_valid() &&
prev->bc.op == CF_OP_EMIT_VERTEX &&
c->bc.count == prev->bc.count) {
prev->bc.set_op(CF_OP_EMIT_CUT_VERTEX);
prev->bc.end_of_program = c->bc.end_of_program;
c->remove();
}
else {
c->flags |= NF_DONT_KILL | NF_DONT_HOIST | NF_DONT_MOVE;
c->src.push_back(sh->get_special_value(SV_GEOMETRY_EMIT));
c->dst.push_back(sh->get_special_value(SV_GEOMETRY_EMIT));
c->src.push_back(sh->get_special_value(SV_GEOMETRY_EMIT));
c->dst.push_back(sh->get_special_value(SV_GEOMETRY_EMIT));
}
}
}