nvc0/ir: lower atomics in s[]
This commit is contained in:
parent
9c196779bc
commit
c0fc3463e9
|
@ -598,6 +598,7 @@ private:
|
|||
bool handleTXD(TexInstruction *);
|
||||
bool handleTXQ(TexInstruction *);
|
||||
bool handleManualTXD(TexInstruction *);
|
||||
bool handleATOM(Instruction *);
|
||||
|
||||
void checkPredicate(Instruction *);
|
||||
|
||||
|
@ -836,6 +837,35 @@ NVC0LoweringPass::handleTXQ(TexInstruction *txq)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
NVC0LoweringPass::handleATOM(Instruction *atom)
|
||||
{
|
||||
SVSemantic sv;
|
||||
|
||||
switch (atom->src(0).getFile()) {
|
||||
case FILE_MEMORY_LOCAL:
|
||||
sv = SV_LBASE;
|
||||
break;
|
||||
case FILE_MEMORY_SHARED:
|
||||
sv = SV_SBASE;
|
||||
break;
|
||||
default:
|
||||
assert(atom->src(0).getFile() == FILE_MEMORY_GLOBAL);
|
||||
return true;
|
||||
}
|
||||
Value *base =
|
||||
bld.mkOp1v(OP_RDSV, TYPE_U32, bld.getScratch(), bld.mkSysVal(sv, 0));
|
||||
Value *ptr = atom->getIndirect(0, 0);
|
||||
|
||||
atom->setSrc(0, cloneShallow(func, atom->getSrc(0)));
|
||||
atom->getSrc(0)->reg.file = FILE_MEMORY_GLOBAL;
|
||||
if (ptr)
|
||||
base = bld.mkOp2v(OP_ADD, TYPE_U32, base, base, ptr);
|
||||
atom->setIndirect(0, 0, base);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
NVC0LoweringPass::handleWRSV(Instruction *i)
|
||||
{
|
||||
|
@ -1094,6 +1124,9 @@ NVC0LoweringPass::visit(Instruction *i)
|
|||
assert(prog->getType() != Program::TYPE_FRAGMENT);
|
||||
}
|
||||
break;
|
||||
case OP_ATOM:
|
||||
handleATOM(i);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue