HLSL: Add an Includer to handle #include.
This commit is contained in:
parent
44d2728e3d
commit
3494b4da9b
22 changed files with 362 additions and 19 deletions
|
|
@ -1607,11 +1607,6 @@ bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion
|
|||
forwardCompatible, messages, *intermediate, includer, sourceEntryPointName);
|
||||
}
|
||||
|
||||
bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages)
|
||||
{
|
||||
return parse(builtInResources, defaultVersion, ENoProfile, false, forwardCompatible, messages);
|
||||
}
|
||||
|
||||
// Fill in a string with the result of preprocessing ShaderStrings
|
||||
// Returns true if all extensions, pragmas and version strings were valid.
|
||||
bool TShader::preprocess(const TBuiltInResource* builtInResources,
|
||||
|
|
|
|||
|
|
@ -613,14 +613,14 @@ int TPpContext::CPPinclude(TPpToken* ppToken)
|
|||
TShader::Includer::IncludeResult* res = nullptr;
|
||||
if (startWithLocalSearch)
|
||||
res = includer.includeLocal(filename.c_str(), currentSourceFile.c_str(), includeStack.size() + 1);
|
||||
if (! res || res->headerName.empty()) {
|
||||
if (res == nullptr || res->headerName.empty()) {
|
||||
includer.releaseInclude(res);
|
||||
res = includer.includeSystem(filename.c_str(), currentSourceFile.c_str(), includeStack.size() + 1);
|
||||
}
|
||||
|
||||
// Process the results
|
||||
if (res && !res->headerName.empty()) {
|
||||
if (res->headerData && res->headerLength) {
|
||||
if (res != nullptr && !res->headerName.empty()) {
|
||||
if (res->headerData != nullptr && res->headerLength > 0) {
|
||||
// path for processing one or more tokens from an included header, hand off 'res'
|
||||
const bool forNextLine = parseContext.lineDirectiveShouldSetNextLine();
|
||||
std::ostringstream prologue;
|
||||
|
|
@ -638,8 +638,8 @@ int TPpContext::CPPinclude(TPpToken* ppToken)
|
|||
} else {
|
||||
// error path, clean up
|
||||
std::string message =
|
||||
res ? std::string(res->headerData, res->headerLength)
|
||||
: std::string("Could not process include directive");
|
||||
res != nullptr ? std::string(res->headerData, res->headerLength)
|
||||
: std::string("Could not process include directive");
|
||||
parseContext.ppError(directiveLoc, message.c_str(), "#include", "for header name: %s", filename.c_str());
|
||||
includer.releaseInclude(res);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -407,6 +407,9 @@ public:
|
|||
virtual void releaseInclude(IncludeResult*) override { }
|
||||
};
|
||||
|
||||
bool parse(const TBuiltInResource*, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
|
||||
bool forwardCompatible, EShMessages, Includer&);
|
||||
|
||||
bool parse(const TBuiltInResource* res, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
|
||||
bool forwardCompatible, EShMessages messages)
|
||||
{
|
||||
|
|
@ -414,12 +417,18 @@ public:
|
|||
return parse(res, defaultVersion, defaultProfile, forceDefaultVersionAndProfile, forwardCompatible, messages, includer);
|
||||
}
|
||||
|
||||
bool parse(const TBuiltInResource*, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
|
||||
bool forwardCompatible, EShMessages, Includer&);
|
||||
|
||||
// Equivalent to parse() without a default profile and without forcing defaults.
|
||||
// Provided for backwards compatibility.
|
||||
bool parse(const TBuiltInResource*, int defaultVersion, bool forwardCompatible, EShMessages);
|
||||
bool parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages)
|
||||
{
|
||||
return parse(builtInResources, defaultVersion, ENoProfile, false, forwardCompatible, messages);
|
||||
}
|
||||
|
||||
bool parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages,
|
||||
Includer& includer)
|
||||
{
|
||||
return parse(builtInResources, defaultVersion, ENoProfile, false, forwardCompatible, messages, includer);
|
||||
}
|
||||
|
||||
bool preprocess(const TBuiltInResource* builtInResources,
|
||||
int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
|
||||
bool forwardCompatible, EShMessages message, std::string* outputString,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue