Merge pull request #45 from google/source-string-name
Add mechanism for specifying names for source strings.
This commit is contained in:
commit
1363fcd60b
@ -51,7 +51,7 @@ const int EndOfInput = -1;
|
|||||||
//
|
//
|
||||||
class TInputScanner {
|
class TInputScanner {
|
||||||
public:
|
public:
|
||||||
TInputScanner(int n, const char* const s[], size_t L[], int b = 0, int f = 0) :
|
TInputScanner(int n, const char* const s[], size_t L[], const char* const* names = nullptr, int b = 0, int f = 0) :
|
||||||
numSources(n),
|
numSources(n),
|
||||||
sources(reinterpret_cast<const unsigned char* const *>(s)), // up to this point, common usage is "char*", but now we need positive 8-bit characters
|
sources(reinterpret_cast<const unsigned char* const *>(s)), // up to this point, common usage is "char*", but now we need positive 8-bit characters
|
||||||
lengths(L), currentSource(0), currentChar(0), stringBias(b), finale(f)
|
lengths(L), currentSource(0), currentChar(0), stringBias(b), finale(f)
|
||||||
@ -60,6 +60,10 @@ public:
|
|||||||
for (int i = 0; i < numSources; ++i) {
|
for (int i = 0; i < numSources; ++i) {
|
||||||
loc[i].init();
|
loc[i].init();
|
||||||
}
|
}
|
||||||
|
if (names != nullptr) {
|
||||||
|
for (int i = 0; i < numSources; ++i)
|
||||||
|
loc[i].name = names[i];
|
||||||
|
}
|
||||||
loc[currentSource].string = -stringBias;
|
loc[currentSource].string = -stringBias;
|
||||||
loc[currentSource].line = 1;
|
loc[currentSource].line = 1;
|
||||||
loc[currentSource].column = 0;
|
loc[currentSource].column = 0;
|
||||||
|
|||||||
@ -450,6 +450,7 @@ bool ProcessDeferred(
|
|||||||
const char* const shaderStrings[],
|
const char* const shaderStrings[],
|
||||||
const int numStrings,
|
const int numStrings,
|
||||||
const int* inputLengths,
|
const int* inputLengths,
|
||||||
|
const char* const stringNames[],
|
||||||
const char* customPreamble,
|
const char* customPreamble,
|
||||||
const EShOptimizationLevel optLevel,
|
const EShOptimizationLevel optLevel,
|
||||||
const TBuiltInResource* resources,
|
const TBuiltInResource* resources,
|
||||||
@ -485,8 +486,10 @@ bool ProcessDeferred(
|
|||||||
// string numStrings+2: "int;"
|
// string numStrings+2: "int;"
|
||||||
const int numPre = 2;
|
const int numPre = 2;
|
||||||
const int numPost = requireNonempty? 1 : 0;
|
const int numPost = requireNonempty? 1 : 0;
|
||||||
size_t* lengths = new size_t[numStrings + numPre + numPost];
|
const int numTotal = numPre + numStrings + numPost;
|
||||||
const char** strings = new const char*[numStrings + numPre + numPost];
|
size_t* lengths = new size_t[numTotal];
|
||||||
|
const char** strings = new const char*[numTotal];
|
||||||
|
const char** names = new const char*[numTotal];
|
||||||
for (int s = 0; s < numStrings; ++s) {
|
for (int s = 0; s < numStrings; ++s) {
|
||||||
strings[s + numPre] = shaderStrings[s];
|
strings[s + numPre] = shaderStrings[s];
|
||||||
if (inputLengths == 0 || inputLengths[s] < 0)
|
if (inputLengths == 0 || inputLengths[s] < 0)
|
||||||
@ -494,6 +497,13 @@ bool ProcessDeferred(
|
|||||||
else
|
else
|
||||||
lengths[s + numPre] = inputLengths[s];
|
lengths[s + numPre] = inputLengths[s];
|
||||||
}
|
}
|
||||||
|
if (stringNames != nullptr) {
|
||||||
|
for (int s = 0; s < numStrings; ++s)
|
||||||
|
names[s + numPre] = stringNames[s];
|
||||||
|
} else {
|
||||||
|
for (int s = 0; s < numStrings; ++s)
|
||||||
|
names[s + numPre] = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
// First, without using the preprocessor or parser, find the #version, so we know what
|
// First, without using the preprocessor or parser, find the #version, so we know what
|
||||||
// symbol tables, processing rules, etc. to set up. This does not need the extra strings
|
// symbol tables, processing rules, etc. to set up. This does not need the extra strings
|
||||||
@ -573,14 +583,18 @@ bool ProcessDeferred(
|
|||||||
// Fill in the strings as outlined above.
|
// Fill in the strings as outlined above.
|
||||||
strings[0] = parseContext.getPreamble();
|
strings[0] = parseContext.getPreamble();
|
||||||
lengths[0] = strlen(strings[0]);
|
lengths[0] = strlen(strings[0]);
|
||||||
|
names[0] = nullptr;
|
||||||
strings[1] = customPreamble;
|
strings[1] = customPreamble;
|
||||||
lengths[1] = strlen(strings[1]);
|
lengths[1] = strlen(strings[1]);
|
||||||
|
names[1] = nullptr;
|
||||||
assert(2 == numPre);
|
assert(2 == numPre);
|
||||||
if (requireNonempty) {
|
if (requireNonempty) {
|
||||||
strings[numStrings + numPre] = "\n int;";
|
const int postIndex = numStrings + numPre;
|
||||||
lengths[numStrings + numPre] = strlen(strings[numStrings + numPre]);
|
strings[postIndex] = "\n int;";
|
||||||
|
lengths[postIndex] = strlen(strings[numStrings + numPre]);
|
||||||
|
names[postIndex] = nullptr;
|
||||||
}
|
}
|
||||||
TInputScanner fullInput(numStrings + numPre + numPost, strings, lengths, numPre, numPost);
|
TInputScanner fullInput(numStrings + numPre + numPost, strings, lengths, names, numPre, numPost);
|
||||||
|
|
||||||
// Push a new symbol allocation scope that will get used for the shader's globals.
|
// Push a new symbol allocation scope that will get used for the shader's globals.
|
||||||
symbolTable.push();
|
symbolTable.push();
|
||||||
@ -595,6 +609,7 @@ bool ProcessDeferred(
|
|||||||
|
|
||||||
delete [] lengths;
|
delete [] lengths;
|
||||||
delete [] strings;
|
delete [] strings;
|
||||||
|
delete [] names;
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
@ -814,6 +829,7 @@ bool PreprocessDeferred(
|
|||||||
const char* const shaderStrings[],
|
const char* const shaderStrings[],
|
||||||
const int numStrings,
|
const int numStrings,
|
||||||
const int* inputLengths,
|
const int* inputLengths,
|
||||||
|
const char* const stringNames[],
|
||||||
const char* preamble,
|
const char* preamble,
|
||||||
const EShOptimizationLevel optLevel,
|
const EShOptimizationLevel optLevel,
|
||||||
const TBuiltInResource* resources,
|
const TBuiltInResource* resources,
|
||||||
@ -826,8 +842,9 @@ bool PreprocessDeferred(
|
|||||||
std::string* outputString)
|
std::string* outputString)
|
||||||
{
|
{
|
||||||
DoPreprocessing parser(outputString);
|
DoPreprocessing parser(outputString);
|
||||||
return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths,
|
return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,
|
||||||
preamble, optLevel, resources, defaultVersion, defaultProfile, forceDefaultVersionAndProfile,
|
preamble, optLevel, resources, defaultVersion,
|
||||||
|
defaultProfile, forceDefaultVersionAndProfile,
|
||||||
forwardCompatible, messages, intermediate, parser, false);
|
forwardCompatible, messages, intermediate, parser, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -848,6 +865,7 @@ bool CompileDeferred(
|
|||||||
const char* const shaderStrings[],
|
const char* const shaderStrings[],
|
||||||
const int numStrings,
|
const int numStrings,
|
||||||
const int* inputLengths,
|
const int* inputLengths,
|
||||||
|
const char* const stringNames[],
|
||||||
const char* preamble,
|
const char* preamble,
|
||||||
const EShOptimizationLevel optLevel,
|
const EShOptimizationLevel optLevel,
|
||||||
const TBuiltInResource* resources,
|
const TBuiltInResource* resources,
|
||||||
@ -859,8 +877,9 @@ bool CompileDeferred(
|
|||||||
TIntermediate& intermediate) // returned tree, etc.
|
TIntermediate& intermediate) // returned tree, etc.
|
||||||
{
|
{
|
||||||
DoFullParse parser;
|
DoFullParse parser;
|
||||||
return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths,
|
return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,
|
||||||
preamble, optLevel, resources, defaultVersion, defaultProfile, forceDefaultVersionAndProfile,
|
preamble, optLevel, resources, defaultVersion,
|
||||||
|
defaultProfile, forceDefaultVersionAndProfile,
|
||||||
forwardCompatible, messages, intermediate, parser, true);
|
forwardCompatible, messages, intermediate, parser, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1003,7 +1022,9 @@ int ShCompile(
|
|||||||
compiler->infoSink.debug.erase();
|
compiler->infoSink.debug.erase();
|
||||||
|
|
||||||
TIntermediate intermediate(compiler->getLanguage());
|
TIntermediate intermediate(compiler->getLanguage());
|
||||||
bool success = CompileDeferred(compiler, shaderStrings, numStrings, inputLengths, "", optLevel, resources, defaultVersion, ENoProfile, false, forwardCompatible, messages, intermediate);
|
bool success = CompileDeferred(compiler, shaderStrings, numStrings, inputLengths, nullptr,
|
||||||
|
"", optLevel, resources, defaultVersion, ENoProfile, false,
|
||||||
|
forwardCompatible, messages, intermediate);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Call the machine dependent compiler
|
// Call the machine dependent compiler
|
||||||
@ -1262,7 +1283,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
TShader::TShader(EShLanguage s)
|
TShader::TShader(EShLanguage s)
|
||||||
: pool(0), stage(s), preamble(""), lengths(nullptr)
|
: pool(0), stage(s), preamble(""), lengths(nullptr), stringNames(nullptr)
|
||||||
{
|
{
|
||||||
infoSink = new TInfoSink;
|
infoSink = new TInfoSink;
|
||||||
compiler = new TDeferredCompiler(stage, *infoSink);
|
compiler = new TDeferredCompiler(stage, *infoSink);
|
||||||
@ -1290,6 +1311,16 @@ void TShader::setStringsWithLengths(const char* const* s, const int* l, int n)
|
|||||||
numStrings = n;
|
numStrings = n;
|
||||||
lengths = l;
|
lengths = l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TShader::setStringsWithLengthsAndNames(
|
||||||
|
const char* const* s, const int* l, const char* const* names, int n)
|
||||||
|
{
|
||||||
|
strings = s;
|
||||||
|
numStrings = n;
|
||||||
|
lengths = l;
|
||||||
|
stringNames = names;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Turn the shader strings into a parse tree in the TIntermediate.
|
// Turn the shader strings into a parse tree in the TIntermediate.
|
||||||
//
|
//
|
||||||
@ -1306,7 +1337,10 @@ bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion
|
|||||||
if (! preamble)
|
if (! preamble)
|
||||||
preamble = "";
|
preamble = "";
|
||||||
|
|
||||||
return CompileDeferred(compiler, strings, numStrings, lengths, preamble, EShOptNone, builtInResources, defaultVersion, defaultProfile, forceDefaultVersionAndProfile, forwardCompatible, messages, *intermediate);
|
return CompileDeferred(compiler, strings, numStrings, lengths, stringNames,
|
||||||
|
preamble, EShOptNone, builtInResources, defaultVersion,
|
||||||
|
defaultProfile, forceDefaultVersionAndProfile,
|
||||||
|
forwardCompatible, messages, *intermediate);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages)
|
bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages)
|
||||||
@ -1329,10 +1363,10 @@ bool TShader::preprocess(const TBuiltInResource* builtInResources,
|
|||||||
if (! preamble)
|
if (! preamble)
|
||||||
preamble = "";
|
preamble = "";
|
||||||
|
|
||||||
return PreprocessDeferred(compiler, strings, numStrings,
|
return PreprocessDeferred(compiler, strings, numStrings, lengths, stringNames, preamble,
|
||||||
lengths, preamble, EShOptNone, builtInResources,
|
EShOptNone, builtInResources, defaultVersion,
|
||||||
defaultVersion, defaultProfile, forceDefaultVersionAndProfile, forwardCompatible, message,
|
defaultProfile, forceDefaultVersionAndProfile,
|
||||||
*intermediate, output_string);
|
forwardCompatible, message, *intermediate, output_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* TShader::getInfoLog()
|
const char* TShader::getInfoLog()
|
||||||
|
|||||||
@ -285,6 +285,8 @@ public:
|
|||||||
virtual ~TShader();
|
virtual ~TShader();
|
||||||
void setStrings(const char* const* s, int n);
|
void setStrings(const char* const* s, int n);
|
||||||
void setStringsWithLengths(const char* const* s, const int* l, int n);
|
void setStringsWithLengths(const char* const* s, const int* l, int n);
|
||||||
|
void setStringsWithLengthsAndNames(
|
||||||
|
const char* const* s, const int* l, const char* const* names, int n);
|
||||||
void setPreamble(const char* s) { preamble = s; }
|
void setPreamble(const char* s) { preamble = s; }
|
||||||
bool parse(const TBuiltInResource*, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile, bool forwardCompatible, EShMessages);
|
bool parse(const TBuiltInResource*, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile, bool forwardCompatible, EShMessages);
|
||||||
// Equivalent to parse() without a default profile and without forcing defaults.
|
// Equivalent to parse() without a default profile and without forcing defaults.
|
||||||
@ -312,8 +314,12 @@ protected:
|
|||||||
// integers containing the length of the associated strings.
|
// integers containing the length of the associated strings.
|
||||||
// if lengths is null or lengths[n] < 0 the associated strings[n] is
|
// if lengths is null or lengths[n] < 0 the associated strings[n] is
|
||||||
// assumed to be null-terminated.
|
// assumed to be null-terminated.
|
||||||
|
// stringNames is the optional names for all the strings. If stringNames
|
||||||
|
// is null, then none of the strings has name. If a certain element in
|
||||||
|
// stringNames is null, then the corresponding string does not have name.
|
||||||
const char* const* strings;
|
const char* const* strings;
|
||||||
const int* lengths;
|
const int* lengths;
|
||||||
|
const char* const* stringNames;
|
||||||
const char* preamble;
|
const char* preamble;
|
||||||
int numStrings;
|
int numStrings;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user