Mesa (master): nvc0/ir: only merge emit/restart for identical streams
Ilia Mirkin
imirkin at kemper.freedesktop.org
Tue Jul 1 15:39:13 UTC 2014
Module: Mesa
Branch: master
Commit: 2f2467cb23ce19770c95ce1f004dc11750dffc6d
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2f2467cb23ce19770c95ce1f004dc11750dffc6d
Author: Ilia Mirkin <imirkin at alum.mit.edu>
Date: Fri Jun 27 22:00:57 2014 -0400
nvc0/ir: only merge emit/restart for identical streams
Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
---
.../drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
index fb9bed4..8f26645 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
@@ -1464,14 +1464,21 @@ NVC0LoweringPass::handleEXPORT(Instruction *i)
bool
NVC0LoweringPass::handleOUT(Instruction *i)
{
- if (i->op == OP_RESTART && i->prev && i->prev->op == OP_EMIT) {
+ Instruction *prev = i->prev;
+ ImmediateValue stream, prevStream;
+
+ // Only merge if the stream ids match. Also, note that the previous
+ // instruction would have already been lowered, so we take arg1 from it.
+ if (i->op == OP_RESTART && prev && prev->op == OP_EMIT &&
+ i->src(0).getImmediate(stream) &&
+ prev->src(1).getImmediate(prevStream) &&
+ stream.reg.data.u32 == prevStream.reg.data.u32) {
i->prev->subOp = NV50_IR_SUBOP_EMIT_RESTART;
delete_Instruction(prog, i);
} else {
assert(gpEmitAddress);
i->setDef(0, gpEmitAddress);
- if (i->srcExists(0))
- i->setSrc(1, i->getSrc(0));
+ i->setSrc(1, i->getSrc(0));
i->setSrc(0, gpEmitAddress);
}
return true;
More information about the mesa-commit
mailing list