Add the GL_ES macro for ES personalities, along with a general mechanism for adding preambles in front of shaders without effecting line numbers, etc.

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@21122 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
John Kessenich 2013-04-11 16:31:09 +00:00
parent 63eed3867a
commit b51f62c573
8 changed files with 60 additions and 23 deletions

View File

@ -8,3 +8,8 @@ out vec4 o;
void main() void main()
{ {
} }
#ifdef GL_ES
#error GL_ES is set
#else
#error GL_ES is not set
#endif

View File

@ -7,7 +7,7 @@ uniform mat4x4 m44;
in vec3 v3; in vec3 v3;
in vec2 v2; in vec2 v2;
in vec4 bad[10]; in vec4 bad[10]; // ERROR
void main() void main()
{ {
@ -30,4 +30,10 @@ void main()
mat3x3 im = inverse(m33); mat3x3 im = inverse(m33);
mat3x2 op = outerProduct(v2, v3); mat3x2 op = outerProduct(v2, v3);
#ifdef GL_ES
#error GL_ES is set
#else
#error GL_ES is not set
#endif
} }

View File

@ -77,6 +77,16 @@ TParseContext::TParseContext(TSymbolTable& symt, TIntermediate& interm, int v, E
defaultGlobalQualification.layoutSlotLocation = 0; defaultGlobalQualification.layoutSlotLocation = 0;
} }
// Get code that is not part of a shared symbol table, specific to this shader
// or needed by CPP (which does not have a shared symbol table).
const char* TParseContext::getPreamble()
{
if (profile == EEsProfile)
return "#define GL_ES 1\n";
else
return 0;
}
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
// //
// Sub- vector and matrix fields // Sub- vector and matrix fields

View File

@ -96,6 +96,7 @@ struct TParseContext {
bool AfterEOF; bool AfterEOF;
void initializeExtensionBehavior(); void initializeExtensionBehavior();
const char* getPreamble();
void C_DECL error(TSourceLoc, const char *szReason, const char *szToken, void C_DECL error(TSourceLoc, const char *szReason, const char *szToken,
const char *szExtraInfoFormat, ...); const char *szExtraInfoFormat, ...);
@ -159,7 +160,7 @@ struct TParseContext {
void doubleCheck(int line, const char* op); void doubleCheck(int line, const char* op);
}; };
int PaParseStrings(char* argv[], int strLen[], int argc, TParseContext&); int PaParseStrings(char* argv[], int strLen[], int argc, TParseContext&, const char* preamble);
int PaParseComment(int &lineno, TParseContext&); int PaParseComment(int &lineno, TParseContext&);
void ResetFlex(); void ResetFlex();

View File

@ -132,7 +132,7 @@ bool InitializeSymbolTable(TBuiltInStrings* BuiltInStrings, int version, EProfil
builtInShaders[0] = (*i).c_str(); builtInShaders[0] = (*i).c_str();
builtInLengths[0] = (int) (*i).size(); builtInLengths[0] = (int) (*i).size();
if (PaParseStrings(const_cast<char**>(builtInShaders), builtInLengths, 1, parseContext) != 0) { if (PaParseStrings(const_cast<char**>(builtInShaders), builtInLengths, 1, parseContext, 0) != 0) {
infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins"); infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins");
return false; return false;
@ -548,7 +548,7 @@ int ShCompile(
if (parseContext.insertBuiltInArrayAtGlobalLevel()) if (parseContext.insertBuiltInArrayAtGlobalLevel())
success = false; success = false;
int ret = PaParseStrings(const_cast<char**>(shaderStrings), 0, numStrings, parseContext); int ret = PaParseStrings(const_cast<char**>(shaderStrings), 0, numStrings, parseContext, parseContext.getPreamble());
if (ret) if (ret)
success = false; success = false;

View File

@ -470,15 +470,8 @@ int yy_input(char* buf, int max_size)
// //
// Returns 0 for success, as per yyparse(). // Returns 0 for success, as per yyparse().
// //
int PaParseStrings(char* argv[], int strLen[], int argc, TParseContext& parseContextLocal) int PaParseStrings(char* argv[], int strLen[], int argc, TParseContext& parseContextLocal, const char* preamble)
{ {
int argv0len;
ScanFromString(argv[0]);
//Storing the Current Compiler Parse context into the cpp structure.
cpp->pC = (void*)&parseContextLocal;
if (!argv || argc == 0) if (!argv || argc == 0)
return 1; return 1;
@ -490,13 +483,27 @@ int PaParseStrings(char* argv[], int strLen[], int argc, TParseContext& parseCon
} }
} }
// set up all the cpp fields...
cpp->pC = (void*)&parseContextLocal;
char *writeablePreamble = 0;
if (preamble) {
// preAmble could be a hard-coded string; make writable copy
// TODO: CPP: make it not need writable strings
int size = strlen(preamble) + 1;
writeablePreamble = new char[size];
memcpy(writeablePreamble, preamble, size);
ScanFromString(writeablePreamble);
cpp->PaWhichStr = -1;
} else {
ScanFromString(argv[0]);
cpp->PaWhichStr = 0;
}
if (! strLen) { if (! strLen) {
argv0len = (int) strlen(argv[0]); int argv0len = (int) strlen(argv[0]);
strLen = &argv0len; strLen = &argv0len;
} }
yyrestart(0); yyrestart(0);
(&parseContextLocal)->AfterEOF = false; (&parseContextLocal)->AfterEOF = false;
cpp->PaWhichStr = 0;
cpp->PaArgv = argv; cpp->PaArgv = argv;
cpp->PaArgc = argc; cpp->PaArgc = argc;
cpp->PaStrLen = strLen; cpp->PaStrLen = strLen;
@ -508,9 +515,10 @@ int PaParseStrings(char* argv[], int strLen[], int argc, TParseContext& parseCon
while (argv[0][len] == ' ' || while (argv[0][len] == ' ' ||
argv[0][len] == '\t' || argv[0][len] == '\t' ||
argv[0][len] == '\n' || argv[0][len] == '\n' ||
argv[0][len] == '\r') argv[0][len] == '\r') {
if (++len >= strLen[0]) if (++len >= strLen[0])
return 0; return 0;
}
if (*cpp->PaStrLen > 0) { if (*cpp->PaStrLen > 0) {
int ret; int ret;
@ -519,11 +527,15 @@ int PaParseStrings(char* argv[], int strLen[], int argc, TParseContext& parseCon
#else #else
ret = yyparse((void*)(&parseContextLocal)); ret = yyparse((void*)(&parseContextLocal));
#endif #endif
delete writeablePreamble;
if (cpp->CompileError == 1 || parseContextLocal.recoveredFromError || parseContextLocal.numErrors > 0) if (cpp->CompileError == 1 || parseContextLocal.recoveredFromError || parseContextLocal.numErrors > 0)
return 1; return 1;
else else
return 0; return 0;
} else }
delete writeablePreamble;
return 0; return 0;
} }

View File

@ -176,6 +176,10 @@ static int str_getch(StringInputSrc *in)
} }
return *in->p++; return *in->p++;
} }
if (cpp->PaWhichStr < 0) {
// we only parsed the built-in pre-amble; start with clean slate for user code
cpp->notAVersionToken = 0;
}
if (++(cpp->PaWhichStr) < cpp->PaArgc) { if (++(cpp->PaWhichStr) < cpp->PaArgc) {
free(in); free(in);
SetStringNumber(cpp->PaWhichStr); SetStringNumber(cpp->PaWhichStr);
@ -183,8 +187,7 @@ static int str_getch(StringInputSrc *in)
ScanFromString(cpp->PaArgv[cpp->PaWhichStr]); ScanFromString(cpp->PaArgv[cpp->PaWhichStr]);
in=(StringInputSrc*)cpp->currentInput; in=(StringInputSrc*)cpp->currentInput;
continue; continue;
} } else {
else{
cpp->currentInput = in->base.prev; cpp->currentInput = in->base.prev;
cpp->PaWhichStr=0; cpp->PaWhichStr=0;
free(in); free(in);