Commit 72f089c6 by Nicolas Capens Committed by Nicolas Capens

Obtain type ID from instruction

The defining instruction already contains the type ID. Bug: b/129000021 Change-Id: I0b29fda73964f5f4a73181a61a0f30cd1c47f404 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43692 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarBen Clayton <bclayton@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 78cc4f4a
...@@ -239,7 +239,6 @@ SpirvShader::SpirvShader( ...@@ -239,7 +239,6 @@ SpirvShader::SpirvShader(
auto &object = defs[resultId]; auto &object = defs[resultId];
object.kind = Object::Kind::Pointer; object.kind = Object::Kind::Pointer;
object.definition = insn; object.definition = insn;
object.type = typeId;
ASSERT(getType(typeId).definition.opcode() == spv::OpTypePointer); ASSERT(getType(typeId).definition.opcode() == spv::OpTypePointer);
ASSERT(getType(typeId).storageClass == storageClass); ASSERT(getType(typeId).storageClass == storageClass);
...@@ -308,7 +307,7 @@ SpirvShader::SpirvShader( ...@@ -308,7 +307,7 @@ SpirvShader::SpirvShader(
// TODO: consider a real LLVM-level undef. For now, zero is a perfectly good value. // TODO: consider a real LLVM-level undef. For now, zero is a perfectly good value.
// OpConstantNull forms a constant of arbitrary type, all zeros. // OpConstantNull forms a constant of arbitrary type, all zeros.
auto &object = CreateConstant(insn); auto &object = CreateConstant(insn);
auto &objectTy = getType(object.type); auto &objectTy = getType(object);
for(auto i = 0u; i < objectTy.sizeInComponents; i++) for(auto i = 0u; i < objectTy.sizeInComponents; i++)
{ {
object.constantValue[i] = 0; object.constantValue[i] = 0;
...@@ -323,7 +322,7 @@ SpirvShader::SpirvShader( ...@@ -323,7 +322,7 @@ SpirvShader::SpirvShader(
for(auto i = 0u; i < insn.wordCount() - 3; i++) for(auto i = 0u; i < insn.wordCount() - 3; i++)
{ {
auto &constituent = getObject(insn.word(i + 3)); auto &constituent = getObject(insn.word(i + 3));
auto &constituentTy = getType(constituent.type); auto &constituentTy = getType(constituent);
for(auto j = 0u; j < constituentTy.sizeInComponents; j++) for(auto j = 0u; j < constituentTy.sizeInComponents; j++)
{ {
object.constantValue[offset++] = constituent.constantValue[j]; object.constantValue[offset++] = constituent.constantValue[j];
...@@ -343,7 +342,7 @@ SpirvShader::SpirvShader( ...@@ -343,7 +342,7 @@ SpirvShader::SpirvShader(
// any execution mode set for LocalSize. // any execution mode set for LocalSize.
// The object decorated with WorkgroupSize must be declared // The object decorated with WorkgroupSize must be declared
// as a three-component vector of 32-bit integers. // as a three-component vector of 32-bit integers.
ASSERT(getType(object.type).sizeInComponents == 3); ASSERT(getType(object).sizeInComponents == 3);
modes.WorkgroupSizeX = object.constantValue[0]; modes.WorkgroupSizeX = object.constantValue[0];
modes.WorkgroupSizeY = object.constantValue[1]; modes.WorkgroupSizeY = object.constantValue[1];
modes.WorkgroupSizeZ = object.constantValue[2]; modes.WorkgroupSizeZ = object.constantValue[2];
...@@ -794,16 +793,16 @@ SpirvShader::Object &SpirvShader::CreateConstant(InsnIterator insn) ...@@ -794,16 +793,16 @@ SpirvShader::Object &SpirvShader::CreateConstant(InsnIterator insn)
Object::ID resultId = insn.word(2); Object::ID resultId = insn.word(2);
auto &object = defs[resultId]; auto &object = defs[resultId];
auto &objectTy = getType(typeId); auto &objectTy = getType(typeId);
object.type = typeId;
object.kind = Object::Kind::Constant; object.kind = Object::Kind::Constant;
object.definition = insn; object.definition = insn;
object.constantValue = std::unique_ptr<uint32_t[]>(new uint32_t[objectTy.sizeInComponents]); object.constantValue = std::unique_ptr<uint32_t[]>(new uint32_t[objectTy.sizeInComponents]);
return object; return object;
} }
void SpirvShader::ProcessInterfaceVariable(Object &object) void SpirvShader::ProcessInterfaceVariable(Object &object)
{ {
auto &objectTy = getType(object.type); auto &objectTy = getType(object);
ASSERT(objectTy.storageClass == spv::StorageClassInput || objectTy.storageClass == spv::StorageClassOutput); ASSERT(objectTy.storageClass == spv::StorageClassInput || objectTy.storageClass == spv::StorageClassOutput);
ASSERT(objectTy.opcode() == spv::OpTypePointer); ASSERT(objectTy.opcode() == spv::OpTypePointer);
...@@ -1038,8 +1037,8 @@ void SpirvShader::ApplyDecorationsForAccessChain(Decorations *d, DescriptorDecor ...@@ -1038,8 +1037,8 @@ void SpirvShader::ApplyDecorationsForAccessChain(Decorations *d, DescriptorDecor
{ {
ApplyDecorationsForId(d, baseId); ApplyDecorationsForId(d, baseId);
auto &baseObject = getObject(baseId); auto &baseObject = getObject(baseId);
ApplyDecorationsForId(d, baseObject.type); ApplyDecorationsForId(d, baseObject.typeId());
auto typeId = getType(baseObject.type).element; auto typeId = getType(baseObject).element;
for(auto i = 0u; i < numIndexes; i++) for(auto i = 0u; i < numIndexes; i++)
{ {
...@@ -1080,9 +1079,9 @@ SIMD::Pointer SpirvShader::WalkExplicitLayoutAccessChain(Object::ID baseId, uint ...@@ -1080,9 +1079,9 @@ SIMD::Pointer SpirvShader::WalkExplicitLayoutAccessChain(Object::ID baseId, uint
// Produce a offset into external memory in sizeof(float) units // Produce a offset into external memory in sizeof(float) units
auto &baseObject = getObject(baseId); auto &baseObject = getObject(baseId);
Type::ID typeId = getType(baseObject.type).element; Type::ID typeId = getType(baseObject).element;
Decorations d = {}; Decorations d = {};
ApplyDecorationsForId(&d, baseObject.type); ApplyDecorationsForId(&d, baseObject.typeId());
uint32_t arrayIndex = 0; uint32_t arrayIndex = 0;
if(baseObject.kind == Object::Kind::DescriptorSet) if(baseObject.kind == Object::Kind::DescriptorSet)
...@@ -1183,7 +1182,7 @@ SIMD::Pointer SpirvShader::WalkAccessChain(Object::ID baseId, uint32_t numIndexe ...@@ -1183,7 +1182,7 @@ SIMD::Pointer SpirvShader::WalkAccessChain(Object::ID baseId, uint32_t numIndexe
// TODO: avoid doing per-lane work in some cases if we can? // TODO: avoid doing per-lane work in some cases if we can?
auto routine = state->routine; auto routine = state->routine;
auto &baseObject = getObject(baseId); auto &baseObject = getObject(baseId);
Type::ID typeId = getType(baseObject.type).element; Type::ID typeId = getType(baseObject).element;
auto ptr = state->getPointer(baseId); auto ptr = state->getPointer(baseId);
...@@ -1214,7 +1213,7 @@ SIMD::Pointer SpirvShader::WalkAccessChain(Object::ID baseId, uint32_t numIndexe ...@@ -1214,7 +1213,7 @@ SIMD::Pointer SpirvShader::WalkAccessChain(Object::ID baseId, uint32_t numIndexe
case spv::OpTypeRuntimeArray: case spv::OpTypeRuntimeArray:
{ {
// TODO: b/127950082: Check bounds. // TODO: b/127950082: Check bounds.
if(getType(baseObject.type).storageClass == spv::StorageClassUniformConstant) if(getType(baseObject).storageClass == spv::StorageClassUniformConstant)
{ {
// indexing into an array of descriptors. // indexing into an array of descriptors.
auto &obj = getObject(indexIds[i]); auto &obj = getObject(indexIds[i]);
...@@ -1453,7 +1452,6 @@ void SpirvShader::DefineResult(const InsnIterator &insn) ...@@ -1453,7 +1452,6 @@ void SpirvShader::DefineResult(const InsnIterator &insn)
Type::ID typeId = insn.word(1); Type::ID typeId = insn.word(1);
Object::ID resultId = insn.word(2); Object::ID resultId = insn.word(2);
auto &object = defs[resultId]; auto &object = defs[resultId];
object.type = typeId;
switch(getType(typeId).opcode()) switch(getType(typeId).opcode())
{ {
...@@ -2008,7 +2006,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeConstruct(InsnIterator insn, E ...@@ -2008,7 +2006,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeConstruct(InsnIterator insn, E
{ {
Object::ID srcObjectId = insn.word(3u + i); Object::ID srcObjectId = insn.word(3u + i);
auto &srcObject = getObject(srcObjectId); auto &srcObject = getObject(srcObjectId);
auto &srcObjectTy = getType(srcObject.type); auto &srcObjectTy = getType(srcObject);
Operand srcObjectAccess(this, state, srcObjectId); Operand srcObjectAccess(this, state, srcObjectId);
for(auto j = 0u; j < srcObjectTy.sizeInComponents; j++) for(auto j = 0u; j < srcObjectTy.sizeInComponents; j++)
...@@ -2026,7 +2024,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit ...@@ -2026,7 +2024,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit
auto &type = getType(resultTypeId); auto &type = getType(resultTypeId);
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents);
auto &newPartObject = getObject(insn.word(3)); auto &newPartObject = getObject(insn.word(3));
auto &newPartObjectTy = getType(newPartObject.type); auto &newPartObjectTy = getType(newPartObject);
auto firstNewComponent = WalkLiteralAccessChain(resultTypeId, insn.wordCount() - 5, insn.wordPointer(5)); auto firstNewComponent = WalkLiteralAccessChain(resultTypeId, insn.wordCount() - 5, insn.wordPointer(5));
Operand srcObjectAccess(this, state, insn.word(4)); Operand srcObjectAccess(this, state, insn.word(4));
...@@ -2075,7 +2073,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitSt ...@@ -2075,7 +2073,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitSt
// Note: number of components in result type, first half type, and second // Note: number of components in result type, first half type, and second
// half type are all independent. // half type are all independent.
auto &firstHalfType = getType(getObject(insn.word(3)).type); auto &firstHalfType = getType(getObject(insn.word(3)));
Operand firstHalfAccess(this, state, insn.word(3)); Operand firstHalfAccess(this, state, insn.word(3));
Operand secondHalfAccess(this, state, insn.word(4)); Operand secondHalfAccess(this, state, insn.word(4));
...@@ -2106,7 +2104,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn, ...@@ -2106,7 +2104,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn,
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.word(1));
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents);
auto &srcType = getType(getObject(insn.word(3)).type); auto &srcType = getType(getObject(insn.word(3)));
Operand src(this, state, insn.word(3)); Operand src(this, state, insn.word(3));
Operand index(this, state, insn.word(4)); Operand index(this, state, insn.word(4));
...@@ -2144,7 +2142,7 @@ SpirvShader::EmitResult SpirvShader::EmitSelect(InsnIterator insn, EmitState *st ...@@ -2144,7 +2142,7 @@ SpirvShader::EmitResult SpirvShader::EmitSelect(InsnIterator insn, EmitState *st
auto &type = getType(insn.word(1)); auto &type = getType(insn.word(1));
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents);
auto cond = Operand(this, state, insn.word(3)); auto cond = Operand(this, state, insn.word(3));
auto condIsScalar = (getType(cond.type).sizeInComponents == 1); auto condIsScalar = (getType(cond).sizeInComponents == 1);
auto lhs = Operand(this, state, insn.word(4)); auto lhs = Operand(this, state, insn.word(4));
auto rhs = Operand(this, state, insn.word(5)); auto rhs = Operand(this, state, insn.word(5));
...@@ -2162,7 +2160,7 @@ SpirvShader::EmitResult SpirvShader::EmitAny(InsnIterator insn, EmitState *state ...@@ -2162,7 +2160,7 @@ SpirvShader::EmitResult SpirvShader::EmitAny(InsnIterator insn, EmitState *state
auto &type = getType(insn.word(1)); auto &type = getType(insn.word(1));
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents);
auto &srcType = getType(getObject(insn.word(3)).type); auto &srcType = getType(getObject(insn.word(3)));
auto src = Operand(this, state, insn.word(3)); auto src = Operand(this, state, insn.word(3));
SIMD::UInt result = src.UInt(0); SIMD::UInt result = src.UInt(0);
...@@ -2181,7 +2179,7 @@ SpirvShader::EmitResult SpirvShader::EmitAll(InsnIterator insn, EmitState *state ...@@ -2181,7 +2179,7 @@ SpirvShader::EmitResult SpirvShader::EmitAll(InsnIterator insn, EmitState *state
auto &type = getType(insn.word(1)); auto &type = getType(insn.word(1));
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents);
auto &srcType = getType(getObject(insn.word(3)).type); auto &srcType = getType(getObject(insn.word(3)));
auto src = Operand(this, state, insn.word(3)); auto src = Operand(this, state, insn.word(3));
SIMD::UInt result = src.UInt(0); SIMD::UInt result = src.UInt(0);
...@@ -2321,7 +2319,7 @@ SpirvShader::EmitResult SpirvShader::EmitArrayLength(InsnIterator insn, EmitStat ...@@ -2321,7 +2319,7 @@ SpirvShader::EmitResult SpirvShader::EmitArrayLength(InsnIterator insn, EmitStat
ASSERT(resultType.sizeInComponents == 1); ASSERT(resultType.sizeInComponents == 1);
ASSERT(resultType.definition.opcode() == spv::OpTypeInt); ASSERT(resultType.definition.opcode() == spv::OpTypeInt);
auto &structPtrTy = getType(getObject(structPtrId).type); auto &structPtrTy = getType(getObject(structPtrId));
auto &structTy = getType(structPtrTy.element); auto &structTy = getType(structPtrTy.element);
auto arrayId = Type::ID(structTy.definition.word(2 + arrayFieldIdx)); auto arrayId = Type::ID(structTy.definition.word(2 + arrayFieldIdx));
...@@ -2364,7 +2362,7 @@ uint32_t SpirvShader::GetConstScalarInt(Object::ID id) const ...@@ -2364,7 +2362,7 @@ uint32_t SpirvShader::GetConstScalarInt(Object::ID id) const
{ {
auto &scopeObj = getObject(id); auto &scopeObj = getObject(id);
ASSERT(scopeObj.kind == Object::Kind::Constant); ASSERT(scopeObj.kind == Object::Kind::Constant);
ASSERT(getType(scopeObj.type).sizeInComponents == 1); ASSERT(getType(scopeObj).sizeInComponents == 1);
return scopeObj.constantValue[0]; return scopeObj.constantValue[0];
} }
...@@ -2378,7 +2376,7 @@ void SpirvShader::emitEpilog(SpirvRoutine *routine) const ...@@ -2378,7 +2376,7 @@ void SpirvShader::emitEpilog(SpirvRoutine *routine) const
{ {
Object::ID resultId = insn.word(2); Object::ID resultId = insn.word(2);
auto &object = getObject(resultId); auto &object = getObject(resultId);
auto &objectTy = getType(object.type); auto &objectTy = getType(object);
if(object.kind == Object::Kind::InterfaceVariable && objectTy.storageClass == spv::StorageClassOutput) if(object.kind == Object::Kind::InterfaceVariable && objectTy.storageClass == spv::StorageClassOutput)
{ {
auto &dst = routine->getVariable(resultId); auto &dst = routine->getVariable(resultId);
...@@ -2431,7 +2429,6 @@ VkShaderStageFlagBits SpirvShader::executionModelToStage(spv::ExecutionModel mod ...@@ -2431,7 +2429,6 @@ VkShaderStageFlagBits SpirvShader::executionModelToStage(spv::ExecutionModel mod
SpirvShader::Operand::Operand(SpirvShader const *shader, EmitState const *state, SpirvShader::Object::ID objId) SpirvShader::Operand::Operand(SpirvShader const *shader, EmitState const *state, SpirvShader::Object::ID objId)
: obj(shader->getObject(objId)) : obj(shader->getObject(objId))
, intermediate(obj.kind == SpirvShader::Object::Kind::Intermediate ? &state->getIntermediate(objId) : nullptr) , intermediate(obj.kind == SpirvShader::Object::Kind::Intermediate ? &state->getIntermediate(objId) : nullptr)
, type(obj.type)
{} {}
SpirvRoutine::SpirvRoutine(vk::PipelineLayout const *pipelineLayout) SpirvRoutine::SpirvRoutine(vk::PipelineLayout const *pipelineLayout)
......
...@@ -276,7 +276,6 @@ public: ...@@ -276,7 +276,6 @@ public:
Object::ID id() const { return definition.resultId(); } Object::ID id() const { return definition.resultId(); }
InsnIterator definition; InsnIterator definition;
Type::ID type; // TODO(b/129000021): Eliminate. Use typeId() instead.
std::unique_ptr<uint32_t[]> constantValue = nullptr; std::unique_ptr<uint32_t[]> constantValue = nullptr;
enum class Kind enum class Kind
...@@ -1033,8 +1032,6 @@ private: ...@@ -1033,8 +1032,6 @@ private:
return SIMD::UInt(constantValue[i]); return SIMD::UInt(constantValue[i]);
} }
SpirvShader::Type::ID const type; // TODO(b/129000021): Eliminate. Use typeId() instead.
Type::ID typeId() const Type::ID typeId() const
{ {
return obj.typeId(); return obj.typeId();
......
...@@ -41,7 +41,7 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesVector(InsnIterator insn, Em ...@@ -41,7 +41,7 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesVector(InsnIterator insn, Em
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents);
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
auto rhsType = getType(rhs.type); auto rhsType = getType(rhs);
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.sizeInComponents; i++)
{ {
...@@ -62,7 +62,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorTimesMatrix(InsnIterator insn, Em ...@@ -62,7 +62,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorTimesMatrix(InsnIterator insn, Em
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents);
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
auto lhsType = getType(lhs.type); auto lhsType = getType(lhs);
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.sizeInComponents; i++)
{ {
...@@ -86,7 +86,7 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesMatrix(InsnIterator insn, Em ...@@ -86,7 +86,7 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesMatrix(InsnIterator insn, Em
auto numColumns = type.definition.word(3); auto numColumns = type.definition.word(3);
auto numRows = getType(type.definition.word(2)).definition.word(3); auto numRows = getType(type.definition.word(2)).definition.word(3);
auto numAdds = getType(getObject(insn.word(3)).type).definition.word(3); auto numAdds = getType(getObject(insn.word(3))).definition.word(3);
for(auto row = 0u; row < numRows; row++) for(auto row = 0u; row < numRows; row++)
{ {
...@@ -110,8 +110,8 @@ SpirvShader::EmitResult SpirvShader::EmitOuterProduct(InsnIterator insn, EmitSta ...@@ -110,8 +110,8 @@ SpirvShader::EmitResult SpirvShader::EmitOuterProduct(InsnIterator insn, EmitSta
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents);
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
auto &lhsType = getType(lhs.type); auto &lhsType = getType(lhs);
auto &rhsType = getType(rhs.type); auto &rhsType = getType(rhs);
ASSERT(type.definition.opcode() == spv::OpTypeMatrix); ASSERT(type.definition.opcode() == spv::OpTypeMatrix);
ASSERT(lhsType.definition.opcode() == spv::OpTypeVector); ASSERT(lhsType.definition.opcode() == spv::OpTypeVector);
...@@ -319,7 +319,7 @@ SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState * ...@@ -319,7 +319,7 @@ SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState *
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.word(1));
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents);
auto &lhsType = getType(getObject(insn.word(3)).type); auto &lhsType = getType(getObject(insn.word(3)));
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
...@@ -523,7 +523,7 @@ SpirvShader::EmitResult SpirvShader::EmitDot(InsnIterator insn, EmitState *state ...@@ -523,7 +523,7 @@ SpirvShader::EmitResult SpirvShader::EmitDot(InsnIterator insn, EmitState *state
auto &type = getType(insn.word(1)); auto &type = getType(insn.word(1));
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents);
auto &lhsType = getType(getObject(insn.word(3)).type); auto &lhsType = getType(getObject(insn.word(3)));
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
......
...@@ -496,7 +496,7 @@ SpirvShader::EmitResult SpirvShader::EmitBranchConditional(InsnIterator insn, Em ...@@ -496,7 +496,7 @@ SpirvShader::EmitResult SpirvShader::EmitBranchConditional(InsnIterator insn, Em
auto falseBlockId = Block::ID(block.branchInstruction.word(3)); auto falseBlockId = Block::ID(block.branchInstruction.word(3));
auto cond = Operand(this, state, condId); auto cond = Operand(this, state, condId);
ASSERT_MSG(getType(cond.type).sizeInComponents == 1, "Condition must be a Boolean type scalar"); ASSERT_MSG(getType(cond).sizeInComponents == 1, "Condition must be a Boolean type scalar");
// TODO: Optimize for case where all lanes take same path. // TODO: Optimize for case where all lanes take same path.
...@@ -515,7 +515,7 @@ SpirvShader::EmitResult SpirvShader::EmitSwitch(InsnIterator insn, EmitState *st ...@@ -515,7 +515,7 @@ SpirvShader::EmitResult SpirvShader::EmitSwitch(InsnIterator insn, EmitState *st
auto selId = Object::ID(block.branchInstruction.word(1)); auto selId = Object::ID(block.branchInstruction.word(1));
auto sel = Operand(this, state, selId); auto sel = Operand(this, state, selId);
ASSERT_MSG(getType(sel.type).sizeInComponents == 1, "Selector must be a scalar"); ASSERT_MSG(getType(sel).sizeInComponents == 1, "Selector must be a scalar");
auto numCases = (block.branchInstruction.wordCount() - 3) / 2; auto numCases = (block.branchInstruction.wordCount() - 3) / 2;
......
...@@ -1165,7 +1165,7 @@ void SpirvShader::Impl::Debugger::exposeVariable( ...@@ -1165,7 +1165,7 @@ void SpirvShader::Impl::Debugger::exposeVariable(
case Object::Kind::Pointer: case Object::Kind::Pointer:
{ {
auto ptr = shader->GetPointerToData(id, 0, state) + sizeof(uint32_t) * wordOffset; auto ptr = shader->GetPointerToData(id, 0, state) + sizeof(uint32_t) * wordOffset;
auto &ptrTy = shader->getType(obj.type); auto &ptrTy = shader->getType(obj);
if(IsStorageInterleavedByLane(ptrTy.storageClass)) if(IsStorageInterleavedByLane(ptrTy.storageClass))
{ {
ptr = InterleaveByLane(ptr); ptr = InterleaveByLane(ptr);
...@@ -1288,7 +1288,7 @@ void SpirvShader::Impl::Debugger::exposeVariable( ...@@ -1288,7 +1288,7 @@ void SpirvShader::Impl::Debugger::exposeVariable(
// No debug type information. Derive from SPIR-V. // No debug type information. Derive from SPIR-V.
Operand val(shader, state, id); Operand val(shader, state, id);
switch(shader->getType(val.type).opcode()) switch(shader->getType(val).opcode())
{ {
case spv::OpTypeInt: case spv::OpTypeInt:
{ {
...@@ -1302,7 +1302,7 @@ void SpirvShader::Impl::Debugger::exposeVariable( ...@@ -1302,7 +1302,7 @@ void SpirvShader::Impl::Debugger::exposeVariable(
break; break;
case spv::OpTypeVector: case spv::OpTypeVector:
{ {
auto count = shader->getType(val.type).definition.word(3); auto count = shader->getType(val).definition.word(3);
switch(count) switch(count)
{ {
case 1: case 1:
...@@ -1331,7 +1331,7 @@ void SpirvShader::Impl::Debugger::exposeVariable( ...@@ -1331,7 +1331,7 @@ void SpirvShader::Impl::Debugger::exposeVariable(
break; break;
case spv::OpTypePointer: case spv::OpTypePointer:
{ {
auto objectTy = shader->getType(shader->getObject(id).type); auto objectTy = shader->getType(shader->getObject(id));
bool interleavedByLane = IsStorageInterleavedByLane(objectTy.storageClass); bool interleavedByLane = IsStorageInterleavedByLane(objectTy.storageClass);
auto ptr = state->getPointer(id); auto ptr = state->getPointer(id);
auto ptrGroup = group.group<Key>(key); auto ptrGroup = group.group<Key>(key);
......
...@@ -317,7 +317,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -317,7 +317,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Length: case GLSLstd450Length:
{ {
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
SIMD::Float d = Dot(getType(getObject(insn.word(5)).type).sizeInComponents, x, x); SIMD::Float d = Dot(getType(getObject(insn.word(5))).sizeInComponents, x, x);
dst.move(0, Sqrt(d)); dst.move(0, Sqrt(d));
break; break;
...@@ -325,7 +325,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -325,7 +325,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Normalize: case GLSLstd450Normalize:
{ {
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
SIMD::Float d = Dot(getType(getObject(insn.word(5)).type).sizeInComponents, x, x); SIMD::Float d = Dot(getType(getObject(insn.word(5))).sizeInComponents, x, x);
SIMD::Float invLength = SIMD::Float(1.0f) / Sqrt(d); SIMD::Float invLength = SIMD::Float(1.0f) / Sqrt(d);
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.sizeInComponents; i++)
...@@ -338,7 +338,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -338,7 +338,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto p0 = Operand(this, state, insn.word(5)); auto p0 = Operand(this, state, insn.word(5));
auto p1 = Operand(this, state, insn.word(6)); auto p1 = Operand(this, state, insn.word(6));
auto p0Type = getType(p0.type); auto p0Type = getType(p0);
// sqrt(dot(p0-p1, p0-p1)) // sqrt(dot(p0-p1, p0-p1))
SIMD::Float d = (p0.Float(0) - p1.Float(0)) * (p0.Float(0) - p1.Float(0)); SIMD::Float d = (p0.Float(0) - p1.Float(0)) * (p0.Float(0) - p1.Float(0));
...@@ -355,7 +355,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -355,7 +355,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
auto ptrId = Object::ID(insn.word(6)); auto ptrId = Object::ID(insn.word(6));
auto ptrTy = getType(getObject(ptrId).type); auto ptrTy = getType(getObject(ptrId));
auto ptr = GetPointerToData(ptrId, 0, state); auto ptr = GetPointerToData(ptrId, 0, state);
bool interleavedByLane = IsStorageInterleavedByLane(ptrTy.storageClass); bool interleavedByLane = IsStorageInterleavedByLane(ptrTy.storageClass);
// TODO: GLSL modf() takes an output parameter and thus the pointer is assumed // TODO: GLSL modf() takes an output parameter and thus the pointer is assumed
...@@ -378,7 +378,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -378,7 +378,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450ModfStruct: case GLSLstd450ModfStruct:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
auto valTy = getType(val.type); auto valTy = getType(val);
for(auto i = 0u; i < valTy.sizeInComponents; i++) for(auto i = 0u; i < valTy.sizeInComponents; i++)
{ {
...@@ -501,7 +501,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -501,7 +501,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
auto ptrId = Object::ID(insn.word(6)); auto ptrId = Object::ID(insn.word(6));
auto ptrTy = getType(getObject(ptrId).type); auto ptrTy = getType(getObject(ptrId));
auto ptr = GetPointerToData(ptrId, 0, state); auto ptr = GetPointerToData(ptrId, 0, state);
bool interleavedByLane = IsStorageInterleavedByLane(ptrTy.storageClass); bool interleavedByLane = IsStorageInterleavedByLane(ptrTy.storageClass);
// TODO: GLSL frexp() takes an output parameter and thus the pointer is assumed // TODO: GLSL frexp() takes an output parameter and thus the pointer is assumed
...@@ -527,7 +527,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -527,7 +527,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450FrexpStruct: case GLSLstd450FrexpStruct:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
auto numComponents = getType(val.type).sizeInComponents; auto numComponents = getType(val).sizeInComponents;
for(auto i = 0u; i < numComponents; i++) for(auto i = 0u; i < numComponents; i++)
{ {
auto significandAndExponent = Frexp(val.Float(i)); auto significandAndExponent = Frexp(val.Float(i));
...@@ -785,7 +785,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -785,7 +785,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Determinant: case GLSLstd450Determinant:
{ {
auto mat = Operand(this, state, insn.word(5)); auto mat = Operand(this, state, insn.word(5));
auto numComponents = getType(mat.type).sizeInComponents; auto numComponents = getType(mat).sizeInComponents;
switch(numComponents) switch(numComponents)
{ {
case 4: // 2x2 case 4: // 2x2
...@@ -814,7 +814,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -814,7 +814,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450MatrixInverse: case GLSLstd450MatrixInverse:
{ {
auto mat = Operand(this, state, insn.word(5)); auto mat = Operand(this, state, insn.word(5));
auto numComponents = getType(mat.type).sizeInComponents; auto numComponents = getType(mat).sizeInComponents;
switch(numComponents) switch(numComponents)
{ {
case 4: // 2x2 case 4: // 2x2
......
...@@ -182,7 +182,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -182,7 +182,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
{ {
auto valueId = Object::ID(insn.word(4)); auto valueId = Object::ID(insn.word(4));
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
ASSERT(getType(getObject(valueId).type).sizeInComponents == 4); ASSERT(getType(getObject(valueId)).sizeInComponents == 4);
Operand value(this, state, valueId); Operand value(this, state, valueId);
auto bit = (value.Int(0) >> SIMD::Int(0, 1, 2, 3)) & SIMD::Int(1); auto bit = (value.Int(0) >> SIMD::Int(0, 1, 2, 3)) & SIMD::Int(1);
dst.move(0, -bit); dst.move(0, -bit);
...@@ -194,8 +194,8 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -194,8 +194,8 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
auto valueId = Object::ID(insn.word(4)); auto valueId = Object::ID(insn.word(4));
auto indexId = Object::ID(insn.word(5)); auto indexId = Object::ID(insn.word(5));
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
ASSERT(getType(getObject(valueId).type).sizeInComponents == 4); ASSERT(getType(getObject(valueId)).sizeInComponents == 4);
ASSERT(getType(getObject(indexId).type).sizeInComponents == 1); ASSERT(getType(getObject(indexId)).sizeInComponents == 1);
Operand value(this, state, valueId); Operand value(this, state, valueId);
Operand index(this, state, indexId); Operand index(this, state, indexId);
auto vecIdx = index.Int(0) / SIMD::Int(32); auto vecIdx = index.Int(0) / SIMD::Int(32);
...@@ -213,7 +213,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -213,7 +213,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
auto operation = spv::GroupOperation(insn.word(4)); auto operation = spv::GroupOperation(insn.word(4));
auto valueId = Object::ID(insn.word(5)); auto valueId = Object::ID(insn.word(5));
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
ASSERT(getType(getObject(valueId).type).sizeInComponents == 4); ASSERT(getType(getObject(valueId)).sizeInComponents == 4);
Operand value(this, state, valueId); Operand value(this, state, valueId);
switch(operation) switch(operation)
{ {
...@@ -236,7 +236,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -236,7 +236,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
{ {
auto valueId = Object::ID(insn.word(4)); auto valueId = Object::ID(insn.word(4));
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
ASSERT(getType(getObject(valueId).type).sizeInComponents == 4); ASSERT(getType(getObject(valueId)).sizeInComponents == 4);
Operand value(this, state, valueId); Operand value(this, state, valueId);
dst.move(0, Cttz(value.UInt(0) & SIMD::UInt(15), true)); dst.move(0, Cttz(value.UInt(0) & SIMD::UInt(15), true));
break; break;
...@@ -246,7 +246,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -246,7 +246,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
{ {
auto valueId = Object::ID(insn.word(4)); auto valueId = Object::ID(insn.word(4));
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
ASSERT(getType(getObject(valueId).type).sizeInComponents == 4); ASSERT(getType(getObject(valueId)).sizeInComponents == 4);
Operand value(this, state, valueId); Operand value(this, state, valueId);
dst.move(0, SIMD::UInt(31) - Ctlz(value.UInt(0) & SIMD::UInt(15), false)); dst.move(0, SIMD::UInt(31) - Ctlz(value.UInt(0) & SIMD::UInt(15), false));
break; break;
......
...@@ -121,7 +121,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio ...@@ -121,7 +121,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio
auto samplerDescriptor = (sampledImage.opcode() == spv::OpSampledImage) ? state->getPointer(sampledImage.definition.word(4)).base : imageDescriptor; auto samplerDescriptor = (sampledImage.opcode() == spv::OpSampledImage) ? state->getPointer(sampledImage.definition.word(4)).base : imageDescriptor;
auto coordinate = Operand(this, state, coordinateId); auto coordinate = Operand(this, state, coordinateId);
auto &coordinateType = getType(coordinate.type); auto &coordinateType = getType(coordinate);
Pointer<Byte> sampler = samplerDescriptor + OFFSET(vk::SampledImageDescriptor, sampler); // vk::Sampler* Pointer<Byte> sampler = samplerDescriptor + OFFSET(vk::SampledImageDescriptor, sampler); // vk::Sampler*
Pointer<Byte> texture = imageDescriptor + OFFSET(vk::SampledImageDescriptor, texture); // sw::Texture* Pointer<Byte> texture = imageDescriptor + OFFSET(vk::SampledImageDescriptor, texture); // sw::Texture*
...@@ -129,7 +129,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio ...@@ -129,7 +129,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio
// Above we assumed that if the SampledImage operand is not the result of an OpSampledImage, // Above we assumed that if the SampledImage operand is not the result of an OpSampledImage,
// it must be a combined image sampler loaded straight from the descriptor set. For OpImageFetch // it must be a combined image sampler loaded straight from the descriptor set. For OpImageFetch
// it's just an Image operand, so there's no sampler descriptor data. // it's just an Image operand, so there's no sampler descriptor data.
if(getType(sampledImage.type).opcode() != spv::OpTypeSampledImage) if(getType(sampledImage).opcode() != spv::OpTypeSampledImage)
{ {
sampler = Pointer<Byte>(nullptr); sampler = Pointer<Byte>(nullptr);
} }
...@@ -248,8 +248,8 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio ...@@ -248,8 +248,8 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio
{ {
auto dxValue = Operand(this, state, gradDxId); auto dxValue = Operand(this, state, gradDxId);
auto dyValue = Operand(this, state, gradDyId); auto dyValue = Operand(this, state, gradDyId);
auto &dxyType = getType(dxValue.type); auto &dxyType = getType(dxValue);
ASSERT(dxyType.sizeInComponents == getType(dyValue.type).sizeInComponents); ASSERT(dxyType.sizeInComponents == getType(dyValue).sizeInComponents);
instruction.grad = dxyType.sizeInComponents; instruction.grad = dxyType.sizeInComponents;
...@@ -275,7 +275,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio ...@@ -275,7 +275,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio
if(constOffset) if(constOffset)
{ {
auto offsetValue = Operand(this, state, offsetId); auto offsetValue = Operand(this, state, offsetId);
auto &offsetType = getType(offsetValue.type); auto &offsetType = getType(offsetValue);
instruction.offset = offsetType.sizeInComponents; instruction.offset = offsetType.sizeInComponents;
...@@ -346,7 +346,7 @@ void SpirvShader::GetImageDimensions(EmitState const *state, Type const &resultT ...@@ -346,7 +346,7 @@ void SpirvShader::GetImageDimensions(EmitState const *state, Type const &resultT
{ {
auto routine = state->routine; auto routine = state->routine;
auto &image = getObject(imageId); auto &image = getObject(imageId);
auto &imageType = getType(image.type); auto &imageType = getType(image);
ASSERT(imageType.definition.opcode() == spv::OpTypeImage); ASSERT(imageType.definition.opcode() == spv::OpTypeImage);
bool isArrayed = imageType.definition.word(5) != 0; bool isArrayed = imageType.definition.word(5) != 0;
...@@ -387,7 +387,7 @@ void SpirvShader::GetImageDimensions(EmitState const *state, Type const &resultT ...@@ -387,7 +387,7 @@ void SpirvShader::GetImageDimensions(EmitState const *state, Type const &resultT
if(lodId != 0) if(lodId != 0)
{ {
auto lodVal = Operand(this, state, lodId); auto lodVal = Operand(this, state, lodId);
ASSERT(getType(lodVal.type).sizeInComponents == 1); ASSERT(getType(lodVal).sizeInComponents == 1);
auto lod = lodVal.Int(0); auto lod = lodVal.Int(0);
auto one = SIMD::Int(1); auto one = SIMD::Int(1);
for(uint32_t i = 0; i < dimensions; i++) for(uint32_t i = 0; i < dimensions; i++)
...@@ -446,7 +446,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQuerySamples(InsnIterator insn, Em ...@@ -446,7 +446,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQuerySamples(InsnIterator insn, Em
ASSERT(resultTy.sizeInComponents == 1); ASSERT(resultTy.sizeInComponents == 1);
auto resultId = Object::ID(insn.word(2)); auto resultId = Object::ID(insn.word(2));
auto imageId = Object::ID(insn.word(3)); auto imageId = Object::ID(insn.word(3));
auto imageTy = getType(getObject(imageId).type); auto imageTy = getType(getObject(imageId));
ASSERT(imageTy.definition.opcode() == spv::OpTypeImage); ASSERT(imageTy.definition.opcode() == spv::OpTypeImage);
ASSERT(imageTy.definition.word(3) == spv::Dim2D); ASSERT(imageTy.definition.word(3) == spv::Dim2D);
ASSERT(imageTy.definition.word(6 /* MS */) == 1); ASSERT(imageTy.definition.word(6 /* MS */) == 1);
...@@ -482,12 +482,12 @@ SIMD::Pointer SpirvShader::GetTexelAddress(EmitState const *state, SIMD::Pointer ...@@ -482,12 +482,12 @@ SIMD::Pointer SpirvShader::GetTexelAddress(EmitState const *state, SIMD::Pointer
auto routine = state->routine; auto routine = state->routine;
bool isArrayed = imageType.definition.word(5) != 0; bool isArrayed = imageType.definition.word(5) != 0;
auto dim = static_cast<spv::Dim>(imageType.definition.word(3)); auto dim = static_cast<spv::Dim>(imageType.definition.word(3));
int dims = getType(coordinate.type).sizeInComponents - (isArrayed ? 1 : 0); int dims = getType(coordinate).sizeInComponents - (isArrayed ? 1 : 0);
SIMD::Int u = coordinate.Int(0); SIMD::Int u = coordinate.Int(0);
SIMD::Int v = SIMD::Int(0); SIMD::Int v = SIMD::Int(0);
if(getType(coordinate.type).sizeInComponents > 1) if(getType(coordinate).sizeInComponents > 1)
{ {
v = coordinate.Int(1); v = coordinate.Int(1);
} }
...@@ -544,7 +544,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageRead(InsnIterator insn, EmitState ...@@ -544,7 +544,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageRead(InsnIterator insn, EmitState
auto &resultType = getType(Type::ID(insn.word(1))); auto &resultType = getType(Type::ID(insn.word(1)));
auto imageId = Object::ID(insn.word(3)); auto imageId = Object::ID(insn.word(3));
auto &image = getObject(imageId); auto &image = getObject(imageId);
auto &imageType = getType(image.type); auto &imageType = getType(image);
Object::ID resultId = insn.word(2); Object::ID resultId = insn.word(2);
Object::ID sampleId = 0; Object::ID sampleId = 0;
...@@ -848,7 +848,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageWrite(InsnIterator insn, EmitState ...@@ -848,7 +848,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageWrite(InsnIterator insn, EmitState
{ {
auto imageId = Object::ID(insn.word(1)); auto imageId = Object::ID(insn.word(1));
auto &image = getObject(imageId); auto &image = getObject(imageId);
auto &imageType = getType(image.type); auto &imageType = getType(image);
ASSERT(imageType.definition.opcode() == spv::OpTypeImage); ASSERT(imageType.definition.opcode() == spv::OpTypeImage);
...@@ -1000,7 +1000,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageTexelPointer(InsnIterator insn, Em ...@@ -1000,7 +1000,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageTexelPointer(InsnIterator insn, Em
auto &image = getObject(imageId); auto &image = getObject(imageId);
// Note: OpImageTexelPointer is unusual in that the image is passed by pointer. // Note: OpImageTexelPointer is unusual in that the image is passed by pointer.
// Look through to get the actual image type. // Look through to get the actual image type.
auto &imageType = getType(getType(image.type).element); auto &imageType = getType(getType(image).element);
Object::ID resultId = insn.word(2); Object::ID resultId = insn.word(2);
ASSERT(imageType.opcode() == spv::OpTypeImage); ASSERT(imageType.opcode() == spv::OpTypeImage);
......
...@@ -28,14 +28,14 @@ SpirvShader::EmitResult SpirvShader::EmitLoad(InsnIterator insn, EmitState *stat ...@@ -28,14 +28,14 @@ SpirvShader::EmitResult SpirvShader::EmitLoad(InsnIterator insn, EmitState *stat
Object::ID resultId = insn.word(2); Object::ID resultId = insn.word(2);
Object::ID pointerId = insn.word(3); Object::ID pointerId = insn.word(3);
auto &result = getObject(resultId); auto &result = getObject(resultId);
auto &resultTy = getType(result.type); auto &resultTy = getType(result);
auto &pointer = getObject(pointerId); auto &pointer = getObject(pointerId);
auto &pointerTy = getType(pointer.type); auto &pointerTy = getType(pointer);
std::memory_order memoryOrder = std::memory_order_relaxed; std::memory_order memoryOrder = std::memory_order_relaxed;
ASSERT(getType(pointer.type).element == result.type); ASSERT(getType(pointer).element == result.typeId());
ASSERT(Type::ID(insn.word(1)) == result.type); ASSERT(Type::ID(insn.word(1)) == result.typeId());
ASSERT(!atomic || getType(getType(pointer.type).element).opcode() == spv::OpTypeInt); // Vulkan 1.1: "Atomic instructions must declare a scalar 32-bit integer type, for the value pointed to by Pointer." ASSERT(!atomic || getType(getType(pointer).element).opcode() == spv::OpTypeInt); // Vulkan 1.1: "Atomic instructions must declare a scalar 32-bit integer type, for the value pointed to by Pointer."
if(pointerTy.storageClass == spv::StorageClassUniformConstant) if(pointerTy.storageClass == spv::StorageClassUniformConstant)
{ {
...@@ -73,7 +73,7 @@ SpirvShader::EmitResult SpirvShader::EmitStore(InsnIterator insn, EmitState *sta ...@@ -73,7 +73,7 @@ SpirvShader::EmitResult SpirvShader::EmitStore(InsnIterator insn, EmitState *sta
Object::ID objectId = insn.word(atomic ? 4 : 2); Object::ID objectId = insn.word(atomic ? 4 : 2);
auto &object = getObject(objectId); auto &object = getObject(objectId);
auto &pointer = getObject(pointerId); auto &pointer = getObject(pointerId);
auto &pointerTy = getType(pointer.type); auto &pointerTy = getType(pointer);
auto &elementTy = getType(pointerTy.element); auto &elementTy = getType(pointerTy.element);
std::memory_order memoryOrder = std::memory_order_relaxed; std::memory_order memoryOrder = std::memory_order_relaxed;
...@@ -125,7 +125,7 @@ SpirvShader::EmitResult SpirvShader::EmitVariable(InsnIterator insn, EmitState * ...@@ -125,7 +125,7 @@ SpirvShader::EmitResult SpirvShader::EmitVariable(InsnIterator insn, EmitState *
auto routine = state->routine; auto routine = state->routine;
Object::ID resultId = insn.word(2); Object::ID resultId = insn.word(2);
auto &object = getObject(resultId); auto &object = getObject(resultId);
auto &objectTy = getType(object.type); auto &objectTy = getType(object);
switch(objectTy.storageClass) switch(objectTy.storageClass)
{ {
...@@ -257,8 +257,8 @@ SpirvShader::EmitResult SpirvShader::EmitCopyMemory(InsnIterator insn, EmitState ...@@ -257,8 +257,8 @@ SpirvShader::EmitResult SpirvShader::EmitCopyMemory(InsnIterator insn, EmitState
{ {
Object::ID dstPtrId = insn.word(1); Object::ID dstPtrId = insn.word(1);
Object::ID srcPtrId = insn.word(2); Object::ID srcPtrId = insn.word(2);
auto &dstPtrTy = getType(getObject(dstPtrId).type); auto &dstPtrTy = getType(getObject(dstPtrId));
auto &srcPtrTy = getType(getObject(srcPtrId).type); auto &srcPtrTy = getType(getObject(srcPtrId));
ASSERT(dstPtrTy.element == srcPtrTy.element); ASSERT(dstPtrTy.element == srcPtrTy.element);
bool dstInterleavedByLane = IsStorageInterleavedByLane(dstPtrTy.storageClass); bool dstInterleavedByLane = IsStorageInterleavedByLane(dstPtrTy.storageClass);
...@@ -362,10 +362,11 @@ void SpirvShader::VisitMemoryObjectInner(sw::SpirvShader::Type::ID id, sw::Spirv ...@@ -362,10 +362,11 @@ void SpirvShader::VisitMemoryObjectInner(sw::SpirvShader::Type::ID id, sw::Spirv
} }
} }
void SpirvShader::VisitMemoryObject(sw::SpirvShader::Object::ID id, const MemoryVisitor &f) const void SpirvShader::VisitMemoryObject(Object::ID id, const MemoryVisitor &f) const
{ {
auto typeId = getObject(id).type; auto typeId = getObject(id).typeId();
auto const &type = getType(typeId); auto const &type = getType(typeId);
if(IsExplicitLayout(type.storageClass)) if(IsExplicitLayout(type.storageClass))
{ {
Decorations d{}; Decorations d{};
......
...@@ -69,11 +69,11 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn) ...@@ -69,11 +69,11 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn)
{ {
auto &result = CreateConstant(insn); auto &result = CreateConstant(insn);
auto const &cond = getObject(insn.word(4)); auto const &cond = getObject(insn.word(4));
auto condIsScalar = (getType(cond.type).sizeInComponents == 1); auto condIsScalar = (getType(cond).sizeInComponents == 1);
auto const &left = getObject(insn.word(5)); auto const &left = getObject(insn.word(5));
auto const &right = getObject(insn.word(6)); auto const &right = getObject(insn.word(6));
for(auto i = 0u; i < getType(result.type).sizeInComponents; i++) for(auto i = 0u; i < getType(result).sizeInComponents; i++)
{ {
auto sel = cond.constantValue[condIsScalar ? 0 : i]; auto sel = cond.constantValue[condIsScalar ? 0 : i];
result.constantValue[i] = sel ? left.constantValue[i] : right.constantValue[i]; result.constantValue[i] = sel ? left.constantValue[i] : right.constantValue[i];
...@@ -85,9 +85,9 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn) ...@@ -85,9 +85,9 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn)
{ {
auto &result = CreateConstant(insn); auto &result = CreateConstant(insn);
auto const &compositeObject = getObject(insn.word(4)); auto const &compositeObject = getObject(insn.word(4));
auto firstComponent = WalkLiteralAccessChain(compositeObject.type, insn.wordCount() - 5, insn.wordPointer(5)); auto firstComponent = WalkLiteralAccessChain(compositeObject.typeId(), insn.wordCount() - 5, insn.wordPointer(5));
for(auto i = 0u; i < getType(result.type).sizeInComponents; i++) for(auto i = 0u; i < getType(result).sizeInComponents; i++)
{ {
result.constantValue[i] = compositeObject.constantValue[firstComponent + i]; result.constantValue[i] = compositeObject.constantValue[firstComponent + i];
} }
...@@ -99,7 +99,7 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn) ...@@ -99,7 +99,7 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn)
auto &result = CreateConstant(insn); auto &result = CreateConstant(insn);
auto const &newPart = getObject(insn.word(4)); auto const &newPart = getObject(insn.word(4));
auto const &oldObject = getObject(insn.word(5)); auto const &oldObject = getObject(insn.word(5));
auto firstNewComponent = WalkLiteralAccessChain(result.type, insn.wordCount() - 6, insn.wordPointer(6)); auto firstNewComponent = WalkLiteralAccessChain(result.typeId(), insn.wordCount() - 6, insn.wordPointer(6));
// old components before // old components before
for(auto i = 0u; i < firstNewComponent; i++) for(auto i = 0u; i < firstNewComponent; i++)
...@@ -107,12 +107,12 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn) ...@@ -107,12 +107,12 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn)
result.constantValue[i] = oldObject.constantValue[i]; result.constantValue[i] = oldObject.constantValue[i];
} }
// new part // new part
for(auto i = 0u; i < getType(newPart.type).sizeInComponents; i++) for(auto i = 0u; i < getType(newPart).sizeInComponents; i++)
{ {
result.constantValue[firstNewComponent + i] = newPart.constantValue[i]; result.constantValue[firstNewComponent + i] = newPart.constantValue[i];
} }
// old components after // old components after
for(auto i = firstNewComponent + getType(newPart.type).sizeInComponents; i < getType(result.type).sizeInComponents; i++) for(auto i = firstNewComponent + getType(newPart).sizeInComponents; i < getType(result).sizeInComponents; i++)
{ {
result.constantValue[i] = oldObject.constantValue[i]; result.constantValue[i] = oldObject.constantValue[i];
} }
...@@ -125,7 +125,7 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn) ...@@ -125,7 +125,7 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn)
auto const &firstHalf = getObject(insn.word(4)); auto const &firstHalf = getObject(insn.word(4));
auto const &secondHalf = getObject(insn.word(5)); auto const &secondHalf = getObject(insn.word(5));
for(auto i = 0u; i < getType(result.type).sizeInComponents; i++) for(auto i = 0u; i < getType(result).sizeInComponents; i++)
{ {
auto selector = insn.word(6 + i); auto selector = insn.word(6 + i);
if(selector == static_cast<uint32_t>(-1)) if(selector == static_cast<uint32_t>(-1))
...@@ -133,13 +133,13 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn) ...@@ -133,13 +133,13 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn)
// Undefined value, we'll use zero // Undefined value, we'll use zero
result.constantValue[i] = 0; result.constantValue[i] = 0;
} }
else if(selector < getType(firstHalf.type).sizeInComponents) else if(selector < getType(firstHalf).sizeInComponents)
{ {
result.constantValue[i] = firstHalf.constantValue[selector]; result.constantValue[i] = firstHalf.constantValue[selector];
} }
else else
{ {
result.constantValue[i] = secondHalf.constantValue[selector - getType(firstHalf.type).sizeInComponents]; result.constantValue[i] = secondHalf.constantValue[selector - getType(firstHalf).sizeInComponents];
} }
} }
break; break;
...@@ -159,7 +159,7 @@ void SpirvShader::EvalSpecConstantUnaryOp(InsnIterator insn) ...@@ -159,7 +159,7 @@ void SpirvShader::EvalSpecConstantUnaryOp(InsnIterator insn)
auto opcode = static_cast<spv::Op>(insn.word(3)); auto opcode = static_cast<spv::Op>(insn.word(3));
auto const &lhs = getObject(insn.word(4)); auto const &lhs = getObject(insn.word(4));
auto size = getType(lhs.type).sizeInComponents; auto size = getType(lhs).sizeInComponents;
for(auto i = 0u; i < size; i++) for(auto i = 0u; i < size; i++)
{ {
...@@ -210,7 +210,7 @@ void SpirvShader::EvalSpecConstantBinaryOp(InsnIterator insn) ...@@ -210,7 +210,7 @@ void SpirvShader::EvalSpecConstantBinaryOp(InsnIterator insn)
auto opcode = static_cast<spv::Op>(insn.word(3)); auto opcode = static_cast<spv::Op>(insn.word(3));
auto const &lhs = getObject(insn.word(4)); auto const &lhs = getObject(insn.word(4));
auto const &rhs = getObject(insn.word(5)); auto const &rhs = getObject(insn.word(5));
auto size = getType(lhs.type).sizeInComponents; auto size = getType(lhs).sizeInComponents;
for(auto i = 0u; i < size; i++) for(auto i = 0u; i < size; i++)
{ {
......
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