[Mesa-stable] [PATCH] nv50/ir: fix MUL ConstantFolding with saturation
Karol Herbst
karolherbst at gmail.com
Sun Jul 30 15:51:22 UTC 2017
For mul(a, +-1) codegen could end up generating OP_MOV with a saturation flag
set which we got simply ignored.
Adding an assert for detecting more of such issues.
Fixes wrongly rendered water in Hitman Absolution running under wine.
Also a few shaders in Mad Max and Alien Isolation produce such MOVs.
CC: <mesa-stable at lists.freedesktop.org>
Signed-off-by: Karol Herbst <karolherbst at gmail.com>
---
src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp | 1 +
src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 4 ++++
2 files changed, 5 insertions(+)
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
index 14c00bd187..58594f02c7 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
@@ -2006,6 +2006,7 @@ CodeEmitterNVC0::getSRegEncoding(const ValueRef& ref)
void
CodeEmitterNVC0::emitMOV(const Instruction *i)
{
+ assert(!i->saturate);
if (i->def(0).getFile() == FILE_PREDICATE) {
if (i->src(0).getFile() == FILE_GPR) {
code[0] = 0xfc01c003;
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
index dac3e6f814..38fb542b74 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
@@ -1003,6 +1003,10 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
}
if (i->op != OP_CVT)
i->src(0).mod = 0;
+ if (i->op == OP_MOV && i->saturate) {
+ i->saturate = 0;
+ i->op = OP_SAT;
+ }
i->setSrc(1, NULL);
} else
if (!i->postFactor && (imm0.isInteger(2) || imm0.isInteger(-2))) {
--
2.13.3
More information about the mesa-stable
mailing list