HLSL and standalone, modifying Standalone to send filename as string source, and HLSL backend will use this to print a better error mesage when things fail

This commit is contained in:
dankbaker 2016-08-21 12:29:08 -04:00
parent 7fb66097e1
commit afe6e9c4fc
2 changed files with 27 additions and 5 deletions

View file

@ -413,6 +413,25 @@ struct ShaderCompUnit {
EShLanguage stage; EShLanguage stage;
std::string fileName; std::string fileName;
char** text; // memory owned/managed externally char** text; // memory owned/managed externally
const char* fileNameList[1];
//Need to have a special constructors to adjust the fileNameList, since back end needs a list of ptrs
ShaderCompUnit(EShLanguage istage, std::string &ifileName, char** itext)
{
stage = istage;
fileName = ifileName;
text = itext;
fileNameList[0] = fileName.c_str();
}
ShaderCompUnit(const ShaderCompUnit &rhs)
{
stage = rhs.stage;
fileName = rhs.fileName;
text = rhs.text;
fileNameList[0] = fileName.c_str();
}
}; };
// //
@ -439,7 +458,7 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits)
for (auto it = compUnits.cbegin(); it != compUnits.cend(); ++it) { for (auto it = compUnits.cbegin(); it != compUnits.cend(); ++it) {
const auto &compUnit = *it; const auto &compUnit = *it;
glslang::TShader* shader = new glslang::TShader(compUnit.stage); glslang::TShader* shader = new glslang::TShader(compUnit.stage);
shader->setStrings(compUnit.text, 1); shader->setStringsWithLengthsAndNames(compUnit.text, NULL, compUnit.fileNameList, 1);
if (entryPointName) // HLSL todo: this needs to be tracked per compUnits if (entryPointName) // HLSL todo: this needs to be tracked per compUnits
shader->setEntryPoint(entryPointName); shader->setEntryPoint(entryPointName);
shaders.push_back(shader); shaders.push_back(shader);

View file

@ -116,9 +116,12 @@ bool HlslParseContext::parseShaderStrings(TPpContext& ppContext, TInputScanner&
HlslScanContext scanContext(*this, ppContext); HlslScanContext scanContext(*this, ppContext);
HlslGrammar grammar(scanContext, *this); HlslGrammar grammar(scanContext, *this);
if (! grammar.parse()) if (!grammar.parse())
printf("HLSL translation failed.\n"); {
//Print out a nicer error message that should be formated such that if you click on the message it will take you right to the line through most UIs
const glslang::TSourceLoc& sourceLoc = input.getSourceLoc();
printf("\n%s(%i): error at column %i, HLSL translation failed.\n", sourceLoc.name, sourceLoc.line, sourceLoc.column);
}
return numErrors == 0; return numErrors == 0;
} }