| Index: src/sksl/SkSLCompiler.cpp
|
| diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
|
| index d2ad81223e8c495e73546e4375b09f84db1b1eef..9eeacd082de1870f76135a21b9d88d91c0f25a0b 100644
|
| --- a/src/sksl/SkSLCompiler.cpp
|
| +++ b/src/sksl/SkSLCompiler.cpp
|
| @@ -10,11 +10,13 @@
|
| #include <fstream>
|
| #include <streambuf>
|
|
|
| +#include "ast/SkSLASTPrecision.h"
|
| #include "SkSLIRGenerator.h"
|
| #include "SkSLParser.h"
|
| #include "SkSLSPIRVCodeGenerator.h"
|
| #include "ir/SkSLExpression.h"
|
| #include "ir/SkSLIntLiteral.h"
|
| +#include "ir/SkSLModifiersDeclaration.h"
|
| #include "ir/SkSLSymbolTable.h"
|
| #include "ir/SkSLVarDeclaration.h"
|
| #include "SkMutex.h"
|
| @@ -23,15 +25,15 @@
|
|
|
| // include the built-in shader symbols as static strings
|
|
|
| -static std::string SKSL_INCLUDE =
|
| +static const char* SKSL_INCLUDE =
|
| #include "sksl.include"
|
| ;
|
|
|
| -static std::string SKSL_VERT_INCLUDE =
|
| +static const char* SKSL_VERT_INCLUDE =
|
| #include "sksl_vert.include"
|
| ;
|
|
|
| -static std::string SKSL_FRAG_INCLUDE =
|
| +static const char* SKSL_FRAG_INCLUDE =
|
| #include "sksl_frag.include"
|
| ;
|
|
|
| @@ -97,6 +99,7 @@ Compiler::Compiler()
|
| ADD_TYPE(Sampler1D);
|
| ADD_TYPE(Sampler2D);
|
| ADD_TYPE(Sampler3D);
|
| + ADD_TYPE(SamplerExternalOES);
|
| ADD_TYPE(SamplerCube);
|
| ADD_TYPE(Sampler2DRect);
|
| ADD_TYPE(Sampler1DArray);
|
| @@ -128,8 +131,9 @@ Compiler::Compiler()
|
| ADD_TYPE(GSampler2DArrayShadow);
|
| ADD_TYPE(GSamplerCubeArrayShadow);
|
|
|
| - std::vector<std::unique_ptr<ProgramElement>> ignored;
|
| - this->internalConvertProgram(SKSL_INCLUDE, &ignored);
|
| + Modifiers::Flag ignored1;
|
| + std::vector<std::unique_ptr<ProgramElement>> ignored2;
|
| + this->internalConvertProgram(SKSL_INCLUDE, &ignored1, &ignored2);
|
| ASSERT(!fErrorCount);
|
| }
|
|
|
| @@ -138,12 +142,14 @@ Compiler::~Compiler() {
|
| }
|
|
|
| void Compiler::internalConvertProgram(std::string text,
|
| + Modifiers::Flag* defaultPrecision,
|
| std::vector<std::unique_ptr<ProgramElement>>* result) {
|
| Parser parser(text, *fTypes, *this);
|
| std::vector<std::unique_ptr<ASTDeclaration>> parsed = parser.file();
|
| if (fErrorCount) {
|
| return;
|
| }
|
| + *defaultPrecision = Modifiers::kHighp_Flag;
|
| for (size_t i = 0; i < parsed.size(); i++) {
|
| ASTDeclaration& decl = *parsed[i];
|
| switch (decl.fKind) {
|
| @@ -164,6 +170,14 @@ void Compiler::internalConvertProgram(std::string text,
|
| }
|
| break;
|
| }
|
| + case ASTDeclaration::kModifiers_Kind: {
|
| + std::unique_ptr<ModifiersDeclaration> f = fIRGenerator->convertModifiersDeclaration(
|
| + (ASTModifiersDeclaration&) decl);
|
| + if (f) {
|
| + result->push_back(std::move(f));
|
| + }
|
| + break;
|
| + }
|
| case ASTDeclaration::kInterfaceBlock_Kind: {
|
| std::unique_ptr<InterfaceBlock> i = fIRGenerator->convertInterfaceBlock(
|
| (ASTInterfaceBlock&) decl);
|
| @@ -179,6 +193,10 @@ void Compiler::internalConvertProgram(std::string text,
|
| }
|
| break;
|
| }
|
| + case ASTDeclaration::kPrecision_Kind: {
|
| + *defaultPrecision = ((ASTPrecision&) decl).fPrecision;
|
| + break;
|
| + }
|
| default:
|
| ABORT("unsupported declaration: %s\n", decl.description().c_str());
|
| }
|
| @@ -190,16 +208,18 @@ std::unique_ptr<Program> Compiler::convertProgram(Program::Kind kind, std::strin
|
| fErrorCount = 0;
|
| fIRGenerator->pushSymbolTable();
|
| std::vector<std::unique_ptr<ProgramElement>> elements;
|
| + Modifiers::Flag ignored;
|
| switch (kind) {
|
| case Program::kVertex_Kind:
|
| - this->internalConvertProgram(SKSL_VERT_INCLUDE, &elements);
|
| + this->internalConvertProgram(SKSL_VERT_INCLUDE, &ignored, &elements);
|
| break;
|
| case Program::kFragment_Kind:
|
| - this->internalConvertProgram(SKSL_FRAG_INCLUDE, &elements);
|
| + this->internalConvertProgram(SKSL_FRAG_INCLUDE, &ignored, &elements);
|
| break;
|
| }
|
| - this->internalConvertProgram(text, &elements);
|
| - auto result = std::unique_ptr<Program>(new Program(kind, std::move(elements),
|
| + Modifiers::Flag defaultPrecision;
|
| + this->internalConvertProgram(text, &defaultPrecision, &elements);
|
| + auto result = std::unique_ptr<Program>(new Program(kind, defaultPrecision, std::move(elements),
|
| fIRGenerator->fSymbolTable));;
|
| fIRGenerator->popSymbolTable();
|
| this->writeErrorCount();
|
|
|