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(); |