Implement NonSemantic.Shader.DebugInfo.100
See https://github.com/KhronosGroup/SPIRV-Registry.
This commit is contained in:
parent
9e78bc8108
commit
7a914ce926
55 changed files with 11275 additions and 96 deletions
|
|
@ -3428,7 +3428,7 @@ bool HlslGrammar::acceptCompoundStatement(TIntermNode*& retStatement)
|
|||
}
|
||||
}
|
||||
if (compoundStatement)
|
||||
compoundStatement->setOperator(EOpSequence);
|
||||
compoundStatement->setOperator(intermediate.getDebugInfo() ? EOpScope : EOpSequence);
|
||||
|
||||
retStatement = compoundStatement;
|
||||
|
||||
|
|
|
|||
|
|
@ -2442,6 +2442,11 @@ void HlslParseContext::remapNonEntryPointIO(TFunction& function)
|
|||
clearUniformInputOutput(function[i].type->getQualifier());
|
||||
}
|
||||
|
||||
TIntermNode* HlslParseContext::handleDeclare(const TSourceLoc& loc, TIntermTyped* var)
|
||||
{
|
||||
return intermediate.addUnaryNode(EOpDeclare, var, loc, TType(EbtVoid));
|
||||
}
|
||||
|
||||
// Handle function returns, including type conversions to the function return type
|
||||
// if necessary.
|
||||
TIntermNode* HlslParseContext::handleReturnValue(const TSourceLoc& loc, TIntermTyped* value)
|
||||
|
|
@ -8035,11 +8040,16 @@ TIntermNode* HlslParseContext::declareVariable(const TSourceLoc& loc, const TStr
|
|||
if (flattenVar)
|
||||
flatten(*symbol->getAsVariable(), symbolTable.atGlobalLevel());
|
||||
|
||||
if (initializer == nullptr)
|
||||
return nullptr;
|
||||
TVariable* variable = symbol->getAsVariable();
|
||||
|
||||
if (initializer == nullptr) {
|
||||
if (intermediate.getDebugInfo())
|
||||
return executeDeclaration(loc, variable);
|
||||
else
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Deal with initializer
|
||||
TVariable* variable = symbol->getAsVariable();
|
||||
if (variable == nullptr) {
|
||||
error(loc, "initializer requires a variable, not a member", identifier.c_str(), "");
|
||||
return nullptr;
|
||||
|
|
@ -8106,6 +8116,24 @@ TVariable* HlslParseContext::declareNonArray(const TSourceLoc& loc, const TStrin
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
// Return a declaration of a temporary variable
|
||||
//
|
||||
// This is used to force a variable to be declared in the correct scope
|
||||
// when debug information is being generated.
|
||||
|
||||
TIntermNode* HlslParseContext::executeDeclaration(const TSourceLoc& loc, TVariable* variable)
|
||||
{
|
||||
//
|
||||
// Identifier must be of type temporary.
|
||||
//
|
||||
TStorageQualifier qualifier = variable->getType().getQualifier().storage;
|
||||
if (qualifier != EvqTemporary)
|
||||
return nullptr;
|
||||
|
||||
TIntermSymbol* intermSymbol = intermediate.addSymbol(*variable, loc);
|
||||
return handleDeclare(loc, intermSymbol);
|
||||
}
|
||||
|
||||
//
|
||||
// Handle all types of initializers from the grammar.
|
||||
//
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ public:
|
|||
void handleFunctionBody(const TSourceLoc&, TFunction&, TIntermNode* functionBody, TIntermNode*& node);
|
||||
void remapEntryPointIO(TFunction& function, TVariable*& returnValue, TVector<TVariable*>& inputs, TVector<TVariable*>& outputs);
|
||||
void remapNonEntryPointIO(TFunction& function);
|
||||
TIntermNode* handleDeclare(const TSourceLoc&, TIntermTyped*);
|
||||
TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*);
|
||||
void handleFunctionArgument(TFunction*, TIntermTyped*& arguments, TIntermTyped* newArg);
|
||||
TIntermTyped* handleAssign(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
|
||||
|
|
@ -243,6 +244,7 @@ protected:
|
|||
TIntermSymbol* makeInternalVariableNode(const TSourceLoc&, const char* name, const TType&) const;
|
||||
TVariable* declareNonArray(const TSourceLoc&, const TString& identifier, const TType&, bool track);
|
||||
void declareArray(const TSourceLoc&, const TString& identifier, const TType&, TSymbol*&, bool track);
|
||||
TIntermNode* executeDeclaration(const TSourceLoc&, TVariable* variable);
|
||||
TIntermNode* executeInitializer(const TSourceLoc&, TIntermTyped* initializer, TVariable* variable);
|
||||
TIntermTyped* convertInitializerList(const TSourceLoc&, const TType&, TIntermTyped* initializer, TIntermTyped* scalarInit);
|
||||
bool isScalarConstructor(const TIntermNode*);
|
||||
|
|
|
|||
|
|
@ -207,6 +207,8 @@ typedef struct glslang_spv_options_s {
|
|||
bool optimize_size;
|
||||
bool disassemble;
|
||||
bool validate;
|
||||
bool emit_nonsemantic_shader_debug_info;
|
||||
bool emit_nonsemantic_shader_debug_source;
|
||||
} glslang_spv_options_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@ class TIntermediate;
|
|||
enum TOperator {
|
||||
EOpNull, // if in a node, should only mean a node is still being built
|
||||
EOpSequence, // denotes a list of statements, or parameters, etc.
|
||||
EOpScope, // Used by debugging to denote a scoped list of statements
|
||||
EOpLinkerObjects, // for aggregate node of objects the linker may need, if not reference by the rest of the AST
|
||||
EOpFunctionCall,
|
||||
EOpFunction, // For function definition
|
||||
|
|
@ -91,6 +92,8 @@ enum TOperator {
|
|||
|
||||
EOpCopyObject,
|
||||
|
||||
EOpDeclare, // Used by debugging to force declaration of variable in correct scope
|
||||
|
||||
// (u)int* -> bool
|
||||
EOpConvInt8ToBool,
|
||||
EOpConvUint8ToBool,
|
||||
|
|
|
|||
|
|
@ -2733,10 +2733,10 @@ TIntermAggregate* TIntermediate::addForLoop(TIntermNode* body, TIntermNode* init
|
|||
TIntermAggregate* loopSequence = (initializer == nullptr ||
|
||||
initializer->getAsAggregate() == nullptr) ? makeAggregate(initializer, loc)
|
||||
: initializer->getAsAggregate();
|
||||
if (loopSequence != nullptr && loopSequence->getOp() == EOpSequence)
|
||||
if (loopSequence != nullptr && (loopSequence->getOp() == EOpSequence || loopSequence->getOp() == EOpScope))
|
||||
loopSequence->setOp(EOpNull);
|
||||
loopSequence = growAggregate(loopSequence, node);
|
||||
loopSequence->setOperator(EOpSequence);
|
||||
loopSequence->setOperator(getDebugInfo() ? EOpScope : EOpSequence);
|
||||
|
||||
return loopSequence;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1839,6 +1839,7 @@ void TShader::setOverrideVersion(int version)
|
|||
overrideVersion = version;
|
||||
}
|
||||
|
||||
void TShader::setDebugInfo(bool debugInfo) { intermediate->setDebugInfo(debugInfo); }
|
||||
void TShader::setInvertY(bool invert) { intermediate->setInvertY(invert); }
|
||||
void TShader::setDxPositionW(bool invert) { intermediate->setDxPositionW(invert); }
|
||||
void TShader::setEnhancedMsgs() { intermediate->setEnhancedMsgs(); }
|
||||
|
|
|
|||
|
|
@ -3726,7 +3726,7 @@ compound_statement
|
|||
}
|
||||
RIGHT_BRACE {
|
||||
if ($3 && $3->getAsAggregate())
|
||||
$3->getAsAggregate()->setOperator(EOpSequence);
|
||||
$3->getAsAggregate()->setOperator(parseContext.intermediate.getDebugInfo() ? EOpScope : EOpSequence);
|
||||
$$ = $3;
|
||||
}
|
||||
;
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ extern int yylex(YYSTYPE*, TParseContext&);
|
|||
|
||||
%parse-param {glslang::TParseContext* pParseContext}
|
||||
%lex-param {parseContext}
|
||||
%pure-parser // enable thread safety
|
||||
%define api.pure // enable thread safety
|
||||
%expect 1 // One shift reduce conflict because of if | else
|
||||
|
||||
%token <lex> CONST BOOL INT UINT FLOAT
|
||||
|
|
@ -3726,7 +3726,7 @@ compound_statement
|
|||
}
|
||||
RIGHT_BRACE {
|
||||
if ($3 && $3->getAsAggregate())
|
||||
$3->getAsAggregate()->setOperator(EOpSequence);
|
||||
$3->getAsAggregate()->setOperator(parseContext.intermediate.getDebugInfo() ? EOpScope : EOpSequence);
|
||||
$$ = $3;
|
||||
}
|
||||
;
|
||||
|
|
|
|||
|
|
@ -11085,7 +11085,7 @@ yyreduce:
|
|||
#line 3727 "MachineIndependent/glslang.y"
|
||||
{
|
||||
if ((yyvsp[-2].interm.intermNode) && (yyvsp[-2].interm.intermNode)->getAsAggregate())
|
||||
(yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
|
||||
(yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(parseContext.intermediate.getDebugInfo() ? EOpScope : EOpSequence);
|
||||
(yyval.interm.intermNode) = (yyvsp[-2].interm.intermNode);
|
||||
}
|
||||
#line 11092 "MachineIndependent/glslang_tab.cpp"
|
||||
|
|
|
|||
|
|
@ -665,6 +665,8 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)
|
|||
|
||||
case EOpConstructReference: out.debug << "Construct reference type"; break;
|
||||
|
||||
case EOpDeclare: out.debug << "Declare"; break;
|
||||
|
||||
#ifndef GLSLANG_WEB
|
||||
case EOpSpirvInst: out.debug << "spirv_instruction"; break;
|
||||
#endif
|
||||
|
|
@ -692,6 +694,7 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
|
|||
|
||||
switch (node->getOp()) {
|
||||
case EOpSequence: out.debug << "Sequence\n"; return true;
|
||||
case EOpScope: out.debug << "Scope\n"; return true;
|
||||
case EOpLinkerObjects: out.debug << "Linker Objects\n"; return true;
|
||||
case EOpComma: out.debug << "Comma"; break;
|
||||
case EOpFunction: out.debug << "Function Definition: " << node->getName(); break;
|
||||
|
|
@ -1107,7 +1110,7 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
|
|||
default: out.debug.message(EPrefixError, "Bad aggregation op");
|
||||
}
|
||||
|
||||
if (node->getOp() != EOpSequence && node->getOp() != EOpParameters)
|
||||
if (node->getOp() != EOpSequence && node->getOp() != EOpScope && node->getOp() != EOpParameters)
|
||||
out.debug << " (" << node->getCompleteString() << ")";
|
||||
|
||||
out.debug << "\n";
|
||||
|
|
|
|||
|
|
@ -319,6 +319,7 @@ void TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit)
|
|||
MERGE_TRUE(autoMapLocations);
|
||||
MERGE_TRUE(invertY);
|
||||
MERGE_TRUE(dxPositionW);
|
||||
MERGE_TRUE(debugInfo);
|
||||
MERGE_TRUE(flattenUniformArrays);
|
||||
MERGE_TRUE(useUnknownFormat);
|
||||
MERGE_TRUE(hlslOffsets);
|
||||
|
|
|
|||
|
|
@ -292,6 +292,7 @@ public:
|
|||
invertY(false),
|
||||
dxPositionW(false),
|
||||
enhancedMsgs(false),
|
||||
debugInfo(false),
|
||||
useStorageBuffer(false),
|
||||
invariantAll(false),
|
||||
nanMinMaxClamp(false),
|
||||
|
|
@ -461,6 +462,12 @@ public:
|
|||
const std::string& getEntryPointName() const { return entryPointName; }
|
||||
const std::string& getEntryPointMangledName() const { return entryPointMangledName; }
|
||||
|
||||
void setDebugInfo(bool debuginfo)
|
||||
{
|
||||
debugInfo = debuginfo;
|
||||
}
|
||||
bool getDebugInfo() const { return debugInfo; }
|
||||
|
||||
void setInvertY(bool invert)
|
||||
{
|
||||
invertY = invert;
|
||||
|
|
@ -1109,6 +1116,7 @@ protected:
|
|||
bool invertY;
|
||||
bool dxPositionW;
|
||||
bool enhancedMsgs;
|
||||
bool debugInfo;
|
||||
bool useStorageBuffer;
|
||||
bool invariantAll;
|
||||
bool nanMinMaxClamp; // true if desiring min/max/clamp to favor non-NaN over NaN
|
||||
|
|
|
|||
|
|
@ -472,6 +472,7 @@ public:
|
|||
GLSLANG_EXPORT void addProcesses(const std::vector<std::string>&);
|
||||
GLSLANG_EXPORT void setUniqueId(unsigned long long id);
|
||||
GLSLANG_EXPORT void setOverrideVersion(int version);
|
||||
GLSLANG_EXPORT void setDebugInfo(bool debugInfo);
|
||||
|
||||
// IO resolver binding data: see comments in ShaderLang.cpp
|
||||
GLSLANG_EXPORT void setShiftBinding(TResourceType res, unsigned int base);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue