Commit 71186756 by Nicolas Capens Committed by Nicolas Capens

Use the type and result ID helpers

Avoid directly accessing SPIR-V instruction words. The helper methods provide self-explanatory semantics so we can eliminate local variables to store these IDs. Bug: b/129000021 Change-Id: Ie42782d53b9c24014b6a1b1f51b82085b6c2ebef Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43694 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarBen Clayton <bclayton@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
parent 72f089c6
...@@ -816,15 +816,16 @@ void SpirvShader::ProcessInterfaceVariable(Object &object) ...@@ -816,15 +816,16 @@ void SpirvShader::ProcessInterfaceVariable(Object &object)
if(objectTy.isBuiltInBlock) if(objectTy.isBuiltInBlock)
{ {
// walk the builtin block, registering each of its members separately. // Walk the builtin block, registering each of its members separately.
auto m = memberDecorations.find(objectTy.element); auto m = memberDecorations.find(objectTy.element);
ASSERT(m != memberDecorations.end()); // otherwise we wouldn't have marked the type chain ASSERT(m != memberDecorations.end()); // Otherwise we wouldn't have marked the type chain
auto &structType = pointeeTy.definition; auto &structType = pointeeTy.definition;
auto memberIndex = 0u;
auto offset = 0u; auto offset = 0u;
auto word = 2u;
for(auto &member : m->second) for(auto &member : m->second)
{ {
auto &memberType = getType(structType.word(word)); auto &memberType = getType(structType.word(2 + memberIndex));
if(member.HasBuiltIn) if(member.HasBuiltIn)
{ {
...@@ -832,8 +833,9 @@ void SpirvShader::ProcessInterfaceVariable(Object &object) ...@@ -832,8 +833,9 @@ void SpirvShader::ProcessInterfaceVariable(Object &object)
} }
offset += memberType.sizeInComponents; offset += memberType.sizeInComponents;
++word; ++memberIndex;
} }
return; return;
} }
...@@ -1510,22 +1512,19 @@ void SpirvShader::emitProlog(SpirvRoutine *routine) const ...@@ -1510,22 +1512,19 @@ void SpirvShader::emitProlog(SpirvRoutine *routine) const
{ {
case spv::OpVariable: case spv::OpVariable:
{ {
Type::ID resultPointerTypeId = insn.word(1); auto resultPointerType = getType(insn.resultTypeId());
auto resultPointerType = getType(resultPointerTypeId);
auto pointeeType = getType(resultPointerType.element); auto pointeeType = getType(resultPointerType.element);
if(pointeeType.sizeInComponents > 0) // TODO: what to do about zero-slot objects? if(pointeeType.sizeInComponents > 0) // TODO: what to do about zero-slot objects?
{ {
Object::ID resultId = insn.word(2); routine->createVariable(insn.resultId(), pointeeType.sizeInComponents);
routine->createVariable(resultId, pointeeType.sizeInComponents);
} }
break; break;
} }
case spv::OpPhi: case spv::OpPhi:
{ {
auto type = getType(insn.word(1)); auto type = getType(insn.resultTypeId());
Object::ID resultId = insn.word(2); routine->phis.emplace(insn.resultId(), SpirvRoutine::Variable(type.sizeInComponents));
routine->phis.emplace(resultId, SpirvRoutine::Variable(type.sizeInComponents));
break; break;
} }
...@@ -1541,11 +1540,8 @@ void SpirvShader::emitProlog(SpirvRoutine *routine) const ...@@ -1541,11 +1540,8 @@ void SpirvShader::emitProlog(SpirvRoutine *routine) const
case spv::OpImageSampleProjDrefImplicitLod: case spv::OpImageSampleProjDrefImplicitLod:
case spv::OpImageSampleProjExplicitLod: case spv::OpImageSampleProjExplicitLod:
case spv::OpImageSampleProjImplicitLod: case spv::OpImageSampleProjImplicitLod:
{ routine->samplerCache.emplace(insn.resultId(), SpirvRoutine::SamplerCache{});
Object::ID resultId = insn.word(2);
routine->samplerCache.emplace(resultId, SpirvRoutine::SamplerCache{});
break; break;
}
default: default:
// Nothing else produces interface variables, so can all be safely ignored. // Nothing else produces interface variables, so can all be safely ignored.
...@@ -1998,8 +1994,8 @@ SpirvShader::EmitResult SpirvShader::EmitAccessChain(InsnIterator insn, EmitStat ...@@ -1998,8 +1994,8 @@ SpirvShader::EmitResult SpirvShader::EmitAccessChain(InsnIterator insn, EmitStat
SpirvShader::EmitResult SpirvShader::EmitCompositeConstruct(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitCompositeConstruct(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto offset = 0u; auto offset = 0u;
for(auto i = 0u; i < insn.wordCount() - 3; i++) for(auto i = 0u; i < insn.wordCount() - 3; i++)
...@@ -2022,7 +2018,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit ...@@ -2022,7 +2018,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit
{ {
Type::ID resultTypeId = insn.word(1); Type::ID resultTypeId = insn.word(1);
auto &type = getType(resultTypeId); auto &type = getType(resultTypeId);
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto &newPartObject = getObject(insn.word(3)); auto &newPartObject = getObject(insn.word(3));
auto &newPartObjectTy = getType(newPartObject); auto &newPartObjectTy = getType(newPartObject);
auto firstNewComponent = WalkLiteralAccessChain(resultTypeId, insn.wordCount() - 5, insn.wordPointer(5)); auto firstNewComponent = WalkLiteralAccessChain(resultTypeId, insn.wordCount() - 5, insn.wordPointer(5));
...@@ -2051,8 +2047,8 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit ...@@ -2051,8 +2047,8 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit
SpirvShader::EmitResult SpirvShader::EmitCompositeExtract(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitCompositeExtract(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto &compositeObject = getObject(insn.word(3)); auto &compositeObject = getObject(insn.word(3));
Type::ID compositeTypeId = compositeObject.definition.word(1); Type::ID compositeTypeId = compositeObject.definition.word(1);
auto firstComponent = WalkLiteralAccessChain(compositeTypeId, insn.wordCount() - 4, insn.wordPointer(4)); auto firstComponent = WalkLiteralAccessChain(compositeTypeId, insn.wordCount() - 4, insn.wordPointer(4));
...@@ -2068,8 +2064,8 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeExtract(InsnIterator insn, Emi ...@@ -2068,8 +2064,8 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeExtract(InsnIterator insn, Emi
SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
// 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.
...@@ -2102,8 +2098,8 @@ SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitSt ...@@ -2102,8 +2098,8 @@ SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitSt
SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto &srcType = getType(getObject(insn.word(3))); auto &srcType = getType(getObject(insn.word(3)));
Operand src(this, state, insn.word(3)); Operand src(this, state, insn.word(3));
...@@ -2122,8 +2118,8 @@ SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn, ...@@ -2122,8 +2118,8 @@ SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn,
SpirvShader::EmitResult SpirvShader::EmitVectorInsertDynamic(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitVectorInsertDynamic(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
Operand src(this, state, insn.word(3)); Operand src(this, state, insn.word(3));
Operand component(this, state, insn.word(4)); Operand component(this, state, insn.word(4));
...@@ -2139,8 +2135,8 @@ SpirvShader::EmitResult SpirvShader::EmitVectorInsertDynamic(InsnIterator insn, ...@@ -2139,8 +2135,8 @@ SpirvShader::EmitResult SpirvShader::EmitVectorInsertDynamic(InsnIterator insn,
SpirvShader::EmitResult SpirvShader::EmitSelect(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitSelect(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto cond = Operand(this, state, insn.word(3)); auto cond = Operand(this, state, insn.word(3));
auto condIsScalar = (getType(cond).sizeInComponents == 1); auto condIsScalar = (getType(cond).sizeInComponents == 1);
auto lhs = Operand(this, state, insn.word(4)); auto lhs = Operand(this, state, insn.word(4));
...@@ -2157,9 +2153,9 @@ SpirvShader::EmitResult SpirvShader::EmitSelect(InsnIterator insn, EmitState *st ...@@ -2157,9 +2153,9 @@ SpirvShader::EmitResult SpirvShader::EmitSelect(InsnIterator insn, EmitState *st
SpirvShader::EmitResult SpirvShader::EmitAny(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitAny(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto &srcType = getType(getObject(insn.word(3))); auto &srcType = getType(getObject(insn.word(3)));
auto src = Operand(this, state, insn.word(3)); auto src = Operand(this, state, insn.word(3));
...@@ -2176,9 +2172,9 @@ SpirvShader::EmitResult SpirvShader::EmitAny(InsnIterator insn, EmitState *state ...@@ -2176,9 +2172,9 @@ SpirvShader::EmitResult SpirvShader::EmitAny(InsnIterator insn, EmitState *state
SpirvShader::EmitResult SpirvShader::EmitAll(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitAll(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto &srcType = getType(getObject(insn.word(3))); auto &srcType = getType(getObject(insn.word(3)));
auto src = Operand(this, state, insn.word(3)); auto src = Operand(this, state, insn.word(3));
...@@ -2298,10 +2294,10 @@ SpirvShader::EmitResult SpirvShader::EmitAtomicCompareExchange(InsnIterator insn ...@@ -2298,10 +2294,10 @@ SpirvShader::EmitResult SpirvShader::EmitAtomicCompareExchange(InsnIterator insn
SpirvShader::EmitResult SpirvShader::EmitCopyObject(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitCopyObject(InsnIterator insn, EmitState *state) const
{ {
auto ty = getType(insn.word(1)); auto type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), ty.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto src = Operand(this, state, insn.word(3)); auto src = Operand(this, state, insn.word(3));
for(uint32_t i = 0; i < ty.sizeInComponents; i++) for(uint32_t i = 0; i < type.sizeInComponents; i++)
{ {
dst.move(i, src.Int(i)); dst.move(i, src.Int(i));
} }
...@@ -2310,12 +2306,10 @@ SpirvShader::EmitResult SpirvShader::EmitCopyObject(InsnIterator insn, EmitState ...@@ -2310,12 +2306,10 @@ SpirvShader::EmitResult SpirvShader::EmitCopyObject(InsnIterator insn, EmitState
SpirvShader::EmitResult SpirvShader::EmitArrayLength(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitArrayLength(InsnIterator insn, EmitState *state) const
{ {
auto resultTyId = Type::ID(insn.word(1));
auto resultId = Object::ID(insn.word(2));
auto structPtrId = Object::ID(insn.word(3)); auto structPtrId = Object::ID(insn.word(3));
auto arrayFieldIdx = insn.word(4); auto arrayFieldIdx = insn.word(4);
auto &resultType = getType(resultTyId); auto &resultType = getType(insn.resultTypeId());
ASSERT(resultType.sizeInComponents == 1); ASSERT(resultType.sizeInComponents == 1);
ASSERT(resultType.definition.opcode() == spv::OpTypeInt); ASSERT(resultType.definition.opcode() == spv::OpTypeInt);
...@@ -2323,7 +2317,7 @@ SpirvShader::EmitResult SpirvShader::EmitArrayLength(InsnIterator insn, EmitStat ...@@ -2323,7 +2317,7 @@ SpirvShader::EmitResult SpirvShader::EmitArrayLength(InsnIterator insn, EmitStat
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));
auto &result = state->createIntermediate(resultId, 1); auto &result = state->createIntermediate(insn.resultId(), 1);
auto structBase = GetPointerToData(structPtrId, 0, state); auto structBase = GetPointerToData(structPtrId, 0, state);
Decorations structDecorations = {}; Decorations structDecorations = {};
...@@ -2374,14 +2368,13 @@ void SpirvShader::emitEpilog(SpirvRoutine *routine) const ...@@ -2374,14 +2368,13 @@ void SpirvShader::emitEpilog(SpirvRoutine *routine) const
{ {
case spv::OpVariable: case spv::OpVariable:
{ {
Object::ID resultId = insn.word(2); auto &object = getObject(insn.resultId());
auto &object = getObject(resultId);
auto &objectTy = getType(object); 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(insn.resultId());
int offset = 0; int offset = 0;
VisitInterface(resultId, VisitInterface(insn.resultId(),
[&](Decorations const &d, AttribType type) { [&](Decorations const &d, AttribType type) {
auto scalarSlot = d.Location << 2 | d.Component; auto scalarSlot = d.Location << 2 | d.Component;
routine->outputs[scalarSlot] = dst[offset++]; routine->outputs[scalarSlot] = dst[offset++];
......
...@@ -22,8 +22,8 @@ namespace sw { ...@@ -22,8 +22,8 @@ namespace sw {
SpirvShader::EmitResult SpirvShader::EmitVectorTimesScalar(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitVectorTimesScalar(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), 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));
...@@ -37,8 +37,8 @@ SpirvShader::EmitResult SpirvShader::EmitVectorTimesScalar(InsnIterator insn, Em ...@@ -37,8 +37,8 @@ SpirvShader::EmitResult SpirvShader::EmitVectorTimesScalar(InsnIterator insn, Em
SpirvShader::EmitResult SpirvShader::EmitMatrixTimesVector(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitMatrixTimesVector(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), 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); auto rhsType = getType(rhs);
...@@ -58,8 +58,8 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesVector(InsnIterator insn, Em ...@@ -58,8 +58,8 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesVector(InsnIterator insn, Em
SpirvShader::EmitResult SpirvShader::EmitVectorTimesMatrix(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitVectorTimesMatrix(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), 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); auto lhsType = getType(lhs);
...@@ -79,8 +79,8 @@ SpirvShader::EmitResult SpirvShader::EmitVectorTimesMatrix(InsnIterator insn, Em ...@@ -79,8 +79,8 @@ SpirvShader::EmitResult SpirvShader::EmitVectorTimesMatrix(InsnIterator insn, Em
SpirvShader::EmitResult SpirvShader::EmitMatrixTimesMatrix(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitMatrixTimesMatrix(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), 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));
...@@ -106,8 +106,8 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesMatrix(InsnIterator insn, Em ...@@ -106,8 +106,8 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesMatrix(InsnIterator insn, Em
SpirvShader::EmitResult SpirvShader::EmitOuterProduct(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitOuterProduct(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), 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); auto &lhsType = getType(lhs);
...@@ -135,8 +135,8 @@ SpirvShader::EmitResult SpirvShader::EmitOuterProduct(InsnIterator insn, EmitSta ...@@ -135,8 +135,8 @@ SpirvShader::EmitResult SpirvShader::EmitOuterProduct(InsnIterator insn, EmitSta
SpirvShader::EmitResult SpirvShader::EmitTranspose(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitTranspose(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto mat = Operand(this, state, insn.word(3)); auto mat = Operand(this, state, insn.word(3));
auto numCols = type.definition.word(3); auto numCols = type.definition.word(3);
...@@ -155,8 +155,8 @@ SpirvShader::EmitResult SpirvShader::EmitTranspose(InsnIterator insn, EmitState ...@@ -155,8 +155,8 @@ SpirvShader::EmitResult SpirvShader::EmitTranspose(InsnIterator insn, EmitState
SpirvShader::EmitResult SpirvShader::EmitUnaryOp(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitUnaryOp(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto src = Operand(this, state, insn.word(3)); auto src = Operand(this, state, insn.word(3));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.sizeInComponents; i++)
...@@ -317,8 +317,8 @@ SpirvShader::EmitResult SpirvShader::EmitUnaryOp(InsnIterator insn, EmitState *s ...@@ -317,8 +317,8 @@ SpirvShader::EmitResult SpirvShader::EmitUnaryOp(InsnIterator insn, EmitState *s
SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto &lhsType = getType(getObject(insn.word(3))); 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));
...@@ -520,9 +520,9 @@ SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState * ...@@ -520,9 +520,9 @@ SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState *
SpirvShader::EmitResult SpirvShader::EmitDot(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitDot(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
ASSERT(type.sizeInComponents == 1); ASSERT(type.sizeInComponents == 1);
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto &lhsType = getType(getObject(insn.word(3))); 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));
......
...@@ -27,8 +27,8 @@ namespace sw { ...@@ -27,8 +27,8 @@ namespace sw {
SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.word(1)); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.word(2), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents);
auto extInstIndex = static_cast<GLSLstd450>(insn.word(4)); auto extInstIndex = static_cast<GLSLstd450>(insn.word(4));
switch(extInstIndex) switch(extInstIndex)
......
...@@ -107,13 +107,11 @@ SpirvShader::EmitResult SpirvShader::EmitImageFetch(InsnIterator insn, EmitState ...@@ -107,13 +107,11 @@ SpirvShader::EmitResult SpirvShader::EmitImageFetch(InsnIterator insn, EmitState
SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instruction, InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instruction, InsnIterator insn, EmitState *state) const
{ {
Type::ID resultTypeId = insn.word(1);
Object::ID resultId = insn.word(2);
Object::ID sampledImageId = insn.word(3); // For OpImageFetch this is just an Image, not a SampledImage. Object::ID sampledImageId = insn.word(3); // For OpImageFetch this is just an Image, not a SampledImage.
Object::ID coordinateId = insn.word(4); Object::ID coordinateId = insn.word(4);
auto &resultType = getType(resultTypeId); auto &resultType = getType(insn.resultTypeId());
auto &result = state->createIntermediate(resultId, resultType.sizeInComponents); auto &result = state->createIntermediate(insn.resultId(), resultType.sizeInComponents);
auto imageDescriptor = state->getPointer(sampledImageId).base; // vk::SampledImageDescriptor* auto imageDescriptor = state->getPointer(sampledImageId).base; // vk::SampledImageDescriptor*
// If using a separate sampler, look through the OpSampledImage instruction to find the sampler descriptor // If using a separate sampler, look through the OpSampledImage instruction to find the sampler descriptor
...@@ -291,7 +289,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio ...@@ -291,7 +289,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio
in[i] = As<SIMD::Float>(sampleValue.Int(0)); in[i] = As<SIMD::Float>(sampleValue.Int(0));
} }
auto cacheIt = state->routine->samplerCache.find(resultId); auto cacheIt = state->routine->samplerCache.find(insn.resultId());
ASSERT(cacheIt != state->routine->samplerCache.end()); ASSERT(cacheIt != state->routine->samplerCache.end());
auto &cache = cacheIt->second; auto &cache = cacheIt->second;
auto cacheHit = cache.imageDescriptor == imageDescriptor && cache.sampler == sampler; auto cacheHit = cache.imageDescriptor == imageDescriptor && cache.sampler == sampler;
...@@ -313,12 +311,11 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio ...@@ -313,12 +311,11 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio
SpirvShader::EmitResult SpirvShader::EmitImageQuerySizeLod(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitImageQuerySizeLod(InsnIterator insn, EmitState *state) const
{ {
auto &resultTy = getType(Type::ID(insn.word(1))); auto &resultTy = getType(Type::ID(insn.resultTypeId()));
auto resultId = Object::ID(insn.word(2));
auto imageId = Object::ID(insn.word(3)); auto imageId = Object::ID(insn.word(3));
auto lodId = Object::ID(insn.word(4)); auto lodId = Object::ID(insn.word(4));
auto &dst = state->createIntermediate(resultId, resultTy.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), resultTy.sizeInComponents);
GetImageDimensions(state, resultTy, imageId, lodId, dst); GetImageDimensions(state, resultTy, imageId, lodId, dst);
return EmitResult::Continue; return EmitResult::Continue;
...@@ -326,12 +323,11 @@ SpirvShader::EmitResult SpirvShader::EmitImageQuerySizeLod(InsnIterator insn, Em ...@@ -326,12 +323,11 @@ SpirvShader::EmitResult SpirvShader::EmitImageQuerySizeLod(InsnIterator insn, Em
SpirvShader::EmitResult SpirvShader::EmitImageQuerySize(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitImageQuerySize(InsnIterator insn, EmitState *state) const
{ {
auto &resultTy = getType(Type::ID(insn.word(1))); auto &resultTy = getType(Type::ID(insn.resultTypeId()));
auto resultId = Object::ID(insn.word(2));
auto imageId = Object::ID(insn.word(3)); auto imageId = Object::ID(insn.word(3));
auto lodId = Object::ID(0); auto lodId = Object::ID(0);
auto &dst = state->createIntermediate(resultId, resultTy.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), resultTy.sizeInComponents);
GetImageDimensions(state, resultTy, imageId, lodId, dst); GetImageDimensions(state, resultTy, imageId, lodId, dst);
return EmitResult::Continue; return EmitResult::Continue;
...@@ -412,9 +408,8 @@ void SpirvShader::GetImageDimensions(EmitState const *state, Type const &resultT ...@@ -412,9 +408,8 @@ void SpirvShader::GetImageDimensions(EmitState const *state, Type const &resultT
SpirvShader::EmitResult SpirvShader::EmitImageQueryLevels(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitImageQueryLevels(InsnIterator insn, EmitState *state) const
{ {
auto &resultTy = getType(Type::ID(insn.word(1))); auto &resultTy = getType(Type::ID(insn.resultTypeId()));
ASSERT(resultTy.sizeInComponents == 1); ASSERT(resultTy.sizeInComponents == 1);
auto resultId = Object::ID(insn.word(2));
auto imageId = Object::ID(insn.word(3)); auto imageId = Object::ID(insn.word(3));
const DescriptorDecorations &d = descriptorDecorations.at(imageId); const DescriptorDecorations &d = descriptorDecorations.at(imageId);
...@@ -434,7 +429,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQueryLevels(InsnIterator insn, Emi ...@@ -434,7 +429,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQueryLevels(InsnIterator insn, Emi
UNREACHABLE("Image descriptorType: %d", int(bindingLayout.descriptorType)); UNREACHABLE("Image descriptorType: %d", int(bindingLayout.descriptorType));
} }
auto &dst = state->createIntermediate(resultId, 1); auto &dst = state->createIntermediate(insn.resultId(), 1);
dst.move(0, SIMD::Int(mipLevels)); dst.move(0, SIMD::Int(mipLevels));
return EmitResult::Continue; return EmitResult::Continue;
...@@ -442,9 +437,8 @@ SpirvShader::EmitResult SpirvShader::EmitImageQueryLevels(InsnIterator insn, Emi ...@@ -442,9 +437,8 @@ SpirvShader::EmitResult SpirvShader::EmitImageQueryLevels(InsnIterator insn, Emi
SpirvShader::EmitResult SpirvShader::EmitImageQuerySamples(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitImageQuerySamples(InsnIterator insn, EmitState *state) const
{ {
auto &resultTy = getType(Type::ID(insn.word(1))); auto &resultTy = getType(Type::ID(insn.resultTypeId()));
ASSERT(resultTy.sizeInComponents == 1); ASSERT(resultTy.sizeInComponents == 1);
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)); auto imageTy = getType(getObject(imageId));
ASSERT(imageTy.definition.opcode() == spv::OpTypeImage); ASSERT(imageTy.definition.opcode() == spv::OpTypeImage);
...@@ -471,7 +465,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQuerySamples(InsnIterator insn, Em ...@@ -471,7 +465,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQuerySamples(InsnIterator insn, Em
UNREACHABLE("Image descriptorType: %d", int(bindingLayout.descriptorType)); UNREACHABLE("Image descriptorType: %d", int(bindingLayout.descriptorType));
} }
auto &dst = state->createIntermediate(resultId, 1); auto &dst = state->createIntermediate(insn.resultId(), 1);
dst.move(0, SIMD::Int(sampleCount)); dst.move(0, SIMD::Int(sampleCount));
return EmitResult::Continue; return EmitResult::Continue;
...@@ -545,7 +539,6 @@ SpirvShader::EmitResult SpirvShader::EmitImageRead(InsnIterator insn, EmitState ...@@ -545,7 +539,6 @@ SpirvShader::EmitResult SpirvShader::EmitImageRead(InsnIterator insn, EmitState
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); auto &imageType = getType(image);
Object::ID resultId = insn.word(2);
Object::ID sampleId = 0; Object::ID sampleId = 0;
...@@ -593,7 +586,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageRead(InsnIterator insn, EmitState ...@@ -593,7 +586,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageRead(InsnIterator insn, EmitState
auto imageSizeInBytes = *Pointer<Int>(binding + OFFSET(vk::StorageImageDescriptor, sizeInBytes)); auto imageSizeInBytes = *Pointer<Int>(binding + OFFSET(vk::StorageImageDescriptor, sizeInBytes));
auto &dst = state->createIntermediate(resultId, resultType.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), resultType.sizeInComponents);
auto texelSize = vk::Format(vkFormat).bytes(); auto texelSize = vk::Format(vkFormat).bytes();
auto basePtr = SIMD::Pointer(imageBase, imageSizeInBytes); auto basePtr = SIMD::Pointer(imageBase, imageSizeInBytes);
......
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