diff options
author | Dave Airlie <[email protected]> | 2015-07-09 16:36:16 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2015-09-02 15:55:47 +1000 |
commit | 3d497e0d915df8b71cd845c2cfbc6703db313628 (patch) | |
tree | e11074bd3e2ca9e03853058e155cedecdbd1f621 /src/gallium/drivers/r600/sb | |
parent | d503bbbf3082b5b301019721466d6fd2b41da03a (diff) |
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 <[email protected]>
Diffstat (limited to 'src/gallium/drivers/r600/sb')
-rw-r--r-- | src/gallium/drivers/r600/sb/sb_bc_finalize.cpp | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r600/sb/sb_bc_parser.cpp | 18 |
2 files changed, 15 insertions, 5 deletions
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<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)); + } } } |