Commit 0eba65b1 by Chris Forbes

Support loads and stores of interface variables

Bug: b/124388146 Change-Id: I2c422dc2f85730f4c4bef45388e77028465ea9ba Reviewed-on: https://swiftshader-review.googlesource.com/c/24828Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Reviewed-by: 's avatarBen Clayton <bclayton@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent e7b8020e
...@@ -642,12 +642,11 @@ namespace sw ...@@ -642,12 +642,11 @@ namespace sw
{ {
case spv::OpVariable: case spv::OpVariable:
{ {
auto &object = getObject(insn.word(2)); auto resultId = insn.word(2);
// Want to exclude: location-oriented interface variables; special things that consume zero slots. auto &object = getObject(resultId);
// TODO: what to do about zero-slot objects? // TODO: what to do about zero-slot objects?
if (object.kind != Object::Kind::InterfaceVariable && object.sizeInComponents > 0) if (object.sizeInComponents > 0)
{ {
// any variable not in a location-oriented interface
routine->createLvalue(insn.word(2), object.sizeInComponents); routine->createLvalue(insn.word(2), object.sizeInComponents);
} }
break; break;
...@@ -665,6 +664,22 @@ namespace sw ...@@ -665,6 +664,22 @@ namespace sw
{ {
switch (insn.opcode()) switch (insn.opcode())
{ {
case spv::OpVariable:
{
auto resultId = insn.word(2);
auto &object = getObject(resultId);
if (object.kind == Object::Kind::InterfaceVariable && object.storageClass == spv::StorageClassInput)
{
auto &dst = routine->getValue(resultId);
int offset = 0;
VisitInterface(resultId,
[&](Decorations const &d, AttribType type) {
auto scalarSlot = d.Location << 2 | d.Component;
dst[offset++] = (*routine->inputs)[scalarSlot];
});
}
break;
}
case spv::OpLoad: case spv::OpLoad:
{ {
auto &object = getObject(insn.word(2)); auto &object = getObject(insn.word(2));
...@@ -673,11 +688,6 @@ namespace sw ...@@ -673,11 +688,6 @@ namespace sw
routine->createLvalue(insn.word(2), type.sizeInComponents); // TODO: this should be an ssavalue! routine->createLvalue(insn.word(2), type.sizeInComponents); // TODO: this should be an ssavalue!
auto &pointerBase = getObject(pointer.pointerBase); auto &pointerBase = getObject(pointer.pointerBase);
if (pointerBase.kind == Object::Kind::InterfaceVariable)
{
UNIMPLEMENTED("Location-based load not yet implemented");
}
if (pointerBase.storageClass == spv::StorageClassImage || if (pointerBase.storageClass == spv::StorageClassImage ||
pointerBase.storageClass == spv::StorageClassUniform || pointerBase.storageClass == spv::StorageClassUniform ||
pointerBase.storageClass == spv::StorageClassUniformConstant) pointerBase.storageClass == spv::StorageClassUniformConstant)
...@@ -720,11 +730,6 @@ namespace sw ...@@ -720,11 +730,6 @@ namespace sw
assert(type.sizeInComponents == 1); assert(type.sizeInComponents == 1);
assert(base.pointerBase == object.pointerBase); assert(base.pointerBase == object.pointerBase);
if (pointerBase.kind == Object::Kind::InterfaceVariable)
{
UNIMPLEMENTED("Location-based OpAccessChain not yet implemented");
}
if (pointerBase.storageClass == spv::StorageClassImage || if (pointerBase.storageClass == spv::StorageClassImage ||
pointerBase.storageClass == spv::StorageClassUniform || pointerBase.storageClass == spv::StorageClassUniform ||
pointerBase.storageClass == spv::StorageClassUniformConstant) pointerBase.storageClass == spv::StorageClassUniformConstant)
...@@ -742,11 +747,6 @@ namespace sw ...@@ -742,11 +747,6 @@ namespace sw
auto &pointer = getObject(insn.word(1)); auto &pointer = getObject(insn.word(1));
auto &pointerBase = getObject(pointer.pointerBase); auto &pointerBase = getObject(pointer.pointerBase);
if (pointerBase.kind == Object::Kind::InterfaceVariable)
{
UNIMPLEMENTED("Location-based store not yet implemented");
}
if (pointerBase.storageClass == spv::StorageClassImage || if (pointerBase.storageClass == spv::StorageClassImage ||
pointerBase.storageClass == spv::StorageClassUniform || pointerBase.storageClass == spv::StorageClassUniform ||
pointerBase.storageClass == spv::StorageClassUniformConstant) pointerBase.storageClass == spv::StorageClassUniformConstant)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment