/// Initializize the symbol table /// \param BuiltInStrings /// Pointer to built in strings. /// \param language /// Shading language to initialize symbol table for /// \param infoSink /// Information sink (for errors/warnings) /// \param symbolTables /// Array of symbol tables (one for each language) /// \param bUseGlobalSymbolTable /// Whether to use the global symbol table or the per-language symbol table /// \return /// True if succesfully initialized, false otherwise bool InitializeSymbolTable( TBuiltInStrings* BuiltInStrings, EShLanguage language, TInfoSink& infoSink, TSymbolTable* symbolTables, bool bUseGlobalSymbolTable ) { TIntermediate intermediate(infoSink); TSymbolTable* symbolTable; if ( bUseGlobalSymbolTable ) symbolTable = symbolTables; else symbolTable = &symbolTables[language]; TParseContext parseContext(*symbolTable, intermediate, language, infoSink); GlobalParseContext = &parseContext; setInitialState(); assert(symbolTable->isEmpty() || symbolTable->atSharedBuiltInLevel()); // // Parse the built-ins. This should only happen once per // language symbol table. // // Push the symbol table to give it an initial scope. This // push should not have a corresponding pop, so that built-ins // are preserved, and the test for an empty table fails. // symbolTable->push(); //Initialize the Preprocessor int ret = InitPreprocessor(); if (ret) { infoSink.info.message(EPrefixInternalError, "Unable to intialize the Preprocessor"); return false; } for (TBuiltInStrings::iterator i = BuiltInStrings[parseContext.language].begin(); i != BuiltInStrings[parseContext.language].end(); ++i) { const char* builtInShaders = (*i).c_str(); if (PaParseString(const_cast<char*>(builtInShaders), parseContext) != 0) { infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins"); return false; } } if ( !bUseGlobalSymbolTable ) { IdentifyBuiltIns(parseContext.language, *symbolTable); } FinalizePreprocessor(); return true; }
bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources &resources) { compileResources = resources; setResourceString(); assert(symbolTable.isEmpty()); symbolTable.push(); // COMMON_BUILTINS symbolTable.push(); // ESSL1_BUILTINS symbolTable.push(); // ESSL3_BUILTINS TPublicType integer; integer.type = EbtInt; integer.primarySize = 1; integer.secondarySize = 1; integer.array = false; TPublicType floatingPoint; floatingPoint.type = EbtFloat; floatingPoint.primarySize = 1; floatingPoint.secondarySize = 1; floatingPoint.array = false; TPublicType sampler; sampler.primarySize = 1; sampler.secondarySize = 1; sampler.array = false; switch(shaderType) { case GL_FRAGMENT_SHADER: symbolTable.setDefaultPrecision(integer, EbpMedium); break; case GL_VERTEX_SHADER: symbolTable.setDefaultPrecision(integer, EbpHigh); symbolTable.setDefaultPrecision(floatingPoint, EbpHigh); break; default: assert(false && "Language not supported"); } // We set defaults for all the sampler types, even those that are // only available if an extension exists. for (int samplerType = EbtGuardSamplerBegin + 1; samplerType < EbtGuardSamplerEnd; ++samplerType) { sampler.type = static_cast<TBasicType>(samplerType); symbolTable.setDefaultPrecision(sampler, EbpLow); } InsertBuiltInFunctions(shaderType, shaderSpec, resources, symbolTable); IdentifyBuiltIns(shaderType, shaderSpec, resources, symbolTable); return true; }
/// Initializize the symbol table /// \param BuiltInStrings /// Pointer to built in strings. /// \param language /// Shading language to initialize symbol table for /// \param infoSink /// Information sink (for errors/warnings) /// \param symbolTables /// Array of symbol tables (one for each language) /// \param bUseGlobalSymbolTable /// Whether to use the global symbol table or the per-language symbol table /// \return /// True if succesfully initialized, false otherwise static bool InitializeSymbolTable( TBuiltInStrings* BuiltInStrings, EShLanguage language, TInfoSink& infoSink, TSymbolTable* symbolTables, bool bUseGlobalSymbolTable ) { TSymbolTable* symbolTable; if ( bUseGlobalSymbolTable ) symbolTable = symbolTables; else symbolTable = &symbolTables[language]; //@TODO: for now, we use same global symbol table for all target language versions. // This is wrong and will have to be changed at some point. TParseContext parseContext(*symbolTable, language, ETargetVersionCount, 0, infoSink); GlobalParseContext = &parseContext; setInitialState(); assert(symbolTable->isEmpty() || symbolTable->atSharedBuiltInLevel()); // // Parse the built-ins. This should only happen once per // language symbol table. // // Push the symbol table to give it an initial scope. This // push should not have a corresponding pop, so that built-ins // are preserved, and the test for an empty table fails. // symbolTable->push(); for (TBuiltInStrings::iterator i = BuiltInStrings[parseContext.language].begin(); i != BuiltInStrings[parseContext.language].end(); ++i) { const char* builtInShaders = (*i).c_str(); if (PaParseString(const_cast<char*>(builtInShaders), parseContext, NULL) != 0) { infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins"); return false; } } if ( !bUseGlobalSymbolTable ) { IdentifyBuiltIns(parseContext.language, *symbolTable); } return true; }
bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources &resources) { compileResources = resources; setResourceString(); assert(symbolTable.isEmpty()); symbolTable.push(); // COMMON_BUILTINS symbolTable.push(); // ESSL1_BUILTINS symbolTable.push(); // ESSL3_BUILTINS symbolTable.push(); // ESSL3_1_BUILTINS TPublicType integer; integer.type = EbtInt; integer.primarySize = 1; integer.secondarySize = 1; integer.array = false; TPublicType floatingPoint; floatingPoint.type = EbtFloat; floatingPoint.primarySize = 1; floatingPoint.secondarySize = 1; floatingPoint.array = false; switch(shaderType) { case GL_FRAGMENT_SHADER: symbolTable.setDefaultPrecision(integer, EbpMedium); break; case GL_VERTEX_SHADER: symbolTable.setDefaultPrecision(integer, EbpHigh); symbolTable.setDefaultPrecision(floatingPoint, EbpHigh); break; default: assert(false && "Language not supported"); } // Set defaults for sampler types that have default precision, even those that are // only available if an extension exists. // New sampler types in ESSL3 don't have default precision. ESSL1 types do. initSamplerDefaultPrecision(EbtSampler2D); initSamplerDefaultPrecision(EbtSamplerCube); // SamplerExternalOES is specified in the extension to have default precision. initSamplerDefaultPrecision(EbtSamplerExternalOES); // It isn't specified whether Sampler2DRect has default precision. initSamplerDefaultPrecision(EbtSampler2DRect); InsertBuiltInFunctions(shaderType, shaderSpec, resources, symbolTable); IdentifyBuiltIns(shaderType, shaderSpec, resources, symbolTable); return true; }
static bool InitializeSymbolTable( const TBuiltInStrings& builtInStrings, EShLanguage language, EShSpec spec, const TBuiltInResource& resources, TInfoSink& infoSink, TSymbolTable& symbolTable) { TIntermediate intermediate(infoSink); TParseContext parseContext(symbolTable, intermediate, language, spec, infoSink); GlobalParseContext = &parseContext; setInitialState(); assert(symbolTable.isEmpty()); // // Parse the built-ins. This should only happen once per // language symbol table. // // Push the symbol table to give it an initial scope. This // push should not have a corresponding pop, so that built-ins // are preserved, and the test for an empty table fails. // symbolTable.push(); //Initialize the Preprocessor if (InitPreprocessor()) { infoSink.info.message(EPrefixInternalError, "Unable to intialize the Preprocessor"); return false; } for (TBuiltInStrings::const_iterator i = builtInStrings.begin(); i != builtInStrings.end(); ++i) { const char* builtInShaders[1]; int builtInLengths[1]; builtInShaders[0] = (*i).c_str(); builtInLengths[0] = (int) (*i).size(); if (PaParseStrings(const_cast<char**>(builtInShaders), builtInLengths, 1, parseContext) != 0) { infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins"); return false; } } IdentifyBuiltIns(language, spec, resources, symbolTable); FinalizePreprocessor(); return true; }
bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources &resources) { compileResources = resources; assert(symbolTable.isEmpty()); symbolTable.push(); TPublicType integer; integer.type = EbtInt; integer.size = 1; integer.matrix = false; integer.array = false; TPublicType floatingPoint; floatingPoint.type = EbtFloat; floatingPoint.size = 1; floatingPoint.matrix = false; floatingPoint.array = false; switch(shaderType) { case SH_FRAGMENT_SHADER: symbolTable.setDefaultPrecision(integer, EbpMedium); break; case SH_VERTEX_SHADER: symbolTable.setDefaultPrecision(integer, EbpHigh); symbolTable.setDefaultPrecision(floatingPoint, EbpHigh); break; default: assert(false && "Language not supported"); } InsertBuiltInFunctions(shaderType, shaderSpec, resources, symbolTable); IdentifyBuiltIns(shaderType, shaderSpec, resources, symbolTable); return true; }