Add SpirvRoutine::getValue helper - Provides a point to complain if something is not yet defined. - Allows avoiding ugly syntax from use of unique_ptr Bug: b/124388146 Change-Id: Ib55023fff5c90b71a41c5f558544be65250bb67d Reviewed-on: https://swiftshader-review.googlesource.com/c/24791 Tested-by: Chris Forbes <chrisforbes@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp index aa48093..bfa5894 100644 --- a/src/Pipeline/SpirvShader.cpp +++ b/src/Pipeline/SpirvShader.cpp
@@ -498,7 +498,7 @@ auto typeId = baseObject.definition.word(1); if (baseObject.kind == Object::Kind::Value) - res += As<Int4>((*routine->lvalues[id])[0]); + res += As<Int4>(routine->getValue(id)[0]); for (auto i = 0u; i < numIndexes; i++) { @@ -525,7 +525,7 @@ if (obj.kind == Object::Kind::Constant) res += Int4(stride * GetConstantInt(indexIds[i])); else - res += Int4(stride) * As<Int4>((*(routine->lvalues)[indexIds[i]])[0]); + res += Int4(stride) * As<Int4>(routine->getValue(indexIds[i])[0]); break; } @@ -685,12 +685,12 @@ UNIMPLEMENTED("Descriptor-backed load not yet implemented"); } - SpirvRoutine::Value& ptrBase = *(routine->lvalues)[pointer.pointerBase]; - auto & dst = *(routine->lvalues)[insn.word(2)]; + SpirvRoutine::Value& ptrBase = routine->getValue(pointer.pointerBase); + auto & dst = routine->getValue(insn.word(2)); if (pointer.kind == Object::Kind::Value) { - auto offsets = As<Int4>(*(routine->lvalues)[insn.word(3)]); + auto offsets = As<Int4>(routine->getValue(insn.word(3))); for (auto i = 0u; i < object.sizeInComponents; i++) { // i wish i had a Float,Float,Float,Float constructor here.. @@ -732,7 +732,7 @@ UNIMPLEMENTED("Descriptor-backed OpAccessChain not yet implemented"); } - auto & dst = *(routine->lvalues)[insn.word(2)]; + auto & dst = routine->getValue(insn.word(2)); dst[0] = As<Float4>(WalkAccessChain(insn.word(3), insn.wordCount() - 4, insn.wordPointer(4), routine)); break; } @@ -754,12 +754,12 @@ UNIMPLEMENTED("Descriptor-backed store not yet implemented"); } - SpirvRoutine::Value& ptrBase = *(routine->lvalues)[pointer.pointerBase]; - auto & src = *(routine->lvalues)[insn.word(2)]; + SpirvRoutine::Value& ptrBase = routine->getValue(pointer.pointerBase); + auto & src = routine->getValue(insn.word(2));; if (pointer.kind == Object::Kind::Value) { - auto offsets = As<Int4>(*(routine->lvalues)[insn.word(1)]); + auto offsets = As<Int4>(routine->getValue(insn.word(1))); for (auto i = 0u; i < object.sizeInComponents; i++) { // Scattered store
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp index 86dfaed..b2a3b3a 100644 --- a/src/Pipeline/SpirvShader.hpp +++ b/src/Pipeline/SpirvShader.hpp
@@ -42,6 +42,13 @@ { lvalues.emplace(id, std::unique_ptr<Value>(new Value(size))); } + + Value& getValue(uint32_t id) + { + auto it = lvalues.find(id); + assert(it != lvalues.end()); + return *it->second; + } }; class SpirvShader
diff --git a/src/Pipeline/VertexProgram.cpp b/src/Pipeline/VertexProgram.cpp index b8ccf34..54cd408 100644 --- a/src/Pipeline/VertexProgram.cpp +++ b/src/Pipeline/VertexProgram.cpp
@@ -37,7 +37,7 @@ { // TODO: we could do better here; we know InstanceIndex is uniform across all lanes assert(it->second.SizeInComponents == 1); - (*routine.lvalues[it->second.Id])[it->second.FirstComponent] = + routine.getValue(it->second.Id)[it->second.FirstComponent] = As<Float4>(Int4((*Pointer<Int>(data + OFFSET(DrawData, instanceID))))); } } @@ -56,7 +56,7 @@ if (it != spirvShader->inputBuiltins.end()) { assert(it->second.SizeInComponents == 1); - (*routine.lvalues[it->second.Id])[it->second.FirstComponent] = + routine.getValue(it->second.Id)[it->second.FirstComponent] = As<Float4>(Int4(index) + Int4(0, 1, 2, 3)); }
diff --git a/src/Pipeline/VertexRoutine.cpp b/src/Pipeline/VertexRoutine.cpp index 5b476f7..82d38d5 100644 --- a/src/Pipeline/VertexRoutine.cpp +++ b/src/Pipeline/VertexRoutine.cpp
@@ -107,7 +107,7 @@ auto it = spirvShader->outputBuiltins.find(spv::BuiltInPosition); assert(it != spirvShader->outputBuiltins.end()); assert(it->second.SizeInComponents == 4); - auto &pos = (*routine.lvalues[it->second.Id]); + auto &pos = routine.getValue(it->second.Id); auto posX = pos[it->second.FirstComponent]; auto posY = pos[it->second.FirstComponent + 1]; auto posZ = pos[it->second.FirstComponent + 2]; @@ -640,7 +640,7 @@ auto it = spirvShader->outputBuiltins.find(spv::BuiltInPosition); assert(it != spirvShader->outputBuiltins.end()); assert(it->second.SizeInComponents == 4); - auto &pos = (*routine.lvalues[it->second.Id]); + auto &pos = routine.getValue(it->second.Id); auto posX = pos[it->second.FirstComponent]; auto posY = pos[it->second.FirstComponent + 1]; auto posZ = pos[it->second.FirstComponent + 2];