nvc0/ir: lower atomics in s[]

This commit is contained in:
Christoph Bumiller 2013-02-22 20:46:28 +01:00
parent 9c196779bc
commit c0fc3463e9
1 changed files with 33 additions and 0 deletions

View File

@ -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;
}