nvc0/ir: return 0 in imageLoad on incomplete textures
We already guarded all OP_SULDP against out of bound accesses, but we ended up just reusing whatever value was stored in the dest registers. Fixes CTS test shader_image_load_store.incomplete_textures v2: fix for loads not ending up with predicates (bindless_texture) v3: fix replacing the def Cc: <mesa-stable@lists.freedesktop.org> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu> Signed-off-by: Karol Herbst <kherbst@redhat.com>
This commit is contained in:
parent
0ca046d7e9
commit
c3325097be
|
@ -2151,13 +2151,36 @@ NVC0LoweringPass::convertSurfaceFormat(TexInstruction *su)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
NVC0LoweringPass::insertOOBSurfaceOpResult(TexInstruction *su)
|
||||
{
|
||||
if (!su->getPredicate())
|
||||
return;
|
||||
|
||||
bld.setPosition(su, true);
|
||||
|
||||
for (unsigned i = 0; su->defExists(i); ++i) {
|
||||
ValueDef &def = su->def(i);
|
||||
|
||||
Instruction *mov = bld.mkMov(bld.getSSA(), bld.loadImm(NULL, 0));
|
||||
assert(su->cc == CC_NOT_P);
|
||||
mov->setPredicate(CC_P, su->getPredicate());
|
||||
Instruction *uni = bld.mkOp2(OP_UNION, TYPE_U32, bld.getSSA(), NULL, mov->getDef(0));
|
||||
|
||||
def.replace(uni->getDef(0), false);
|
||||
uni->setSrc(0, def.get());
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
NVC0LoweringPass::handleSurfaceOpNVE4(TexInstruction *su)
|
||||
{
|
||||
processSurfaceCoordsNVE4(su);
|
||||
|
||||
if (su->op == OP_SULDP)
|
||||
if (su->op == OP_SULDP) {
|
||||
convertSurfaceFormat(su);
|
||||
insertOOBSurfaceOpResult(su);
|
||||
}
|
||||
|
||||
if (su->op == OP_SUREDB || su->op == OP_SUREDP) {
|
||||
assert(su->getPredicate());
|
||||
|
@ -2267,8 +2290,10 @@ NVC0LoweringPass::handleSurfaceOpNVC0(TexInstruction *su)
|
|||
|
||||
processSurfaceCoordsNVC0(su);
|
||||
|
||||
if (su->op == OP_SULDP)
|
||||
if (su->op == OP_SULDP) {
|
||||
convertSurfaceFormat(su);
|
||||
insertOOBSurfaceOpResult(su);
|
||||
}
|
||||
|
||||
if (su->op == OP_SUREDB || su->op == OP_SUREDP) {
|
||||
const int dim = su->tex.target.getDim();
|
||||
|
@ -2370,8 +2395,10 @@ NVC0LoweringPass::handleSurfaceOpGM107(TexInstruction *su)
|
|||
{
|
||||
processSurfaceCoordsGM107(su);
|
||||
|
||||
if (su->op == OP_SULDP)
|
||||
if (su->op == OP_SULDP) {
|
||||
convertSurfaceFormat(su);
|
||||
insertOOBSurfaceOpResult(su);
|
||||
}
|
||||
|
||||
if (su->op == OP_SUREDP) {
|
||||
Value *def = su->getDef(0);
|
||||
|
|
|
@ -172,6 +172,7 @@ private:
|
|||
void processSurfaceCoordsNVE4(TexInstruction *);
|
||||
void processSurfaceCoordsNVC0(TexInstruction *);
|
||||
void convertSurfaceFormat(TexInstruction *);
|
||||
void insertOOBSurfaceOpResult(TexInstruction *);
|
||||
Value *calculateSampleOffset(Value *sampleID);
|
||||
|
||||
protected:
|
||||
|
|
Loading…
Reference in New Issue