Error("must provide -S when --stdin is given");
// Make sure that -E is not specified alongside linking (which includes SPV generation)
- if ((Options & EOptionOutputPreprocessed) && (Options & EOptionLinkProgram))
- Error("can't use -E when linking is selected");
+ // Or things that require linking
+ if (Options & EOptionOutputPreprocessed) {
+ if (Options & EOptionLinkProgram)
+ Error("can't use -E when linking is selected");
+ if (Options & EOptionDumpReflection)
+ Error("reflection requires linking, which can't be used when -E when is selected");
+ }
+
+ // reflection requires linking
+ if ((Options & EOptionDumpReflection) && !(Options & EOptionLinkProgram))
+ Error("reflection requires -l for linking");
// -o or -x makes no sense if there is no target binary
if (binaryFileName && (Options & EOptionSpv) == 0)
" -l link all input files together to form a single module\n"
" -m memory leak mode\n"
" -o <file> save binary to <file>, requires a binary option (e.g., -V)\n"
- " -q dump reflection query database\n"
+ " -q dump reflection query database; requires -l for linking\n"
" -r | --relaxed-errors"
" relaxed GLSL semantic error-checking mode\n"
" -s silence syntax and semantic error reporting\n"
bool TProgram::buildReflection(int opts)
{
- if (! linked || reflection)
+ if (! linked || reflection != nullptr)
return false;
int firstStage = EShLangVertex, lastStage = EShLangFragment;
return true;
}
-unsigned TProgram::getLocalSize(int dim) const { return reflection->getLocalSize(dim); }
-int TProgram::getReflectionIndex(const char* name) const { return reflection->getIndex(name); }
-
+unsigned TProgram::getLocalSize(int dim) const { return reflection->getLocalSize(dim); }
+int TProgram::getReflectionIndex(const char* name) const { return reflection->getIndex(name); }
int TProgram::getNumUniformVariables() const { return reflection->getNumUniforms(); }
const TObjectReflection& TProgram::getUniform(int index) const { return reflection->getUniform(index); }
int TProgram::getNumUniformBlocks() const { return reflection->getNumUniformBlocks(); }
const TObjectReflection& TProgram::getBufferBlock(int index) const { return reflection->getStorageBufferBlock(index); }
int TProgram::getNumAtomicCounters() const { return reflection->getNumAtomicCounters(); }
const TObjectReflection& TProgram::getAtomicCounter(int index) const { return reflection->getAtomicCounter(index); }
-
-void TProgram::dumpReflection() { reflection->dump(); }
+void TProgram::dumpReflection() { if (reflection != nullptr) reflection->dump(); }
//
// I/O mapping implementation.
// Reflection Interface
// call first, to do liveness analysis, index mapping, etc.; returns false on failure
- bool buildReflection(int opts = EShReflectionDefault);
+ bool buildReflection(int opts = EShReflectionDefault);
unsigned getLocalSize(int dim) const; // return dim'th local size
int getReflectionIndex(const char *name) const;