diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp index 42a46cee..d26040c6 100644 --- a/StandAlone/StandAlone.cpp +++ b/StandAlone/StandAlone.cpp @@ -152,6 +152,7 @@ void ProcessConfigFile() } } +int ReflectOptions = EShReflectionDefault; int Options = 0; const char* ExecutableName = nullptr; const char* binaryFileName = nullptr; @@ -1051,7 +1052,7 @@ void CompileAndLinkShaderUnits(std::vector compUnits) // Reflect if (Options & EOptionDumpReflection) { - program.buildReflection(); + program.buildReflection(ReflectOptions); program.dumpReflection(); } diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp index 6b330c87..3e77292f 100755 --- a/glslang/MachineIndependent/ShaderLang.cpp +++ b/glslang/MachineIndependent/ShaderLang.cpp @@ -1966,12 +1966,12 @@ const char* TProgram::getInfoDebugLog() // Reflection implementation. // -bool TProgram::buildReflection() +bool TProgram::buildReflection(int opts) { if (! linked || reflection) return false; - reflection = new TReflection; + reflection = new TReflection((EShReflectionOptions)opts); for (int s = 0; s < EShLangCount; ++s) { if (intermediate[s]) { diff --git a/glslang/MachineIndependent/reflection.h b/glslang/MachineIndependent/reflection.h index 6c1d106d..c4464aab 100644 --- a/glslang/MachineIndependent/reflection.h +++ b/glslang/MachineIndependent/reflection.h @@ -55,7 +55,7 @@ class TReflectionTraverser; // The full reflection database class TReflection { public: - TReflection() : badReflection(TObjectReflection::badReflection()) + TReflection(EShReflectionOptions opts) : options(opts), badReflection(TObjectReflection::badReflection()) { for (int dim=0; dim<3; ++dim) localSize[dim] = 0; @@ -125,6 +125,8 @@ protected: typedef std::map TNameToIndex; typedef std::vector TMapIndexToReflection; + EShReflectionOptions options; + TObjectReflection badReflection; // return for queries of -1 or generally out of range; has expected descriptions with in it for this TNameToIndex nameToIndex; // maps names to indexes; can hold all types of data: uniform/buffer and which function names have been processed TMapIndexToReflection indexToUniform; diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h index 341fdb2f..3bb9f5e8 100755 --- a/glslang/Public/ShaderLang.h +++ b/glslang/Public/ShaderLang.h @@ -239,6 +239,13 @@ enum EShMessages { EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (right now only for samplers) }; +// +// Options for building reflection +// +typedef enum { + EShReflectionDefault = 0, // default is original behaviour before options were added +} EShReflectionOptions; + // // Build a table for bindings. This can be used for locating // attributes, uniforms, globals, etc., as needed. @@ -717,7 +724,9 @@ public: TIntermediate* getIntermediate(EShLanguage stage) const { return intermediate[stage]; } // Reflection Interface - bool buildReflection(); // call first, to do liveness analysis, index mapping, etc.; returns false on failure + + // call first, to do liveness analysis, index mapping, etc.; returns false on failure + bool buildReflection(int opts = EShReflectionDefault); unsigned getLocalSize(int dim) const; // return dim'th local size int getReflectionIndex(const char *name) const;