Add scanner that can find '#version' across an array of non-null terminated, length-based, strings. Handle the ES error where #version is not the first thing found, while still supporting desktop behavior, and more generally support length-based multiple strings for a single shader.

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@22165 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
John Kessenich
2013-06-25 18:10:05 +00:00
parent ebf0825ec4
commit 41cf6b540b
8 changed files with 386 additions and 144 deletions

View File

@@ -79,8 +79,9 @@ void usage();
void FreeFileData(char **data);
char** ReadFileData(const char *fileName);
void InfoLogMsg(const char* msg, const char* name, const int num);
//Added to accomodate the multiple strings.
int OutputMultipleStrings = 1;
// Use to test breaking a single shader file into multiple strings.
int NumShaderStrings = 1;
//
// Set up the per compile resources
@@ -255,21 +256,31 @@ static EShLanguage FindLanguage(char *name)
bool CompileFile(const char *fileName, ShHandle compiler, int debugOptions, const TBuiltInResource *resources)
{
int ret;
char **data = ReadFileData(fileName);
char** shaderStrings = ReadFileData(fileName);
int* lengths = new int[NumShaderStrings];
// move to length-based strings, rather than null-terminated strings
for (int s = 0; s < NumShaderStrings; ++s)
lengths[s] = strlen(shaderStrings[s]);
#ifdef _WIN32
PROCESS_MEMORY_COUNTERS counters; // just for memory leak testing
#endif
if (!data)
if (! shaderStrings)
return false;
EShMessages messages = EShMsgDefault;
if (debugOptions & EDebugOpRelaxedErrors)
messages = (EShMessages)(messages | EShMsgRelaxedErrors);
for (int i = 0; i < ((debugOptions & EDebugOpMemoryLeakMode) ? 100 : 1); ++i) {
for (int j = 0; j < ((debugOptions & EDebugOpMemoryLeakMode) ? 100 : 1); ++j)
ret = ShCompile(compiler, data, OutputMultipleStrings, EShOptNone, resources, debugOptions, 100, false, messages);
for (int j = 0; j < ((debugOptions & EDebugOpMemoryLeakMode) ? 100 : 1); ++j) {
//ret = ShCompile(compiler, shaderStrings, NumShaderStrings, lengths, EShOptNone, resources, debugOptions, 100, false, messages);
ret = ShCompile(compiler, shaderStrings, NumShaderStrings, 0, EShOptNone, resources, debugOptions, 100, false, messages);
//const char* multi[4] = { "# ve", "rsion", " 300 e", "s" };
//const char* multi[7] = { "/", "/", "\\", "\n", "\n", "#", "version 300 es" };
//ret = ShCompile(compiler, multi, 4, 0, EShOptNone, resources, debugOptions, 100, false, messages);
}
#ifdef _WIN32
if (debugOptions & EDebugOpMemoryLeakMode) {
@@ -279,7 +290,8 @@ bool CompileFile(const char *fileName, ShHandle compiler, int debugOptions, cons
#endif
}
FreeFileData(data);
delete [] lengths;
FreeFileData(shaderStrings);
return ret ? true : false;
}
@@ -366,11 +378,11 @@ char** ReadFileData(const char *fileName)
if(count==0){
return_data[0]=(char*)malloc(count+2);
return_data[0][0]='\0';
OutputMultipleStrings=0;
NumShaderStrings=0;
return return_data;
}
int len = (int)(ceil)((float)count/(float)OutputMultipleStrings);
int len = (int)(ceil)((float)count/(float)NumShaderStrings);
int ptr_len=0,i=0;
while(count>0){
return_data[i]=(char*)malloc(len+2);
@@ -380,7 +392,7 @@ char** ReadFileData(const char *fileName)
ptr_len+=(len);
if(count<len){
if(count==0){
OutputMultipleStrings=(i+1);
NumShaderStrings=(i+1);
break;
}
len = count;
@@ -394,7 +406,7 @@ char** ReadFileData(const char *fileName)
void FreeFileData(char **data)
{
for(int i=0;i<OutputMultipleStrings;i++)
for(int i=0;i<NumShaderStrings;i++)
free(data[i]);
}