Option rationalization and minor clean up.
git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@22907 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
parent
8700e9e6d1
commit
94a81fbd31
@ -46,6 +46,17 @@ extern "C" {
|
|||||||
SH_IMPORT_EXPORT void ShOutputHtml();
|
SH_IMPORT_EXPORT void ShOutputHtml();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Command-line options
|
||||||
|
enum TOptions {
|
||||||
|
EOptionNone = 0x000,
|
||||||
|
EOptionIntermediate = 0x001,
|
||||||
|
EOptionSuppressInfolog = 0x002,
|
||||||
|
EOptionMemoryLeakMode = 0x004,
|
||||||
|
EOptionRelaxedErrors = 0x008,
|
||||||
|
EOptionGiveWarnings = 0x010,
|
||||||
|
EOptionsLinkProgram = 0x020,
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Return codes from main.
|
// Return codes from main.
|
||||||
//
|
//
|
||||||
@ -109,7 +120,7 @@ void GenerateResources(TBuiltInResource& resources)
|
|||||||
}
|
}
|
||||||
|
|
||||||
glslang::TWorklist Worklist;
|
glslang::TWorklist Worklist;
|
||||||
int DebugOptions = 0;
|
int Options = 0;
|
||||||
bool Delay = false;
|
bool Delay = false;
|
||||||
|
|
||||||
bool ProcessArguments(int argc, char* argv[])
|
bool ProcessArguments(int argc, char* argv[])
|
||||||
@ -123,20 +134,20 @@ bool ProcessArguments(int argc, char* argv[])
|
|||||||
Delay = true;
|
Delay = true;
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
DebugOptions |= EDebugOpIntermediate;
|
Options |= EOptionIntermediate;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
DebugOptions |= EDebugOpMemoryLeakMode;
|
Options |= EOptionsLinkProgram;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
Options |= EOptionMemoryLeakMode;
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
DebugOptions |= EDebugOpRelaxedErrors;
|
Options |= EOptionRelaxedErrors;
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
DebugOptions |= EDebugOpSuppressInfolog;
|
Options |= EOptionSuppressInfolog;
|
||||||
break;
|
break;
|
||||||
case 't':
|
|
||||||
DebugOptions |= EDebugOpTexturePrototypes;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -155,21 +166,21 @@ unsigned int
|
|||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
__stdcall
|
__stdcall
|
||||||
#endif
|
#endif
|
||||||
CompileShaders(void*)
|
CompileShaders(void*)
|
||||||
{
|
{
|
||||||
ShHandle compiler;
|
ShHandle compiler;
|
||||||
|
|
||||||
std::string shaderName;
|
std::string shaderName;
|
||||||
while (Worklist.remove(shaderName)) {
|
while (Worklist.remove(shaderName)) {
|
||||||
compiler = ShConstructCompiler(FindLanguage(shaderName), DebugOptions);
|
compiler = ShConstructCompiler(FindLanguage(shaderName), Options);
|
||||||
if (compiler == 0)
|
if (compiler == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
TBuiltInResource resources;
|
TBuiltInResource resources;
|
||||||
GenerateResources(resources);
|
GenerateResources(resources);
|
||||||
CompileFile(shaderName.c_str(), compiler, DebugOptions, &resources);
|
CompileFile(shaderName.c_str(), compiler, Options, &resources);
|
||||||
|
|
||||||
if (! (DebugOptions & EDebugOpSuppressInfolog))
|
if (! (Options & EOptionSuppressInfolog))
|
||||||
puts(ShGetInfoLog(compiler));
|
puts(ShGetInfoLog(compiler));
|
||||||
|
|
||||||
ShDestruct(compiler);
|
ShDestruct(compiler);
|
||||||
@ -231,6 +242,7 @@ int C_DECL main(int argc, char* argv[])
|
|||||||
// .tese = tessellation evaluation
|
// .tese = tessellation evaluation
|
||||||
// .geom = geometry
|
// .geom = geometry
|
||||||
// .frag = fragment
|
// .frag = fragment
|
||||||
|
// .comp = compute
|
||||||
//
|
//
|
||||||
EShLanguage FindLanguage(const std::string& name)
|
EShLanguage FindLanguage(const std::string& name)
|
||||||
{
|
{
|
||||||
@ -261,7 +273,7 @@ EShLanguage FindLanguage(const std::string& name)
|
|||||||
//
|
//
|
||||||
// Read a file's data into a string, and compile it using ShCompile
|
// Read a file's data into a string, and compile it using ShCompile
|
||||||
//
|
//
|
||||||
bool CompileFile(const char *fileName, ShHandle compiler, int debugOptions, const TBuiltInResource *resources)
|
bool CompileFile(const char *fileName, ShHandle compiler, int Options, const TBuiltInResource *resources)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
char** shaderStrings = ReadFileData(fileName);
|
char** shaderStrings = ReadFileData(fileName);
|
||||||
@ -280,18 +292,20 @@ bool CompileFile(const char *fileName, ShHandle compiler, int debugOptions, cons
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
EShMessages messages = EShMsgDefault;
|
EShMessages messages = EShMsgDefault;
|
||||||
if (debugOptions & EDebugOpRelaxedErrors)
|
if (Options & EOptionRelaxedErrors)
|
||||||
messages = (EShMessages)(messages | EShMsgRelaxedErrors);
|
messages = (EShMessages)(messages | EShMsgRelaxedErrors);
|
||||||
for (int i = 0; i < ((debugOptions & EDebugOpMemoryLeakMode) ? 100 : 1); ++i) {
|
if (Options & EOptionIntermediate)
|
||||||
for (int j = 0; j < ((debugOptions & EDebugOpMemoryLeakMode) ? 100 : 1); ++j) {
|
messages = (EShMessages)(messages | EShMsgAST);
|
||||||
//ret = ShCompile(compiler, shaderStrings, NumShaderStrings, lengths, EShOptNone, resources, debugOptions, 100, false, messages);
|
for (int i = 0; i < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++i) {
|
||||||
ret = ShCompile(compiler, shaderStrings, NumShaderStrings, 0, EShOptNone, resources, debugOptions, 100, false, messages);
|
for (int j = 0; j < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++j) {
|
||||||
|
//ret = ShCompile(compiler, shaderStrings, NumShaderStrings, lengths, EShOptNone, resources, Options, 100, false, messages);
|
||||||
|
ret = ShCompile(compiler, shaderStrings, NumShaderStrings, 0, EShOptNone, resources, Options, 100, false, messages);
|
||||||
//const char* multi[4] = { "# ve", "rsion", " 300 e", "s" };
|
//const char* multi[4] = { "# ve", "rsion", " 300 e", "s" };
|
||||||
//const char* multi[7] = { "/", "/", "\\", "\n", "\n", "#", "version 300 es" };
|
//const char* multi[7] = { "/", "/", "\\", "\n", "\n", "#", "version 300 es" };
|
||||||
//ret = ShCompile(compiler, multi, 4, 0, EShOptNone, resources, debugOptions, 100, false, messages);
|
//ret = ShCompile(compiler, multi, 4, 0, EShOptNone, resources, Options, 100, false, messages);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debugOptions & EDebugOpMemoryLeakMode)
|
if (Options & EOptionMemoryLeakMode)
|
||||||
glslang::OS_DumpMemoryCounters();
|
glslang::OS_DumpMemoryCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,7 +333,8 @@ void usage()
|
|||||||
"To get other information, use one of the following options:\n"
|
"To get other information, use one of the following options:\n"
|
||||||
"-i: intermediate tree (glslang AST) is printed out\n"
|
"-i: intermediate tree (glslang AST) is printed out\n"
|
||||||
"-d: delay exit\n"
|
"-d: delay exit\n"
|
||||||
"-l: memory leak mode\n"
|
"-l: link validation of all input files\n"
|
||||||
|
"-m: memory leak mode\n"
|
||||||
"-s: silent mode\n"
|
"-s: silent mode\n"
|
||||||
"-r: relaxed semantic error-checking mode\n");
|
"-r: relaxed semantic error-checking mode\n");
|
||||||
}
|
}
|
||||||
|
7
Todo.txt
7
Todo.txt
@ -1,8 +1,4 @@
|
|||||||
Current functionality level: ESSL 3.0
|
Current functionality level: ESSL 3.0
|
||||||
|
|
||||||
Error checking
|
|
||||||
- compile-time check for static recursion
|
|
||||||
- location layout range/overlap semantics
|
|
||||||
|
|
||||||
Performance
|
Performance
|
||||||
|
|
||||||
@ -27,6 +23,7 @@ Link Validation
|
|||||||
- type consistency check of uniforms, globals, ins, and outs, both variables and blocks
|
- type consistency check of uniforms, globals, ins, and outs, both variables and blocks
|
||||||
- location/component/binding/index/offset match check
|
- location/component/binding/index/offset match check
|
||||||
- location/component aliasing (except desktop vertex shader inputs)
|
- location/component aliasing (except desktop vertex shader inputs)
|
||||||
|
- location layout range/overlap semantics
|
||||||
- geometry shader input array sizes and input layout qualifier declaration
|
- geometry shader input array sizes and input layout qualifier declaration
|
||||||
- compute shader layout(local_size_*) matching
|
- compute shader layout(local_size_*) matching
|
||||||
- mixed es/non-es profiles
|
- mixed es/non-es profiles
|
||||||
|
@ -572,7 +572,7 @@ protected:
|
|||||||
bool userDefined; // used for user defined function names
|
bool userDefined; // used for user defined function names
|
||||||
bool optimize;
|
bool optimize;
|
||||||
bool debug;
|
bool debug;
|
||||||
TPragmaTable *pragmaTable;
|
TPragmaTable* pragmaTable;
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -634,6 +634,7 @@ public:
|
|||||||
visitAggregate(0),
|
visitAggregate(0),
|
||||||
visitLoop(0),
|
visitLoop(0),
|
||||||
visitBranch(0),
|
visitBranch(0),
|
||||||
|
visitSwitch(0),
|
||||||
depth(0),
|
depth(0),
|
||||||
preVisit(true),
|
preVisit(true),
|
||||||
postVisit(false),
|
postVisit(false),
|
||||||
|
@ -198,9 +198,10 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, TIntermTyped* constantNod
|
|||||||
newConstArray = new TConstUnion[objectSize];
|
newConstArray = new TConstUnion[objectSize];
|
||||||
for (int i = 0; i < objectSize; i++) {
|
for (int i = 0; i < objectSize; i++) {
|
||||||
switch (getType().getBasicType()) {
|
switch (getType().getBasicType()) {
|
||||||
|
case EbtDouble:
|
||||||
case EbtFloat:
|
case EbtFloat:
|
||||||
newConstArray[i].setDConst(unionArray[i].getDConst() / rightUnionArray[i].getDConst());
|
newConstArray[i].setDConst(unionArray[i].getDConst() / rightUnionArray[i].getDConst());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EbtInt:
|
case EbtInt:
|
||||||
if (rightUnionArray[i] == 0) {
|
if (rightUnionArray[i] == 0) {
|
||||||
@ -438,6 +439,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType,
|
|||||||
switch (op) {
|
switch (op) {
|
||||||
case EOpNegative:
|
case EOpNegative:
|
||||||
switch (getType().getBasicType()) {
|
switch (getType().getBasicType()) {
|
||||||
|
case EbtDouble:
|
||||||
case EbtFloat: newConstArray[i].setDConst(-unionArray[i].getDConst()); break;
|
case EbtFloat: newConstArray[i].setDConst(-unionArray[i].getDConst()); break;
|
||||||
case EbtInt: newConstArray[i].setIConst(-unionArray[i].getIConst()); break;
|
case EbtInt: newConstArray[i].setIConst(-unionArray[i].getIConst()); break;
|
||||||
case EbtUint: newConstArray[i].setUConst(static_cast<unsigned int>(-static_cast<int>(unionArray[i].getUConst()))); break;
|
case EbtUint: newConstArray[i].setUConst(static_cast<unsigned int>(-static_cast<int>(unionArray[i].getUConst()))); break;
|
||||||
|
@ -88,6 +88,20 @@ void RemoveConstantUnion(TIntermConstantUnion* node, TIntermTraverser*)
|
|||||||
delete node;
|
delete node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RemoveLoop(bool /*preVisit*/ , TIntermLoop* node, TIntermTraverser*)
|
||||||
|
{
|
||||||
|
delete node;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RemoveBranch(bool /*preVisit*/ , TIntermBranch* node, TIntermTraverser*)
|
||||||
|
{
|
||||||
|
delete node;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Entry point.
|
// Entry point.
|
||||||
//
|
//
|
||||||
@ -95,12 +109,14 @@ void RemoveAllTreeNodes(TIntermNode* root)
|
|||||||
{
|
{
|
||||||
TIntermTraverser it;
|
TIntermTraverser it;
|
||||||
|
|
||||||
it.visitAggregate = RemoveAggregate;
|
|
||||||
it.visitBinary = RemoveBinary;
|
|
||||||
it.visitConstantUnion = RemoveConstantUnion;
|
|
||||||
it.visitSelection = RemoveSelection;
|
|
||||||
it.visitSymbol = RemoveSymbol;
|
it.visitSymbol = RemoveSymbol;
|
||||||
|
it.visitConstantUnion = RemoveConstantUnion;
|
||||||
|
it.visitBinary = RemoveBinary;
|
||||||
it.visitUnary = RemoveUnary;
|
it.visitUnary = RemoveUnary;
|
||||||
|
it.visitAggregate = RemoveAggregate;
|
||||||
|
it.visitSelection = RemoveSelection;
|
||||||
|
it.visitLoop = RemoveLoop;
|
||||||
|
it.visitBranch = RemoveBranch;
|
||||||
it.visitSwitch = RemoveSwitch;
|
it.visitSwitch = RemoveSwitch;
|
||||||
|
|
||||||
it.preVisit = false;
|
it.preVisit = false;
|
||||||
|
@ -413,10 +413,10 @@ int ShCompile(
|
|||||||
const int* inputLengths,
|
const int* inputLengths,
|
||||||
const EShOptimizationLevel optLevel,
|
const EShOptimizationLevel optLevel,
|
||||||
const TBuiltInResource* resources,
|
const TBuiltInResource* resources,
|
||||||
int debugOptions,
|
int debugOptions, // currently unused
|
||||||
int defaultVersion, // use 100 for ES environment, 110 for desktop
|
int defaultVersion, // use 100 for ES environment, 110 for desktop
|
||||||
bool forwardCompatible, // give errors for use of deprecated features
|
bool forwardCompatible, // give errors for use of deprecated features
|
||||||
EShMessages messages // warnings/errors
|
EShMessages messages // warnings/errors/AST; things to print out
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (! InitThread())
|
if (! InitThread())
|
||||||
@ -513,6 +513,10 @@ int ShCompile(
|
|||||||
success = false;
|
success = false;
|
||||||
intermediate.addSymbolLinkageNodes(parseContext.treeRoot, parseContext.linkage, parseContext.language, symbolTable);
|
intermediate.addSymbolLinkageNodes(parseContext.treeRoot, parseContext.linkage, parseContext.language, symbolTable);
|
||||||
|
|
||||||
|
// Clean up the symbol table before deallocating the pool memory it used.
|
||||||
|
// The AST is self-sufficient now, so it can be done before the rest of compilation/linking.
|
||||||
|
delete symbolTableMemory;
|
||||||
|
|
||||||
if (success && parseContext.treeRoot) {
|
if (success && parseContext.treeRoot) {
|
||||||
if (optLevel == EShOptNoGeneration)
|
if (optLevel == EShOptNoGeneration)
|
||||||
parseContext.infoSink.info.message(EPrefixNone, "No errors. No code generation or linking was requested.");
|
parseContext.infoSink.info.message(EPrefixNone, "No errors. No code generation or linking was requested.");
|
||||||
@ -520,7 +524,7 @@ int ShCompile(
|
|||||||
success = intermediate.postProcess(parseContext.treeRoot, parseContext.language);
|
success = intermediate.postProcess(parseContext.treeRoot, parseContext.language);
|
||||||
|
|
||||||
if (success) {
|
if (success) {
|
||||||
if (debugOptions & EDebugOpIntermediate)
|
if (messages & EShMsgAST)
|
||||||
intermediate.outputTree(parseContext.treeRoot);
|
intermediate.outputTree(parseContext.treeRoot);
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -534,15 +538,11 @@ int ShCompile(
|
|||||||
parseContext.infoSink.info.prefix(EPrefixError);
|
parseContext.infoSink.info.prefix(EPrefixError);
|
||||||
parseContext.infoSink.info << parseContext.numErrors << " compilation errors. No code generated.\n\n";
|
parseContext.infoSink.info << parseContext.numErrors << " compilation errors. No code generated.\n\n";
|
||||||
success = false;
|
success = false;
|
||||||
if (debugOptions & EDebugOpIntermediate)
|
if (messages & EShMsgAST)
|
||||||
intermediate.outputTree(parseContext.treeRoot);
|
intermediate.outputTree(parseContext.treeRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
intermediate.remove(parseContext.treeRoot);
|
intermediate.remove(parseContext.treeRoot);
|
||||||
|
|
||||||
// Clean up the symbol table before deallocating the pool memory it used.
|
|
||||||
delete symbolTableMemory;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Throw away all the temporary memory used by the compilation process.
|
// Throw away all the temporary memory used by the compilation process.
|
||||||
//
|
//
|
||||||
|
@ -120,7 +120,8 @@ typedef enum {
|
|||||||
enum EShMessages {
|
enum EShMessages {
|
||||||
EShMsgDefault = 0, // default is to give all required errors and extra warnings
|
EShMsgDefault = 0, // default is to give all required errors and extra warnings
|
||||||
EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input
|
EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input
|
||||||
EShMsgSuppressWarnings = (1 << 1) // suppress all warnings, except those required by the specification
|
EShMsgSuppressWarnings = (1 << 1), // suppress all warnings, except those required by the specification
|
||||||
|
EShMsgAST = (1 << 2), // print the AST intermediate representation
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -177,18 +178,6 @@ SH_IMPORT_EXPORT int ShCompile(
|
|||||||
EShMessages messages = EShMsgDefault // warnings and errors
|
EShMessages messages = EShMsgDefault // warnings and errors
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Similar to ShCompile, but accepts an opaque handle to an
|
|
||||||
// intermediate language structure.
|
|
||||||
//
|
|
||||||
SH_IMPORT_EXPORT int ShCompileIntermediate(
|
|
||||||
ShHandle compiler,
|
|
||||||
ShHandle intermediate,
|
|
||||||
const EShOptimizationLevel,
|
|
||||||
int debuggable // boolean
|
|
||||||
);
|
|
||||||
|
|
||||||
SH_IMPORT_EXPORT int ShLink(
|
SH_IMPORT_EXPORT int ShLink(
|
||||||
const ShHandle, // linker object
|
const ShHandle, // linker object
|
||||||
const ShHandle h[], // compiler objects to link together
|
const ShHandle h[], // compiler objects to link together
|
||||||
@ -228,20 +217,8 @@ SH_IMPORT_EXPORT int ShExcludeAttributes(const ShHandle, int *attributes, int co
|
|||||||
//
|
//
|
||||||
SH_IMPORT_EXPORT int ShGetUniformLocation(const ShHandle uniformMap, const char* name);
|
SH_IMPORT_EXPORT int ShGetUniformLocation(const ShHandle uniformMap, const char* name);
|
||||||
|
|
||||||
enum TDebugOptions {
|
|
||||||
EDebugOpNone = 0x000,
|
|
||||||
EDebugOpIntermediate = 0x001,
|
|
||||||
EDebugOpAssembly = 0x002,
|
|
||||||
EDebugOpObjectCode = 0x004,
|
|
||||||
EDebugOpLinkMaps = 0x008,
|
|
||||||
EDebugOpSuppressInfolog = 0x010,
|
|
||||||
EDebugOpMemoryLeakMode = 0x020,
|
|
||||||
EDebugOpTexturePrototypes = 0x040,
|
|
||||||
EDebugOpRelaxedErrors = 0x080,
|
|
||||||
EDebugOpGiveWarnings = 0x100,
|
|
||||||
};
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
} // end extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // _COMPILER_INTERFACE_INCLUDED_
|
#endif // _COMPILER_INTERFACE_INCLUDED_
|
||||||
|
Loading…
x
Reference in New Issue
Block a user