gv100/ir: set ftz bit on floating point operations
authorKarol Herbst <kherbst@redhat.com>
Mon, 13 Jul 2020 14:24:20 +0000 (16:24 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 14 Jul 2020 10:35:24 +0000 (10:35 +0000)
Fixes Unigine Heavens ambient occlusion

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

src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_gv100.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h

index 953f082a06af6e74685b28f1a6f332181ea8d005..644d492832790ed688076e1a96a61b9ed3f41553 100644 (file)
@@ -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:
index a4925013ee447975c2b68bc37a3dd7f932700e05..8c99427d3c0c5e8f40f86603920b934d39d5c142 100644 (file)
@@ -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;
 };