| Index: src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| diff --git a/src/sksl/SkSLSPIRVCodeGenerator.cpp b/src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| index efa41bfd1ad68ae3bddd1f370569e5c3b78cdfd9..d17e3c42a2d438a38a7f80ce35a9899141bd20cc 100644
|
| --- a/src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| +++ b/src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| @@ -2363,23 +2363,25 @@ SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf) {
|
| return result;
|
| }
|
|
|
| -void SPIRVCodeGenerator::writeGlobalVars(const VarDeclaration& decl, std::ostream& out) {
|
| +void SPIRVCodeGenerator::writeGlobalVars(const VarDeclarations& decl, std::ostream& out) {
|
| for (size_t i = 0; i < decl.fVars.size(); i++) {
|
| - if (!decl.fVars[i]->fIsReadFrom && !decl.fVars[i]->fIsWrittenTo &&
|
| - !(decl.fVars[i]->fModifiers.fFlags & (Modifiers::kIn_Flag |
|
| - Modifiers::kOut_Flag |
|
| - Modifiers::kUniform_Flag))) {
|
| + const VarDeclaration& varDecl = decl.fVars[i];
|
| + const Variable* var = varDecl.fVar;
|
| + if (!var->fIsReadFrom && !var->fIsWrittenTo &&
|
| + !(var->fModifiers.fFlags & (Modifiers::kIn_Flag |
|
| + Modifiers::kOut_Flag |
|
| + Modifiers::kUniform_Flag))) {
|
| // variable is dead and not an input / output var (the Vulkan debug layers complain if
|
| // we elide an interface var, even if it's dead)
|
| continue;
|
| }
|
| SpvStorageClass_ storageClass;
|
| - if (decl.fVars[i]->fModifiers.fFlags & Modifiers::kIn_Flag) {
|
| + if (var->fModifiers.fFlags & Modifiers::kIn_Flag) {
|
| storageClass = SpvStorageClassInput;
|
| - } else if (decl.fVars[i]->fModifiers.fFlags & Modifiers::kOut_Flag) {
|
| + } else if (var->fModifiers.fFlags & Modifiers::kOut_Flag) {
|
| storageClass = SpvStorageClassOutput;
|
| - } else if (decl.fVars[i]->fModifiers.fFlags & Modifiers::kUniform_Flag) {
|
| - if (decl.fVars[i]->fType.kind() == Type::kSampler_Kind) {
|
| + } else if (var->fModifiers.fFlags & Modifiers::kUniform_Flag) {
|
| + if (var->fType.kind() == Type::kSampler_Kind) {
|
| storageClass = SpvStorageClassUniformConstant;
|
| } else {
|
| storageClass = SpvStorageClassUniform;
|
| @@ -2388,36 +2390,37 @@ void SPIRVCodeGenerator::writeGlobalVars(const VarDeclaration& decl, std::ostrea
|
| storageClass = SpvStorageClassPrivate;
|
| }
|
| SpvId id = this->nextId();
|
| - fVariableMap[decl.fVars[i]] = id;
|
| - SpvId type = this->getPointerType(decl.fVars[i]->fType, storageClass);
|
| + fVariableMap[var] = id;
|
| + SpvId type = this->getPointerType(var->fType, storageClass);
|
| this->writeInstruction(SpvOpVariable, type, id, storageClass, fConstantBuffer);
|
| - this->writeInstruction(SpvOpName, id, decl.fVars[i]->fName.c_str(), fNameBuffer);
|
| - if (decl.fVars[i]->fType.kind() == Type::kMatrix_Kind) {
|
| + this->writeInstruction(SpvOpName, id, var->fName.c_str(), fNameBuffer);
|
| + if (var->fType.kind() == Type::kMatrix_Kind) {
|
| this->writeInstruction(SpvOpMemberDecorate, id, (SpvId) i, SpvDecorationColMajor,
|
| fDecorationBuffer);
|
| this->writeInstruction(SpvOpMemberDecorate, id, (SpvId) i, SpvDecorationMatrixStride,
|
| - (SpvId) decl.fVars[i]->fType.stride(), fDecorationBuffer);
|
| + (SpvId) var->fType.stride(), fDecorationBuffer);
|
| }
|
| - if (decl.fValues[i]) {
|
| + if (varDecl.fValue) {
|
| ASSERT(!fCurrentBlock);
|
| fCurrentBlock = -1;
|
| - SpvId value = this->writeExpression(*decl.fValues[i], fGlobalInitializersBuffer);
|
| + SpvId value = this->writeExpression(*varDecl.fValue, fGlobalInitializersBuffer);
|
| this->writeInstruction(SpvOpStore, id, value, fGlobalInitializersBuffer);
|
| fCurrentBlock = 0;
|
| }
|
| - this->writeLayout(decl.fVars[i]->fModifiers.fLayout, id);
|
| + this->writeLayout(var->fModifiers.fLayout, id);
|
| }
|
| }
|
|
|
| -void SPIRVCodeGenerator::writeVarDeclaration(const VarDeclaration& decl, std::ostream& out) {
|
| - for (size_t i = 0; i < decl.fVars.size(); i++) {
|
| +void SPIRVCodeGenerator::writeVarDeclarations(const VarDeclarations& decl, std::ostream& out) {
|
| + for (const auto& varDecl : decl.fVars) {
|
| + const Variable* var = varDecl.fVar;
|
| SpvId id = this->nextId();
|
| - fVariableMap[decl.fVars[i]] = id;
|
| - SpvId type = this->getPointerType(decl.fVars[i]->fType, SpvStorageClassFunction);
|
| + fVariableMap[var] = id;
|
| + SpvId type = this->getPointerType(var->fType, SpvStorageClassFunction);
|
| this->writeInstruction(SpvOpVariable, type, id, SpvStorageClassFunction, fVariableBuffer);
|
| - this->writeInstruction(SpvOpName, id, decl.fVars[i]->fName.c_str(), fNameBuffer);
|
| - if (decl.fValues[i]) {
|
| - SpvId value = this->writeExpression(*decl.fValues[i], out);
|
| + this->writeInstruction(SpvOpName, id, var->fName.c_str(), fNameBuffer);
|
| + if (varDecl.fValue) {
|
| + SpvId value = this->writeExpression(*varDecl.fValue, out);
|
| this->writeInstruction(SpvOpStore, id, value, out);
|
| }
|
| }
|
| @@ -2434,8 +2437,8 @@ void SPIRVCodeGenerator::writeStatement(const Statement& s, std::ostream& out) {
|
| case Statement::kReturn_Kind:
|
| this->writeReturnStatement((ReturnStatement&) s, out);
|
| break;
|
| - case Statement::kVarDeclaration_Kind:
|
| - this->writeVarDeclaration(*((VarDeclarationStatement&) s).fDeclaration, out);
|
| + case Statement::kVarDeclarations_Kind:
|
| + this->writeVarDeclarations(*((VarDeclarationsStatement&) s).fDeclaration, out);
|
| break;
|
| case Statement::kIf_Kind:
|
| this->writeIfStatement((IfStatement&) s, out);
|
| @@ -2559,7 +2562,7 @@ void SPIRVCodeGenerator::writeInstructions(const Program& program, std::ostream&
|
| }
|
| for (size_t i = 0; i < program.fElements.size(); i++) {
|
| if (program.fElements[i]->fKind == ProgramElement::kVar_Kind) {
|
| - this->writeGlobalVars(((VarDeclaration&) *program.fElements[i]), body);
|
| + this->writeGlobalVars(((VarDeclarations&) *program.fElements[i]), body);
|
| }
|
| }
|
| for (size_t i = 0; i < program.fElements.size(); i++) {
|
|
|