summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSamuel Pitoiset <[email protected]>2016-05-22 22:39:31 +0200
committerSamuel Pitoiset <[email protected]>2016-05-22 23:06:16 +0200
commita7fad12931a62bdd8483b68f7cccbf0ca01bcb89 (patch)
treea7234a173dc8402273559d03d8415bb1dc899e3a /src
parentcb9a51d1f6db4c5a3baa2aed309875bf2e8746bd (diff)
nvc0/ir: fix indirect access for images
When the array doesn't start at 0 we need to account for su->tex.r. While we are at it, make sure to avoid out of bounds access by masking the index. This fixes GL45-CTS.shading_language_420pack.binding_image_array. Signed-off-by: Samuel Pitoiset <[email protected]> Reported-by: Dave Airlie <[email protected]> Reviewed-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
index 9b4bf8230fa..869040ca562 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
@@ -1677,10 +1677,13 @@ NVC0LoweringPass::processSurfaceCoordsNVE4(TexInstruction *su)
adjustCoordinatesMS(su);
if (su->tex.rIndirectSrc >= 0) {
- // FIXME: out of bounds
- assert(su->tex.r == 0);
- ind = bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(),
- su->getIndirectR(), bld.mkImm(6));
+ ind = su->getIndirectR();
+ if (su->tex.r > 0) {
+ ind = bld.mkOp2v(OP_ADD, TYPE_U32, bld.getSSA(), ind,
+ bld.loadImm(NULL, su->tex.r));
+ }
+ 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));
}
// calculate clamped coordinates
@@ -2026,10 +2029,13 @@ NVC0LoweringPass::processSurfaceCoordsNVC0(TexInstruction *su)
Value *ind = NULL;
if (su->tex.rIndirectSrc >= 0) {
- // FIXME: out of bounds
- assert(su->tex.r == 0);
- ind = bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(),
- su->getIndirectR(), bld.mkImm(6));
+ ind = su->getIndirectR();
+ if (su->tex.r > 0) {
+ ind = bld.mkOp2v(OP_ADD, TYPE_U32, bld.getSSA(), ind,
+ bld.loadImm(NULL, su->tex.r));
+ }
+ 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));
}
// get surface coordinates