Commit 29090850 by Nicolas Capens Committed by Nicolas Capens

Refactor variable type lookup

Previously the pointee type of OpVariable was determined starting from the result ID. It just obtains the 'Object' which has the type collected from the OpVariable instruction itself. So the object lookup can be skipped by using the latter directly again. Bug b/129000021 Change-Id: I882d837c4cc1c7a8d0b19de38dc8ee19e622af33 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/27651 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarChris Forbes <chrisforbes@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent a1b68abf
...@@ -199,7 +199,7 @@ namespace sw ...@@ -199,7 +199,7 @@ namespace sw
break; break;
default: default:
UNREACHABLE("Unexpected StorageClass"); // See Appendix A of the Vulkan spec. UNREACHABLE("Unexpected StorageClass %d", storageClass); // See Appendix A of the Vulkan spec.
break; break;
} }
break; break;
...@@ -508,13 +508,13 @@ namespace sw ...@@ -508,13 +508,13 @@ namespace sw
auto &objectTy = getType(object.type); auto &objectTy = getType(object.type);
ASSERT(objectTy.storageClass == spv::StorageClassInput || objectTy.storageClass == spv::StorageClassOutput); ASSERT(objectTy.storageClass == spv::StorageClassInput || objectTy.storageClass == spv::StorageClassOutput);
ASSERT(objectTy.definition.opcode() == spv::OpTypePointer); ASSERT(objectTy.opcode() == spv::OpTypePointer);
auto pointeeTy = getType(objectTy.element); auto pointeeTy = getType(objectTy.element);
auto &builtinInterface = (objectTy.storageClass == spv::StorageClassInput) ? inputBuiltins : outputBuiltins; auto &builtinInterface = (objectTy.storageClass == spv::StorageClassInput) ? inputBuiltins : outputBuiltins;
auto &userDefinedInterface = (objectTy.storageClass == spv::StorageClassInput) ? inputs : outputs; auto &userDefinedInterface = (objectTy.storageClass == spv::StorageClassInput) ? inputs : outputs;
ASSERT(object.definition.opcode() == spv::OpVariable); ASSERT(object.opcode() == spv::OpVariable);
Object::ID resultId = object.definition.word(2); Object::ID resultId = object.definition.word(2);
if (objectTy.isBuiltInBlock) if (objectTy.isBuiltInBlock)
...@@ -687,7 +687,7 @@ namespace sw ...@@ -687,7 +687,7 @@ namespace sw
ApplyDecorationsForId(&d, id); ApplyDecorationsForId(&d, id);
auto const &obj = getType(id); auto const &obj = getType(id);
switch (obj.definition.opcode()) switch(obj.opcode())
{ {
case spv::OpTypePointer: case spv::OpTypePointer:
return VisitInterfaceInner<F>(obj.definition.word(3), d, f); return VisitInterfaceInner<F>(obj.definition.word(3), d, f);
...@@ -849,7 +849,7 @@ namespace sw ...@@ -849,7 +849,7 @@ namespace sw
for (auto i = 0u; i < numIndexes; i++) for (auto i = 0u; i < numIndexes; i++)
{ {
auto & type = getType(typeId); auto & type = getType(typeId);
switch (type.definition.opcode()) switch(type.opcode())
{ {
case spv::OpTypeStruct: case spv::OpTypeStruct:
{ {
...@@ -881,7 +881,7 @@ namespace sw ...@@ -881,7 +881,7 @@ namespace sw
} }
default: default:
UNIMPLEMENTED("Unexpected type '%s' in WalkAccessChain", OpcodeName(type.definition.opcode()).c_str()); UNIMPLEMENTED("Unexpected type '%s' in WalkAccessChain", OpcodeName(type.opcode()).c_str());
} }
} }
...@@ -895,7 +895,7 @@ namespace sw ...@@ -895,7 +895,7 @@ namespace sw
for (auto i = 0u; i < numIndexes; i++) for (auto i = 0u; i < numIndexes; i++)
{ {
auto & type = getType(typeId); auto & type = getType(typeId);
switch (type.definition.opcode()) switch(type.opcode())
{ {
case spv::OpTypeStruct: case spv::OpTypeStruct:
{ {
...@@ -1070,7 +1070,7 @@ namespace sw ...@@ -1070,7 +1070,7 @@ namespace sw
// but is possible to construct integer constant 0 via OpConstantNull. // but is possible to construct integer constant 0 via OpConstantNull.
auto insn = getObject(id).definition; auto insn = getObject(id).definition;
ASSERT(insn.opcode() == spv::OpConstant); ASSERT(insn.opcode() == spv::OpConstant);
ASSERT(getType(insn.word(1)).definition.opcode() == spv::OpTypeInt); ASSERT(getType(insn.word(1)).opcode() == spv::OpTypeInt);
return insn.word(3); return insn.word(3);
} }
...@@ -1084,14 +1084,14 @@ namespace sw ...@@ -1084,14 +1084,14 @@ namespace sw
{ {
case spv::OpVariable: case spv::OpVariable:
{ {
Object::ID resultId = insn.word(2); Type::ID resultPointerTypeId = insn.word(1);
auto &object = getObject(resultId); auto resultPointerType = getType(resultPointerTypeId);
auto &objectTy = getType(object.type); auto pointeeType = getType(resultPointerType.element);
auto &pointeeTy = getType(objectTy.element);
// TODO: what to do about zero-slot objects? if(pointeeType.sizeInComponents > 0) // TODO: what to do about zero-slot objects?
if (pointeeTy.sizeInComponents > 0)
{ {
routine->createLvalue(resultId, pointeeTy.sizeInComponents); Object::ID resultId = insn.word(2);
routine->createLvalue(resultId, pointeeType.sizeInComponents);
} }
break; break;
} }
...@@ -1466,23 +1466,25 @@ namespace sw ...@@ -1466,23 +1466,25 @@ namespace sw
void SpirvShader::EmitAccessChain(InsnIterator insn, SpirvRoutine *routine) const void SpirvShader::EmitAccessChain(InsnIterator insn, SpirvRoutine *routine) const
{ {
Type::ID typeId = insn.word(1); Type::ID typeId = insn.word(1);
Object::ID objectId = insn.word(2); Object::ID resultId = insn.word(2);
Object::ID baseId = insn.word(3); Object::ID baseId = insn.word(3);
uint32_t numIndexes = insn.wordCount() - 4;
const uint32_t *indexes = insn.wordPointer(4);
auto &type = getType(typeId); auto &type = getType(typeId);
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
ASSERT(getObject(baseId).pointerBase == getObject(objectId).pointerBase); ASSERT(getObject(baseId).pointerBase == getObject(resultId).pointerBase);
auto &dst = routine->createIntermediate(objectId, type.sizeInComponents); auto &dst = routine->createIntermediate(resultId, type.sizeInComponents);
if (type.storageClass == spv::StorageClassPushConstant || if(type.storageClass == spv::StorageClassPushConstant ||
type.storageClass == spv::StorageClassUniform || type.storageClass == spv::StorageClassUniform ||
type.storageClass == spv::StorageClassStorageBuffer) type.storageClass == spv::StorageClassStorageBuffer)
{ {
dst.emplace(0, WalkExplicitLayoutAccessChain(baseId, insn.wordCount() - 4, insn.wordPointer(4), routine)); dst.emplace(0, WalkExplicitLayoutAccessChain(baseId, numIndexes, indexes, routine));
} }
else else
{ {
dst.emplace(0, WalkAccessChain(baseId, insn.wordCount() - 4, insn.wordPointer(4), routine)); dst.emplace(0, WalkAccessChain(baseId, numIndexes, indexes, routine));
} }
} }
......
...@@ -207,6 +207,8 @@ namespace sw ...@@ -207,6 +207,8 @@ namespace sw
public: public:
using ID = SpirvID<Type>; using ID = SpirvID<Type>;
spv::Op opcode() const { return definition.opcode(); }
InsnIterator definition; InsnIterator definition;
spv::StorageClass storageClass = static_cast<spv::StorageClass>(-1); spv::StorageClass storageClass = static_cast<spv::StorageClass>(-1);
uint32_t sizeInComponents = 0; uint32_t sizeInComponents = 0;
...@@ -221,6 +223,8 @@ namespace sw ...@@ -221,6 +223,8 @@ namespace sw
public: public:
using ID = SpirvID<Object>; using ID = SpirvID<Object>;
spv::Op opcode() const { return definition.opcode(); }
InsnIterator definition; InsnIterator definition;
Type::ID type; Type::ID type;
ID pointerBase; ID pointerBase;
......
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