[Mesa-stable] [Mesa-dev] [PATCH] nv50/ir: fix MUL ConstantFolding with saturation
Tobias Klausmann
tobias.johannes.klausmann at mni.thm.de
Sun Jul 30 16:37:19 UTC 2017
Looks good to me!
Reviewed-by: Tobias Klausmann <tobias.johannes.klausmann at mni.thm.de>
On 7/30/17 5:51 PM, Karol Herbst wrote:
> 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))) {
More information about the mesa-stable
mailing list