| Index: src/sksl/SkSLSPIRVCodeGenerator.cpp | 
| diff --git a/src/sksl/SkSLSPIRVCodeGenerator.cpp b/src/sksl/SkSLSPIRVCodeGenerator.cpp | 
| index d17e3c42a2d438a38a7f80ce35a9899141bd20cc..5403ba362814057ad46e2047d96a3f730b4a54c8 100644 | 
| --- a/src/sksl/SkSLSPIRVCodeGenerator.cpp | 
| +++ b/src/sksl/SkSLSPIRVCodeGenerator.cpp | 
| @@ -15,6 +15,7 @@ | 
| #include "ir/SkSLExtension.h" | 
| #include "ir/SkSLIndexExpression.h" | 
| #include "ir/SkSLVariableReference.h" | 
| +#include "SkSLCompiler.h" | 
|  | 
| namespace SkSL { | 
|  | 
| @@ -2162,13 +2163,19 @@ SpvId SPIRVCodeGenerator::writePrefixExpression(const PrefixExpression& p, std:: | 
| lv->store(result, out); | 
| return result; | 
| } | 
| -        case Token::NOT: { | 
| +        case Token::LOGICALNOT: { | 
| ASSERT(p.fOperand->fType == *fContext.fBool_Type); | 
| SpvId result = this->nextId(); | 
| this->writeInstruction(SpvOpLogicalNot, this->getType(p.fOperand->fType), result, | 
| this->writeExpression(*p.fOperand, out), out); | 
| return result; | 
| } | 
| +        case Token::BITWISENOT: { | 
| +            SpvId result = this->nextId(); | 
| +            this->writeInstruction(SpvOpNot, this->getType(p.fOperand->fType), result, | 
| +                                   this->writeExpression(*p.fOperand, out), out); | 
| +            return result; | 
| +        } | 
| default: | 
| ABORT("unsupported prefix expression: %s", p.description().c_str()); | 
| } | 
| @@ -2321,7 +2328,7 @@ void SPIRVCodeGenerator::writeLayout(const Layout& layout, SpvId target) { | 
| this->writeInstruction(SpvOpDecorate, target, SpvDecorationDescriptorSet, layout.fSet, | 
| fDecorationBuffer); | 
| } | 
| -    if (layout.fBuiltin >= 0) { | 
| +    if (layout.fBuiltin >= 0 && layout.fBuiltin != SK_FRAGCOLOR_BUILTIN) { | 
| this->writeInstruction(SpvOpDecorate, target, SpvDecorationBuiltIn, layout.fBuiltin, | 
| fDecorationBuffer); | 
| } | 
| @@ -2363,10 +2370,19 @@ SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf) { | 
| return result; | 
| } | 
|  | 
| -void SPIRVCodeGenerator::writeGlobalVars(const VarDeclarations& decl, std::ostream& out) { | 
| +#define BUILTIN_IGNORE 9999 | 
| +void SPIRVCodeGenerator::writeGlobalVars(Program::Kind kind, const VarDeclarations& decl, | 
| +                                         std::ostream& out) { | 
| for (size_t i = 0; i < decl.fVars.size(); i++) { | 
| const VarDeclaration& varDecl = decl.fVars[i]; | 
| const Variable* var = varDecl.fVar; | 
| +        if (var->fModifiers.fLayout.fBuiltin == BUILTIN_IGNORE) { | 
| +            continue; | 
| +        } | 
| +        if (var->fModifiers.fLayout.fBuiltin == SK_FRAGCOLOR_BUILTIN && | 
| +            kind != Program::kFragment_Kind) { | 
| +            continue; | 
| +        } | 
| if (!var->fIsReadFrom && !var->fIsWrittenTo && | 
| !(var->fModifiers.fFlags & (Modifiers::kIn_Flag | | 
| Modifiers::kOut_Flag | | 
| @@ -2562,7 +2578,8 @@ 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(((VarDeclarations&) *program.fElements[i]), body); | 
| +            this->writeGlobalVars(program.fKind, ((VarDeclarations&) *program.fElements[i]), | 
| +                                  body); | 
| } | 
| } | 
| for (size_t i = 0; i < program.fElements.size(); i++) { | 
|  |