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:
parent
63eed3867a
commit
b51f62c573
@ -89,7 +89,7 @@ int OutputMultipleStrings = 1;
|
|||||||
// Set up the per compile resources
|
// Set up the per compile resources
|
||||||
//
|
//
|
||||||
void GenerateResources(TBuiltInResource& resources)
|
void GenerateResources(TBuiltInResource& resources)
|
||||||
{
|
{
|
||||||
resources.maxLights = 32;
|
resources.maxLights = 32;
|
||||||
resources.maxClipPlanes = 6;
|
resources.maxClipPlanes = 6;
|
||||||
resources.maxTextureUnits = 32;
|
resources.maxTextureUnits = 32;
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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,12 +527,16 @@ 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
|
}
|
||||||
return 0;
|
|
||||||
|
delete writeablePreamble;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void yyerror(const char *s)
|
void yyerror(const char *s)
|
||||||
|
@ -168,23 +168,26 @@ int FreeScanner(void)
|
|||||||
*/
|
*/
|
||||||
static int str_getch(StringInputSrc *in)
|
static int str_getch(StringInputSrc *in)
|
||||||
{
|
{
|
||||||
for(;;){
|
for(;;) {
|
||||||
if (*in->p){
|
if (*in->p) {
|
||||||
if (*in->p == '\n') {
|
if (*in->p == '\n') {
|
||||||
in->base.line++;
|
in->base.line++;
|
||||||
IncLineNumber();
|
IncLineNumber();
|
||||||
}
|
}
|
||||||
return *in->p++;
|
return *in->p++;
|
||||||
}
|
}
|
||||||
if(++(cpp->PaWhichStr) < cpp->PaArgc){
|
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) {
|
||||||
free(in);
|
free(in);
|
||||||
SetStringNumber(cpp->PaWhichStr);
|
SetStringNumber(cpp->PaWhichStr);
|
||||||
SetLineNumber(1);
|
SetLineNumber(1);
|
||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user