Mesa (master): gv100/ir: set ftz bit on floating point operations

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 14 10:55:03 UTC 2020


Module: Mesa
Branch: master
Commit: 38e3cbb639174db71eea9edc2628e4e0b1696fbc
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=38e3cbb639174db71eea9edc2628e4e0b1696fbc

Author: Karol Herbst <kherbst at redhat.com>
Date:   Mon Jul 13 16:24:20 2020 +0200

gv100/ir: set ftz bit on floating point operations

Fixes Unigine Heavens ambient occlusion

Signed-off-by: Karol Herbst <kherbst at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5881>

---

 src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_gv100.cpp | 7 ++++++-
 src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h    | 3 ++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_gv100.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_gv100.cpp
index 953f082a06a..644d4928327 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_gv100.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_gv100.cpp
@@ -35,7 +35,7 @@ GV100LegalizeSSA::handleCMP(Instruction *i)
    Value *pred = bld.getSSA(1, FILE_PREDICATE);
 
    bld.mkCmp(OP_SET, reverseCondCode(i->asCmp()->setCond), TYPE_U8, pred,
-             i->sType, bld.mkImm(0), i->getSrc(2));
+             i->sType, bld.mkImm(0), i->getSrc(2))->ftz = i->ftz;
    bld.mkOp3(OP_SELP, TYPE_U32, i->getDef(0), i->getSrc(0), i->getSrc(1), pred);
    return true;
 }
@@ -189,6 +189,7 @@ GV100LegalizeSSA::handleSET(Instruction *i)
    xsetp->src(0).mod = i->src(0).mod;
    xsetp->src(1).mod = i->src(1).mod;
    xsetp->setSrc(2, src2);
+   xsetp->ftz = i->ftz;
 
    i = bld.mkOp3(OP_SELP, TYPE_U32, i->getDef(0), bld.mkImm(0), met, pred);
    i->src(2).mod = Modifier(NV50_IR_MOD_NOT);
@@ -235,6 +236,7 @@ GV100LegalizeSSA::handleSUB(Instruction *i)
       bld.mkOp2(OP_ADD, i->dType, i->getDef(0), i->getSrc(0), i->getSrc(1));
    xadd->src(0).mod = i->src(0).mod;
    xadd->src(1).mod = i->src(1).mod ^ Modifier(NV50_IR_MOD_NEG);
+   xadd->ftz = i->ftz;
    return true;
 }
 
@@ -244,6 +246,9 @@ GV100LegalizeSSA::visit(Instruction *i)
    bool lowered = false;
 
    bld.setPosition(i, false);
+   if (i->sType == TYPE_F32 && i->dType != TYPE_F16 &&
+       prog->getType() != Program::TYPE_COMPUTE)
+      handleFTZ(i);
 
    switch (i->op) {
    case OP_AND:
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
index a4925013ee4..8c99427d3c0 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
@@ -64,13 +64,14 @@ private:
    void handleDIV(Instruction *); // integer division, modulus
    void handleRCPRSQLib(Instruction *, Value *[]);
    void handleRCPRSQ(Instruction *); // double precision float recip/rsqrt
-   void handleFTZ(Instruction *);
    void handleSET(CmpInstruction *);
    void handleTEXLOD(TexInstruction *);
    void handleShift(Instruction *);
    void handleBREV(Instruction *);
 
 protected:
+   void handleFTZ(Instruction *);
+
    BuildUtil bld;
 };
 



More information about the mesa-commit mailing list