[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