glslang: Allow programmatically prepending code to a shader without worrying about #version being first, to implement command-line-defined macros. From Dejan Mircevski <deki@google.com>.
git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@31448 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
		
							parent
							
								
									a49fe84a4e
								
							
						
					
					
						commit
						b8478d7eac
					
				@ -435,6 +435,7 @@ bool CompileDeferred(
 | 
				
			|||||||
    const char* const shaderStrings[],
 | 
					    const char* const shaderStrings[],
 | 
				
			||||||
    const int numStrings,
 | 
					    const int numStrings,
 | 
				
			||||||
    const int* inputLengths,
 | 
					    const int* inputLengths,
 | 
				
			||||||
 | 
					    const char* customPreamble,
 | 
				
			||||||
    const EShOptimizationLevel optLevel,
 | 
					    const EShOptimizationLevel optLevel,
 | 
				
			||||||
    const TBuiltInResource* resources,
 | 
					    const TBuiltInResource* resources,
 | 
				
			||||||
    int defaultVersion,         // use 100 for ES environment, 110 for desktop
 | 
					    int defaultVersion,         // use 100 for ES environment, 110 for desktop
 | 
				
			||||||
@ -457,18 +458,20 @@ bool CompileDeferred(
 | 
				
			|||||||
    // which lets the grammar accept what was a null (post preprocessing) shader.
 | 
					    // which lets the grammar accept what was a null (post preprocessing) shader.
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // Shader will look like
 | 
					    // Shader will look like
 | 
				
			||||||
    //   string 0:                preamble
 | 
					    //   string 0:                system preamble
 | 
				
			||||||
    //   string 1...numStrings:   user's shader
 | 
					    //   string 1:                custom preamble
 | 
				
			||||||
    //   string numStrings+1:     "int;"
 | 
					    //   string 2...numStrings+1: user's shader
 | 
				
			||||||
    //
 | 
					    //   string numStrings+2:     "int;"
 | 
				
			||||||
    size_t* lengths = new size_t[numStrings + 2];
 | 
					    const int numPre = 2;
 | 
				
			||||||
    const char** strings = new const char*[numStrings + 2];
 | 
					    const int numPost = 1;
 | 
				
			||||||
 | 
					    size_t* lengths = new size_t[numStrings + numPre + numPost];
 | 
				
			||||||
 | 
					    const char** strings = new const char*[numStrings + numPre + numPost];
 | 
				
			||||||
    for (int s = 0; s < numStrings; ++s) {
 | 
					    for (int s = 0; s < numStrings; ++s) {
 | 
				
			||||||
        strings[s + 1] = shaderStrings[s];
 | 
					        strings[s + numPre] = shaderStrings[s];
 | 
				
			||||||
        if (inputLengths == 0 || inputLengths[s] < 0)
 | 
					        if (inputLengths == 0 || inputLengths[s] < 0)
 | 
				
			||||||
            lengths[s + 1] = strlen(shaderStrings[s]);
 | 
					            lengths[s + numPre] = strlen(shaderStrings[s]);
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            lengths[s + 1] = inputLengths[s];
 | 
					            lengths[s + numPre] = inputLengths[s];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // First, without using the preprocessor or parser, find the #version, so we know what
 | 
					    // First, without using the preprocessor or parser, find the #version, so we know what
 | 
				
			||||||
@ -476,7 +479,7 @@ bool CompileDeferred(
 | 
				
			|||||||
    // outlined above, just the user shader.
 | 
					    // outlined above, just the user shader.
 | 
				
			||||||
    int version;
 | 
					    int version;
 | 
				
			||||||
    EProfile profile;
 | 
					    EProfile profile;
 | 
				
			||||||
    glslang::TInputScanner userInput(numStrings, &strings[1], &lengths[1]);  // no preamble
 | 
					    glslang::TInputScanner userInput(numStrings, &strings[numPre], &lengths[numPre]);  // no preamble
 | 
				
			||||||
    bool versionNotFirstToken;
 | 
					    bool versionNotFirstToken;
 | 
				
			||||||
    bool versionNotFirst = userInput.scanVersion(version, profile, versionNotFirstToken);
 | 
					    bool versionNotFirst = userInput.scanVersion(version, profile, versionNotFirstToken);
 | 
				
			||||||
    bool versionNotFound = version == 0;
 | 
					    bool versionNotFound = version == 0;
 | 
				
			||||||
@ -534,9 +537,12 @@ bool CompileDeferred(
 | 
				
			|||||||
    // Fill in the strings as outlined above.
 | 
					    // Fill in the strings as outlined above.
 | 
				
			||||||
    strings[0] = parseContext.getPreamble();
 | 
					    strings[0] = parseContext.getPreamble();
 | 
				
			||||||
    lengths[0] = strlen(strings[0]);
 | 
					    lengths[0] = strlen(strings[0]);
 | 
				
			||||||
    strings[numStrings + 1] = "\n int;";
 | 
					    strings[1] = customPreamble;
 | 
				
			||||||
    lengths[numStrings + 1] = strlen(strings[numStrings + 1]);
 | 
					    lengths[1] = strlen(strings[1]);
 | 
				
			||||||
    TInputScanner fullInput(numStrings + 2, strings, lengths, 1, 1);
 | 
					    assert(2 == numPre);
 | 
				
			||||||
 | 
					    strings[numStrings + numPre] = "\n int;";
 | 
				
			||||||
 | 
					    lengths[numStrings + numPre] = strlen(strings[numStrings + numPre]);
 | 
				
			||||||
 | 
					    TInputScanner fullInput(numStrings + numPre + numPost, strings, lengths, numPre, numPost);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Push a new symbol allocation scope that will get used for the shader's globals.
 | 
					    // Push a new symbol allocation scope that will get used for the shader's globals.
 | 
				
			||||||
    symbolTable.push();
 | 
					    symbolTable.push();
 | 
				
			||||||
@ -707,7 +713,7 @@ int ShCompile(
 | 
				
			|||||||
    compiler->infoSink.debug.erase();
 | 
					    compiler->infoSink.debug.erase();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TIntermediate intermediate(compiler->getLanguage());
 | 
					    TIntermediate intermediate(compiler->getLanguage());
 | 
				
			||||||
    bool success = CompileDeferred(compiler, shaderStrings, numStrings, inputLengths, optLevel, resources, defaultVersion, forwardCompatible, messages, intermediate);
 | 
					    bool success = CompileDeferred(compiler, shaderStrings, numStrings, inputLengths, "", optLevel, resources, defaultVersion, forwardCompatible, messages, intermediate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // Call the machine dependent compiler
 | 
					    // Call the machine dependent compiler
 | 
				
			||||||
@ -966,7 +972,7 @@ public:
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TShader::TShader(EShLanguage s) 
 | 
					TShader::TShader(EShLanguage s) 
 | 
				
			||||||
    : pool(0), stage(s)
 | 
					    : pool(0), stage(s), preamble("")
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    infoSink = new TInfoSink;
 | 
					    infoSink = new TInfoSink;
 | 
				
			||||||
    compiler = new TDeferredCompiler(stage, *infoSink);
 | 
					    compiler = new TDeferredCompiler(stage, *infoSink);
 | 
				
			||||||
@ -993,8 +999,10 @@ bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    pool = new TPoolAllocator();
 | 
					    pool = new TPoolAllocator();
 | 
				
			||||||
    SetThreadPoolAllocator(*pool);
 | 
					    SetThreadPoolAllocator(*pool);
 | 
				
			||||||
 | 
					    if (! preamble)
 | 
				
			||||||
 | 
					        preamble = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return CompileDeferred(compiler, strings, numStrings, nullptr, EShOptNone, builtInResources, defaultVersion, forwardCompatible, messages, *intermediate);
 | 
					    return CompileDeferred(compiler, strings, numStrings, nullptr, preamble, EShOptNone, builtInResources, defaultVersion, forwardCompatible, messages, *intermediate);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char* TShader::getInfoLog()
 | 
					const char* TShader::getInfoLog()
 | 
				
			||||||
 | 
				
			|||||||
@ -263,11 +263,13 @@ bool InitializeProcess();
 | 
				
			|||||||
// Call once per process to tear down everything
 | 
					// Call once per process to tear down everything
 | 
				
			||||||
void FinalizeProcess();
 | 
					void FinalizeProcess();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Make one TShader per shader that you will link into a program.  Then
 | 
					// Make one TShader per shader that you will link into a program.  Then provide
 | 
				
			||||||
// provide the shader through setStrings(), then call parse(), then query
 | 
					// the shader through setStrings(), then call parse(), then query the info logs.
 | 
				
			||||||
// the info logs.
 | 
					// Optionally use setPreamble() to set a special shader string that will be
 | 
				
			||||||
 | 
					// processed before all others but won't affect the validity of #version.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// N.B.: Does not yet support having the same TShader instance being linked into multiple programs.
 | 
					// N.B.: Does not yet support having the same TShader instance being linked into
 | 
				
			||||||
 | 
					// multiple programs.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// N.B.: Destruct a linked program *before* destructing the shaders linked into it.
 | 
					// N.B.: Destruct a linked program *before* destructing the shaders linked into it.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
@ -276,6 +278,7 @@ public:
 | 
				
			|||||||
    explicit TShader(EShLanguage);
 | 
					    explicit TShader(EShLanguage);
 | 
				
			||||||
    virtual ~TShader();
 | 
					    virtual ~TShader();
 | 
				
			||||||
    void setStrings(const char* const* s, int n) { strings = s; numStrings = n; }
 | 
					    void setStrings(const char* const* s, int n) { strings = s; numStrings = n; }
 | 
				
			||||||
 | 
					    void setPreamble(const char* s) { preamble = s; }
 | 
				
			||||||
    bool parse(const TBuiltInResource*, int defaultVersion, bool forwardCompatible, EShMessages);
 | 
					    bool parse(const TBuiltInResource*, int defaultVersion, bool forwardCompatible, EShMessages);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const char* getInfoLog();
 | 
					    const char* getInfoLog();
 | 
				
			||||||
@ -290,6 +293,7 @@ protected:
 | 
				
			|||||||
    TIntermediate* intermediate;
 | 
					    TIntermediate* intermediate;
 | 
				
			||||||
    TInfoSink* infoSink;
 | 
					    TInfoSink* infoSink;
 | 
				
			||||||
    const char* const* strings;
 | 
					    const char* const* strings;
 | 
				
			||||||
 | 
					    const char* preamble;
 | 
				
			||||||
    int numStrings;
 | 
					    int numStrings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    friend class TProgram;
 | 
					    friend class TProgram;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user