Fix storage class issues for push constant variables.

Change-Id: I433159717b831e9dbfc251c38687572bdc45c959
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/329037
Auto-Submit: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
This commit is contained in:
Jim Van Verth 2020-10-21 16:09:57 -04:00 committed by Skia Commit-Bot
parent 6c5f7774fc
commit f3ec9833e8
2 changed files with 10 additions and 4 deletions

View File

@ -475,7 +475,10 @@ SpvId SPIRVCodeGenerator::getType(const Type& type) {
SpvId SPIRVCodeGenerator::getType(const Type& rawType, const MemoryLayout& layout) { SpvId SPIRVCodeGenerator::getType(const Type& rawType, const MemoryLayout& layout) {
const Type& type = this->getActualType(rawType); const Type& type = this->getActualType(rawType);
String key = type.name() + to_string((int) layout.fStd); String key = type.name();
if (type.typeKind() == Type::TypeKind::kStruct || type.typeKind() == Type::TypeKind::kArray) {
key += to_string((int)layout.fStd);
}
auto entry = fTypeMap.find(key); auto entry = fTypeMap.find(key);
if (entry == fTypeMap.end()) { if (entry == fTypeMap.end()) {
SpvId result = this->nextId(); SpvId result = this->nextId();
@ -1892,6 +1895,7 @@ SpvId SPIRVCodeGenerator::writeVariableReference(const VariableReference& ref, O
fRTHeightStructId = this->writeInterfaceBlock(intf, false); fRTHeightStructId = this->writeInterfaceBlock(intf, false);
fRTHeightFieldIndex = 0; fRTHeightFieldIndex = 0;
fRTHeightStorageClass = SpvStorageClassUniform;
} }
SkASSERT(fRTHeightFieldIndex != (SpvId)-1); SkASSERT(fRTHeightFieldIndex != (SpvId)-1);
@ -1899,7 +1903,7 @@ SpvId SPIRVCodeGenerator::writeVariableReference(const VariableReference& ref, O
SpvId fieldIndexId = this->writeIntLiteral(fieldIndex); SpvId fieldIndexId = this->writeIntLiteral(fieldIndex);
SpvId heightPtr = this->nextId(); SpvId heightPtr = this->nextId();
this->writeOpCode(SpvOpAccessChain, 5, out); this->writeOpCode(SpvOpAccessChain, 5, out);
this->writeWord(this->getPointerType(*fContext.fFloat_Type, SpvStorageClassUniform), this->writeWord(this->getPointerType(*fContext.fFloat_Type, fRTHeightStorageClass),
out); out);
this->writeWord(heightPtr, out); this->writeWord(heightPtr, out);
this->writeWord(fRTHeightStructId, out); this->writeWord(fRTHeightStructId, out);
@ -2706,17 +2710,19 @@ SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf, bool a
fDefaultLayout; fDefaultLayout;
SpvId result = this->nextId(); SpvId result = this->nextId();
const Type* type = &intf.variable().type(); const Type* type = &intf.variable().type();
Modifiers intfModifiers = intf.variable().modifiers();
SpvStorageClass_ storageClass = get_storage_class(intfModifiers);
if (fProgram.fInputs.fRTHeight && appendRTHeight) { if (fProgram.fInputs.fRTHeight && appendRTHeight) {
SkASSERT(fRTHeightStructId == (SpvId) -1); SkASSERT(fRTHeightStructId == (SpvId) -1);
SkASSERT(fRTHeightFieldIndex == (SpvId) -1); SkASSERT(fRTHeightFieldIndex == (SpvId) -1);
std::vector<Type::Field> fields = type->fields(); std::vector<Type::Field> fields = type->fields();
fRTHeightStructId = result; fRTHeightStructId = result;
fRTHeightFieldIndex = fields.size(); fRTHeightFieldIndex = fields.size();
fRTHeightStorageClass = storageClass;
fields.emplace_back(Modifiers(), StringFragment(SKSL_RTHEIGHT_NAME), fContext.fFloat_Type.get()); fields.emplace_back(Modifiers(), StringFragment(SKSL_RTHEIGHT_NAME), fContext.fFloat_Type.get());
type = new Type(type->fOffset, type->name(), fields); type = new Type(type->fOffset, type->name(), fields);
} }
SpvId typeId; SpvId typeId;
Modifiers intfModifiers = intf.variable().modifiers();
if (intfModifiers.fLayout.fBuiltin == SK_IN_BUILTIN) { if (intfModifiers.fLayout.fBuiltin == SK_IN_BUILTIN) {
for (const auto& e : fProgram.elements()) { for (const auto& e : fProgram.elements()) {
if (e->is<ModifiersDeclaration>()) { if (e->is<ModifiersDeclaration>()) {
@ -2736,7 +2742,6 @@ SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf, bool a
} else if (intfModifiers.fLayout.fBuiltin == -1) { } else if (intfModifiers.fLayout.fBuiltin == -1) {
this->writeInstruction(SpvOpDecorate, typeId, SpvDecorationBlock, fDecorationBuffer); this->writeInstruction(SpvOpDecorate, typeId, SpvDecorationBlock, fDecorationBuffer);
} }
SpvStorageClass_ storageClass = get_storage_class(intfModifiers);
SpvId ptrType = this->nextId(); SpvId ptrType = this->nextId();
this->writeInstruction(SpvOpTypePointer, ptrType, storageClass, typeId, fConstantBuffer); this->writeInstruction(SpvOpTypePointer, ptrType, storageClass, typeId, fConstantBuffer);
this->writeInstruction(SpvOpVariable, ptrType, result, storageClass, fConstantBuffer); this->writeInstruction(SpvOpVariable, ptrType, result, storageClass, fConstantBuffer);

View File

@ -398,6 +398,7 @@ private:
std::stack<SpvId> fContinueTarget; std::stack<SpvId> fContinueTarget;
SpvId fRTHeightStructId = (SpvId) -1; SpvId fRTHeightStructId = (SpvId) -1;
SpvId fRTHeightFieldIndex = (SpvId) -1; SpvId fRTHeightFieldIndex = (SpvId) -1;
SpvStorageClass_ fRTHeightStorageClass;
// holds variables synthesized during output, for lifetime purposes // holds variables synthesized during output, for lifetime purposes
SymbolTable fSynthetics; SymbolTable fSynthetics;
int fSkInCount = 1; int fSkInCount = 1;