nvc0/ir: clamp the UBO index for compute on Kepler
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 13 Jun 2016 15:13:28 +0000 (17:13 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 13 Jun 2016 18:12:48 +0000 (20:12 +0200)
We already check that the address is not "too far", but we should also
clamp the UBO index in order to avoid looking at the wrong place in the
driver cb. This is a pretty rare situation though.

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

index cb822168d1633f664d2a597f70e549afb0c4f7a5..71013eb63b50d9aa5efe6bf82f2754d9ea2b2054 100644 (file)
@@ -2183,7 +2183,15 @@ NVC0LoweringPass::handleLDST(Instruction *i)
          int8_t fileIndex = i->getSrc(0)->reg.fileIndex - 1;
          Value *ind = i->getIndirect(0, 1);
 
-         // TODO: clamp the offset to the maximum number of const buf.
+         if (ind) {
+            // Clamp the UBO index when an indirect access is used to avoid
+            // loading information from the wrong place in the driver cb.
+            ind = bld.mkOp2v(OP_MIN, TYPE_U32, ind,
+                             bld.mkOp2v(OP_ADD, TYPE_U32, bld.getSSA(),
+                                        ind, bld.loadImm(NULL, fileIndex)),
+                             bld.loadImm(NULL, 12));
+         }
+
          if (i->src(0).isIndirect(1)) {
             Value *offset = bld.loadImm(NULL, i->getSrc(0)->reg.data.offset + typeSizeof(i->sType));
             Value *ptr = loadUboInfo64(ind, fileIndex * 16);