Add flags for outputting absolute paths for messages (#3467)

Uses std::filesystem to create absolute paths.
Also adds "shaderFileName" to TSinkBase so it can be used during message
outputs.
This commit is contained in:
Sharo 2024-03-08 00:02:45 +00:00 committed by GitHub
parent e7d4ad91a9
commit d73712b8f6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 73 additions and 40 deletions

View file

@ -182,6 +182,7 @@ bool HlslEnable16BitTypes = false;
bool HlslDX9compatible = false; bool HlslDX9compatible = false;
bool HlslDxPositionW = false; bool HlslDxPositionW = false;
bool EnhancedMsgs = false; bool EnhancedMsgs = false;
bool AbsolutePath = false;
bool DumpBuiltinSymbols = false; bool DumpBuiltinSymbols = false;
std::vector<std::string> IncludeDirectoryList; std::vector<std::string> IncludeDirectoryList;
@ -727,6 +728,8 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
HlslDxPositionW = true; HlslDxPositionW = true;
} else if (lowerword == "enhanced-msgs") { } else if (lowerword == "enhanced-msgs") {
EnhancedMsgs = true; EnhancedMsgs = true;
} else if (lowerword == "absolute-path") {
AbsolutePath = true;
} else if (lowerword == "auto-sampled-textures") { } else if (lowerword == "auto-sampled-textures") {
autoSampledTextures = true; autoSampledTextures = true;
} else if (lowerword == "invert-y" || // synonyms } else if (lowerword == "invert-y" || // synonyms
@ -1159,6 +1162,8 @@ void SetMessageOptions(EShMessages& messages)
messages = (EShMessages)(messages | EShMsgBuiltinSymbolTable); messages = (EShMessages)(messages | EShMsgBuiltinSymbolTable);
if (EnhancedMsgs) if (EnhancedMsgs)
messages = (EShMessages)(messages | EShMsgEnhanced); messages = (EShMessages)(messages | EShMsgEnhanced);
if (AbsolutePath)
messages = (EShMessages)(messages | EShMsgAbsolutePath);
} }
// //
@ -1190,6 +1195,7 @@ void CompileShaders(glslang::TWorklist& worklist)
if (compiler == nullptr) if (compiler == nullptr)
return; return;
CompileFile(workItem->name.c_str(), compiler); CompileFile(workItem->name.c_str(), compiler);
if (! (Options & EOptionSuppressInfolog)) if (! (Options & EOptionSuppressInfolog))
@ -1878,7 +1884,7 @@ void CompileFile(const char* fileName, ShHandle compiler)
for (int j = 0; j < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++j) { for (int j = 0; j < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++j) {
// ret = ShCompile(compiler, shaderStrings, NumShaderStrings, lengths, EShOptNone, &Resources, Options, (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages); // ret = ShCompile(compiler, shaderStrings, NumShaderStrings, lengths, EShOptNone, &Resources, Options, (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages);
ret = ShCompile(compiler, &shaderString, 1, nullptr, EShOptNone, GetResources(), 0, ret = ShCompile(compiler, &shaderString, 1, nullptr, EShOptNone, GetResources(), 0,
(Options & EOptionDefaultDesktop) ? 110 : 100, false, messages); (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages, fileName);
// const char* multi[12] = { "# ve", "rsion", " 300 e", "s", "\n#err", // const char* multi[12] = { "# ve", "rsion", " 300 e", "s", "\n#err",
// "or should be l", "ine 1", "string 5\n", "float glo", "bal", // "or should be l", "ine 1", "string 5\n", "float glo", "bal",
// ";\n#error should be line 2\n void main() {", "global = 2.3;}" }; // ";\n#error should be line 2\n void main() {", "global = 2.3;}" };
@ -1993,6 +1999,7 @@ void usage()
" without explicit bindings\n" " without explicit bindings\n"
" --auto-map-locations | --aml automatically locate input/output lacking\n" " --auto-map-locations | --aml automatically locate input/output lacking\n"
" 'location' (fragile, not cross stage)\n" " 'location' (fragile, not cross stage)\n"
" --absolute-path Prints absolute path for messages\n"
" --auto-sampled-textures Removes sampler variables and converts\n" " --auto-sampled-textures Removes sampler variables and converts\n"
" existing textures to sampled textures\n" " existing textures to sampled textures\n"
" --client {vulkan<ver>|opengl<ver>} see -V and -G\n" " --client {vulkan<ver>|opengl<ver>} see -V and -G\n"

View file

@ -205,6 +205,7 @@ static int c_shader_messages(glslang_messages_t messages)
CONVERT_MSG(GLSLANG_MSG_HLSL_LEGALIZATION_BIT, EShMsgHlslLegalization); CONVERT_MSG(GLSLANG_MSG_HLSL_LEGALIZATION_BIT, EShMsgHlslLegalization);
CONVERT_MSG(GLSLANG_MSG_HLSL_DX9_COMPATIBLE_BIT, EShMsgHlslDX9Compatible); CONVERT_MSG(GLSLANG_MSG_HLSL_DX9_COMPATIBLE_BIT, EShMsgHlslDX9Compatible);
CONVERT_MSG(GLSLANG_MSG_BUILTIN_SYMBOL_TABLE_BIT, EShMsgBuiltinSymbolTable); CONVERT_MSG(GLSLANG_MSG_BUILTIN_SYMBOL_TABLE_BIT, EShMsgBuiltinSymbolTable);
CONVERT_MSG(GLSLANG_MSG_ABSOLUTE_PATH, EShMsgAbsolutePath);
return res; return res;
#undef CONVERT_MSG #undef CONVERT_MSG
} }

View file

@ -36,6 +36,7 @@
#define _INFOSINK_INCLUDED_ #define _INFOSINK_INCLUDED_
#include "../Include/Common.h" #include "../Include/Common.h"
#include <filesystem>
#include <cmath> #include <cmath>
namespace glslang { namespace glslang {
@ -67,7 +68,7 @@ enum TOutputStream {
// //
class TInfoSinkBase { class TInfoSinkBase {
public: public:
TInfoSinkBase() : outputStream(4) {} TInfoSinkBase() : outputStream(4), shaderFileName(nullptr) {}
void erase() { sink.erase(); } void erase() { sink.erase(); }
TInfoSinkBase& operator<<(const TPersistString& t) { append(t); return *this; } TInfoSinkBase& operator<<(const TPersistString& t) { append(t); return *this; }
TInfoSinkBase& operator<<(char c) { append(1, c); return *this; } TInfoSinkBase& operator<<(char c) { append(1, c); return *this; }
@ -94,11 +95,22 @@ public:
default: append("UNKNOWN ERROR: "); break; default: append("UNKNOWN ERROR: "); break;
} }
} }
void location(const TSourceLoc& loc) { void location(const TSourceLoc& loc, bool absolute = false) {
const int maxSize = 24; const int maxSize = 24;
char locText[maxSize]; char locText[maxSize];
snprintf(locText, maxSize, ":%d", loc.line); snprintf(locText, maxSize, ":%d", loc.line);
append(loc.getStringNameOrNum(false).c_str());
if(loc.getFilename() == nullptr && shaderFileName != nullptr && absolute) {
append(std::filesystem::absolute(shaderFileName).string());
} else {
std::string location = loc.getStringNameOrNum(false);
if (absolute) {
append(std::filesystem::absolute(location).string());
} else {
append(location);
}
}
append(locText); append(locText);
append(": "); append(": ");
} }
@ -119,6 +131,11 @@ public:
outputStream = output; outputStream = output;
} }
void setShaderFileName(const char* file = nullptr)
{
shaderFileName = file;
}
protected: protected:
void append(const char* s); void append(const char* s);
@ -131,6 +148,7 @@ protected:
void appendToStream(const char* s); void appendToStream(const char* s);
TPersistString sink; TPersistString sink;
int outputStream; int outputStream;
const char* shaderFileName;
}; };
} // end namespace glslang } // end namespace glslang

View file

@ -174,6 +174,7 @@ typedef enum {
GLSLANG_MSG_HLSL_DX9_COMPATIBLE_BIT = (1 << 13), GLSLANG_MSG_HLSL_DX9_COMPATIBLE_BIT = (1 << 13),
GLSLANG_MSG_BUILTIN_SYMBOL_TABLE_BIT = (1 << 14), GLSLANG_MSG_BUILTIN_SYMBOL_TABLE_BIT = (1 << 14),
GLSLANG_MSG_ENHANCED = (1 << 15), GLSLANG_MSG_ENHANCED = (1 << 15),
GLSLANG_MSG_ABSOLUTE_PATH = (1 << 16),
LAST_ELEMENT_MARKER(GLSLANG_MSG_COUNT), LAST_ELEMENT_MARKER(GLSLANG_MSG_COUNT),
} glslang_messages_t; } glslang_messages_t;

View file

@ -59,7 +59,7 @@ void TParseContextBase::outputMessage(const TSourceLoc& loc, const char* szReaso
safe_vsprintf(szExtraInfo, maxSize, szExtraInfoFormat, args); safe_vsprintf(szExtraInfo, maxSize, szExtraInfoFormat, args);
infoSink.info.prefix(prefix); infoSink.info.prefix(prefix);
infoSink.info.location(loc); infoSink.info.location(loc, messages & EShMsgAbsolutePath);
infoSink.info << "'" << szToken << "' : " << szReason << " " << szExtraInfo << "\n"; infoSink.info << "'" << szToken << "' : " << szReason << " " << szExtraInfo << "\n";
if (prefix == EPrefixError) { if (prefix == EPrefixError) {

View file

@ -1434,7 +1434,8 @@ int ShCompile(
int /*debugOptions*/, int /*debugOptions*/,
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/AST; things to print out EShMessages messages, // warnings/errors/AST; things to print out,
const char *shaderFileName // the filename
) )
{ {
// Map the generic handle to the C++ object // Map the generic handle to the C++ object
@ -1450,6 +1451,9 @@ int ShCompile(
compiler->infoSink.info.erase(); compiler->infoSink.info.erase();
compiler->infoSink.debug.erase(); compiler->infoSink.debug.erase();
compiler->infoSink.info.setShaderFileName(shaderFileName);
compiler->infoSink.debug.setShaderFileName(shaderFileName);
TIntermediate intermediate(compiler->getLanguage()); TIntermediate intermediate(compiler->getLanguage());
TShader::ForbidIncluder includer; TShader::ForbidIncluder includer;

View file

@ -269,6 +269,7 @@ enum EShMessages : unsigned {
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics) EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics)
EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
EShMsgEnhanced = (1 << 15), // enhanced message readability EShMsgEnhanced = (1 << 15), // enhanced message readability
EShMsgAbsolutePath = (1 << 16), // Output Absolute path for messages
LAST_ELEMENT_MARKER(EShMsgCount), LAST_ELEMENT_MARKER(EShMsgCount),
}; };
@ -335,7 +336,8 @@ GLSLANG_EXPORT int ShCompile(const ShHandle, const char* const shaderStrings[],
int, // debugOptions unused int, // debugOptions unused
int defaultVersion = 110, // use 100 for ES environment, overridden by #version in shader int defaultVersion = 110, // use 100 for ES environment, overridden by #version in shader
bool forwardCompatible = false, // give errors for use of deprecated features bool forwardCompatible = false, // give errors for use of deprecated features
EShMessages messages = EShMsgDefault // warnings and errors EShMessages messages = EShMsgDefault, // warnings and errors
const char* fileName = nullptr
); );
GLSLANG_EXPORT int ShLinkExt( GLSLANG_EXPORT int ShLinkExt(