nvc0/ir: reset the base offset for indirect images accesses
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 4 Jul 2016 22:08:03 +0000 (00:08 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 4 Jul 2016 23:44:12 +0000 (01:44 +0200)
In presence of an indirect image access, the base offset should be
zeroed because the stride will be computed twice. This is a pretty
rare situation but it can happen when tex.r > 0.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: "11.2 12.0" <mesa-stable@lists.freedesktop.org>
src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp

index ce0f99cc25d6b4a906bd29c7a13d90d974e7c99d..ec349ecbbffdc7471afd4c8fe53d3c819aaeae10 100644 (file)
@@ -1685,7 +1685,7 @@ NVC0LoweringPass::processSurfaceCoordsNVE4(TexInstruction *su)
    const int idx = su->tex.r;
    const int dim = su->tex.target.getDim();
    const int arg = dim + (su->tex.target.isArray() || su->tex.target.isCube());
-   const uint16_t base = idx * NVE4_SU_INFO__STRIDE;
+   uint16_t base = idx * NVE4_SU_INFO__STRIDE;
    int c;
    Value *zero = bld.mkImm(0);
    Value *p1 = NULL;
@@ -1712,6 +1712,7 @@ NVC0LoweringPass::processSurfaceCoordsNVE4(TexInstruction *su)
       }
       ind = bld.mkOp2v(OP_AND, TYPE_U32, bld.getSSA(), ind, bld.mkImm(7));
       ind = bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(), ind, bld.mkImm(6));
+      base = 0;
    }
 
    // calculate clamped coordinates
@@ -2049,7 +2050,7 @@ NVC0LoweringPass::processSurfaceCoordsNVC0(TexInstruction *su)
    const int idx = su->tex.r;
    const int dim = su->tex.target.getDim();
    const int arg = dim + (su->tex.target.isArray() || su->tex.target.isCube());
-   const uint16_t base = idx * NVE4_SU_INFO__STRIDE;
+   uint16_t base = idx * NVE4_SU_INFO__STRIDE;
    int c;
    Value *zero = bld.mkImm(0);
    Value *src[3];
@@ -2068,6 +2069,7 @@ NVC0LoweringPass::processSurfaceCoordsNVC0(TexInstruction *su)
       }
       ind = bld.mkOp2v(OP_AND, TYPE_U32, bld.getSSA(), ind, bld.mkImm(7));
       ind = bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(), ind, bld.mkImm(6));
+      base = 0;
    }
 
    // get surface coordinates