From: Dave Airlie Date: Thu, 9 Jul 2015 06:36:16 +0000 (+1000) Subject: r600g/sb: add support for multiple streams to SB backend X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3d497e0d915df8b71cd845c2cfbc6703db313628;p=mesa.git 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 --- diff --git a/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp b/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp index dadee456a1f..522ff9d956e 100644 --- a/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp +++ b/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp @@ -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); diff --git a/src/gallium/drivers/r600/sb/sb_bc_parser.cpp b/src/gallium/drivers/r600/sb/sb_bc_parser.cpp index c4799270d9f..19bd0784a61 100644 --- a/src/gallium/drivers/r600/sb/sb_bc_parser.cpp +++ b/src/gallium/drivers/r600/sb/sb_bc_parser.cpp @@ -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(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)); + } } }