| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2016 Google Inc. | 2  * Copyright 2016 Google Inc. | 
| 3  * | 3  * | 
| 4  * Use of this source code is governed by a BSD-style license that can be | 4  * Use of this source code is governed by a BSD-style license that can be | 
| 5  * found in the LICENSE file. | 5  * found in the LICENSE file. | 
| 6  */ | 6  */ | 
| 7 | 7 | 
| 8 #include "SkSLCompiler.h" | 8 #include "SkSLCompiler.h" | 
| 9 | 9 | 
| 10 #include <fstream> | 10 #include <fstream> | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 34 static std::string SKSL_FRAG_INCLUDE = | 34 static std::string SKSL_FRAG_INCLUDE = | 
| 35 #include "sksl_frag.include" | 35 #include "sksl_frag.include" | 
| 36 ; | 36 ; | 
| 37 | 37 | 
| 38 namespace SkSL { | 38 namespace SkSL { | 
| 39 | 39 | 
| 40 Compiler::Compiler() | 40 Compiler::Compiler() | 
| 41 : fErrorCount(0) { | 41 : fErrorCount(0) { | 
| 42     auto types = std::shared_ptr<SymbolTable>(new SymbolTable(*this)); | 42     auto types = std::shared_ptr<SymbolTable>(new SymbolTable(*this)); | 
| 43     auto symbols = std::shared_ptr<SymbolTable>(new SymbolTable(types, *this)); | 43     auto symbols = std::shared_ptr<SymbolTable>(new SymbolTable(types, *this)); | 
| 44     fIRGenerator = new IRGenerator(symbols, *this); | 44     fIRGenerator = new IRGenerator(&fContext, symbols, *this); | 
| 45     fTypes = types; | 45     fTypes = types; | 
| 46     #define ADD_TYPE(t) types->add(k ## t ## _Type->fName, k ## t ## _Type) | 46     #define ADD_TYPE(t) types->addWithoutOwnership(fContext.f ## t ## _Type->fNa
     me, \ | 
|  | 47                                                    fContext.f ## t ## _Type.get(
     )) | 
| 47     ADD_TYPE(Void); | 48     ADD_TYPE(Void); | 
| 48     ADD_TYPE(Float); | 49     ADD_TYPE(Float); | 
| 49     ADD_TYPE(Vec2); | 50     ADD_TYPE(Vec2); | 
| 50     ADD_TYPE(Vec3); | 51     ADD_TYPE(Vec3); | 
| 51     ADD_TYPE(Vec4); | 52     ADD_TYPE(Vec4); | 
| 52     ADD_TYPE(Double); | 53     ADD_TYPE(Double); | 
| 53     ADD_TYPE(DVec2); | 54     ADD_TYPE(DVec2); | 
| 54     ADD_TYPE(DVec3); | 55     ADD_TYPE(DVec3); | 
| 55     ADD_TYPE(DVec4); | 56     ADD_TYPE(DVec4); | 
| 56     ADD_TYPE(Int); | 57     ADD_TYPE(Int); | 
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 178             default: | 179             default: | 
| 179                 ABORT("unsupported declaration: %s\n", decl.description().c_str(
     )); | 180                 ABORT("unsupported declaration: %s\n", decl.description().c_str(
     )); | 
| 180         } | 181         } | 
| 181     } | 182     } | 
| 182 } | 183 } | 
| 183 | 184 | 
| 184 std::unique_ptr<Program> Compiler::convertProgram(Program::Kind kind, std::strin
     g text) { | 185 std::unique_ptr<Program> Compiler::convertProgram(Program::Kind kind, std::strin
     g text) { | 
| 185     fErrorText = ""; | 186     fErrorText = ""; | 
| 186     fErrorCount = 0; | 187     fErrorCount = 0; | 
| 187     fIRGenerator->pushSymbolTable(); | 188     fIRGenerator->pushSymbolTable(); | 
| 188     std::vector<std::unique_ptr<ProgramElement>> result; | 189     std::vector<std::unique_ptr<ProgramElement>> elements; | 
| 189     switch (kind) { | 190     switch (kind) { | 
| 190         case Program::kVertex_Kind: | 191         case Program::kVertex_Kind: | 
| 191             this->internalConvertProgram(SKSL_VERT_INCLUDE, &result); | 192             this->internalConvertProgram(SKSL_VERT_INCLUDE, &elements); | 
| 192             break; | 193             break; | 
| 193         case Program::kFragment_Kind: | 194         case Program::kFragment_Kind: | 
| 194             this->internalConvertProgram(SKSL_FRAG_INCLUDE, &result); | 195             this->internalConvertProgram(SKSL_FRAG_INCLUDE, &elements); | 
| 195             break; | 196             break; | 
| 196     } | 197     } | 
| 197     this->internalConvertProgram(text, &result); | 198     this->internalConvertProgram(text, &elements); | 
|  | 199     auto result = std::unique_ptr<Program>(new Program(kind, std::move(elements)
     , | 
|  | 200                                                        fIRGenerator->fSymbolTabl
     e));; | 
| 198     fIRGenerator->popSymbolTable(); | 201     fIRGenerator->popSymbolTable(); | 
| 199     this->writeErrorCount(); | 202     this->writeErrorCount(); | 
| 200     return std::unique_ptr<Program>(new Program(kind, std::move(result)));; | 203     return result; | 
| 201 } | 204 } | 
| 202 | 205 | 
| 203 void Compiler::error(Position position, std::string msg) { | 206 void Compiler::error(Position position, std::string msg) { | 
| 204     fErrorCount++; | 207     fErrorCount++; | 
| 205     fErrorText += "error: " + position.description() + ": " + msg.c_str() + "\n"
     ; | 208     fErrorText += "error: " + position.description() + ": " + msg.c_str() + "\n"
     ; | 
| 206 } | 209 } | 
| 207 | 210 | 
| 208 std::string Compiler::errorText() { | 211 std::string Compiler::errorText() { | 
| 209     std::string result = fErrorText; | 212     std::string result = fErrorText; | 
| 210     return result; | 213     return result; | 
| 211 } | 214 } | 
| 212 | 215 | 
| 213 void Compiler::writeErrorCount() { | 216 void Compiler::writeErrorCount() { | 
| 214     if (fErrorCount) { | 217     if (fErrorCount) { | 
| 215         fErrorText += to_string(fErrorCount) + " error"; | 218         fErrorText += to_string(fErrorCount) + " error"; | 
| 216         if (fErrorCount > 1) { | 219         if (fErrorCount > 1) { | 
| 217             fErrorText += "s"; | 220             fErrorText += "s"; | 
| 218         } | 221         } | 
| 219         fErrorText += "\n"; | 222         fErrorText += "\n"; | 
| 220     } | 223     } | 
| 221 } | 224 } | 
| 222 | 225 | 
| 223 #include <fstream> | 226 #include <fstream> | 
| 224 bool Compiler::toSPIRV(Program::Kind kind, std::string text, std::ostream& out) 
     { | 227 bool Compiler::toSPIRV(Program::Kind kind, std::string text, std::ostream& out) 
     { | 
| 225     auto program = this->convertProgram(kind, text); | 228     auto program = this->convertProgram(kind, text); | 
| 226     if (fErrorCount == 0) { | 229     if (fErrorCount == 0) { | 
| 227         SkSL::SPIRVCodeGenerator cg; | 230         SkSL::SPIRVCodeGenerator cg(&fContext); | 
| 228         cg.generateCode(*program.get(), out); | 231         cg.generateCode(*program.get(), out); | 
| 229         ASSERT(!out.rdstate()); | 232         ASSERT(!out.rdstate()); | 
| 230     } | 233     } | 
| 231     return fErrorCount == 0; | 234     return fErrorCount == 0; | 
| 232 } | 235 } | 
| 233 | 236 | 
| 234 bool Compiler::toSPIRV(Program::Kind kind, std::string text, std::string* out) { | 237 bool Compiler::toSPIRV(Program::Kind kind, std::string text, std::string* out) { | 
| 235     std::stringstream buffer; | 238     std::stringstream buffer; | 
| 236     bool result = this->toSPIRV(kind, text, buffer); | 239     bool result = this->toSPIRV(kind, text, buffer); | 
| 237     if (result) { | 240     if (result) { | 
| 238         *out = buffer.str(); | 241         *out = buffer.str(); | 
| 239     } | 242     } | 
| 240     return fErrorCount == 0; | 243     return fErrorCount == 0; | 
| 241 } | 244 } | 
| 242 | 245 | 
| 243 } // namespace | 246 } // namespace | 
| OLD | NEW | 
|---|