mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 17:48:10 +02:00
nvc0/ir: fix robustness guarantees for constbuf loads on kepler+ compute
Kepler and up unfortunately only support up to 8 constbufs. We work
around this by loading from constbufs as if they were storage buffers.
However we were not consistently applying limits to loads from these
buffers. Make sure to do the same thing we do for storage buffers.
Fixes GL45-CTS.robust_buffer_access_behavior.uniform_buffer
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Cc: mesa-stable@lists.freedesktop.org
(cherry picked from commit 1acdd62847)
This commit is contained in:
parent
384b14b6d2
commit
d51c4f7c13
1 changed files with 22 additions and 25 deletions
|
|
@ -2244,6 +2244,9 @@ NVC0LoweringPass::handleLDST(Instruction *i)
|
|||
int8_t fileIndex = i->getSrc(0)->reg.fileIndex - 1;
|
||||
Value *ind = i->getIndirect(0, 1);
|
||||
|
||||
if (!ind && fileIndex == -1)
|
||||
return;
|
||||
|
||||
if (ind) {
|
||||
// Clamp the UBO index when an indirect access is used to avoid
|
||||
// loading information from the wrong place in the driver cb.
|
||||
|
|
@ -2253,32 +2256,26 @@ NVC0LoweringPass::handleLDST(Instruction *i)
|
|||
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);
|
||||
Value *length = loadUboLength32(ind, fileIndex * 16);
|
||||
Value *pred = new_LValue(func, FILE_PREDICATE);
|
||||
if (i->src(0).isIndirect(0)) {
|
||||
bld.mkOp2(OP_ADD, TYPE_U64, ptr, ptr, i->getIndirect(0, 0));
|
||||
bld.mkOp2(OP_ADD, TYPE_U32, offset, offset, i->getIndirect(0, 0));
|
||||
}
|
||||
i->getSrc(0)->reg.file = FILE_MEMORY_GLOBAL;
|
||||
i->setIndirect(0, 1, NULL);
|
||||
i->setIndirect(0, 0, ptr);
|
||||
bld.mkCmp(OP_SET, CC_GT, TYPE_U32, pred, TYPE_U32, offset, length);
|
||||
i->setPredicate(CC_NOT_P, pred);
|
||||
if (i->defExists(0)) {
|
||||
bld.mkMov(i->getDef(0), bld.mkImm(0));
|
||||
}
|
||||
} else if (fileIndex >= 0) {
|
||||
Value *ptr = loadUboInfo64(ind, fileIndex * 16);
|
||||
if (i->src(0).isIndirect(0)) {
|
||||
bld.mkOp2(OP_ADD, TYPE_U64, ptr, ptr, i->getIndirect(0, 0));
|
||||
}
|
||||
i->getSrc(0)->reg.file = FILE_MEMORY_GLOBAL;
|
||||
i->setIndirect(0, 1, NULL);
|
||||
i->setIndirect(0, 0, ptr);
|
||||
Value *offset = bld.loadImm(NULL, i->getSrc(0)->reg.data.offset + typeSizeof(i->sType));
|
||||
Value *ptr = loadUboInfo64(ind, fileIndex * 16);
|
||||
Value *length = loadUboLength32(ind, fileIndex * 16);
|
||||
Value *pred = new_LValue(func, FILE_PREDICATE);
|
||||
if (i->src(0).isIndirect(0)) {
|
||||
bld.mkOp2(OP_ADD, TYPE_U64, ptr, ptr, i->getIndirect(0, 0));
|
||||
bld.mkOp2(OP_ADD, TYPE_U32, offset, offset, i->getIndirect(0, 0));
|
||||
}
|
||||
i->getSrc(0)->reg.file = FILE_MEMORY_GLOBAL;
|
||||
i->setIndirect(0, 1, NULL);
|
||||
i->setIndirect(0, 0, ptr);
|
||||
bld.mkCmp(OP_SET, CC_GT, TYPE_U32, pred, TYPE_U32, offset, length);
|
||||
i->setPredicate(CC_NOT_P, pred);
|
||||
Value *zero, *dst = i->getDef(0);
|
||||
i->setDef(0, bld.getSSA());
|
||||
|
||||
bld.setPosition(i, true);
|
||||
bld.mkMov((zero = bld.getSSA()), bld.mkImm(0))
|
||||
->setPredicate(CC_P, pred);
|
||||
bld.mkOp2(OP_UNION, TYPE_U32, dst, i->getDef(0), zero);
|
||||
} else if (i->src(0).isIndirect(1)) {
|
||||
Value *ptr;
|
||||
if (i->src(0).isIndirect(0))
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue