Shader: Add comments to surround modules

This commit is contained in:
Jérôme Leclercq 2022-03-06 17:25:16 +01:00
parent 4bded2182c
commit a4858d6793
9 changed files with 65 additions and 0 deletions

View File

@ -519,6 +519,9 @@ namespace Nz::ShaderAst
inline bool Compare(const MultiStatement& lhs, const MultiStatement& rhs) inline bool Compare(const MultiStatement& lhs, const MultiStatement& rhs)
{ {
if (!Compare(lhs.sectionName, rhs.sectionName))
return false;
if (!Compare(lhs.statements, rhs.statements)) if (!Compare(lhs.statements, rhs.statements))
return false; return false;

View File

@ -385,6 +385,7 @@ namespace Nz::ShaderAst
NodeType GetType() const override; NodeType GetType() const override;
void Visit(AstStatementVisitor& visitor) override; void Visit(AstStatementVisitor& visitor) override;
std::string sectionName;
std::vector<StatementPtr> statements; std::vector<StatementPtr> statements;
}; };

View File

@ -70,6 +70,7 @@ namespace Nz
void Append(const ShaderAst::VectorType& vecType); void Append(const ShaderAst::VectorType& vecType);
template<typename T> void Append(const T& param); template<typename T> void Append(const T& param);
template<typename T1, typename T2, typename... Args> void Append(const T1& firstParam, const T2& secondParam, Args&&... params); template<typename T1, typename T2, typename... Args> void Append(const T1& firstParam, const T2& secondParam, Args&&... params);
void AppendComment(const std::string& section);
void AppendCommentSection(const std::string& section); void AppendCommentSection(const std::string& section);
void AppendFunctionDeclaration(const ShaderAst::DeclareFunctionStatement& node, bool forward = false); void AppendFunctionDeclaration(const ShaderAst::DeclareFunctionStatement& node, bool forward = false);
void AppendHeader(); void AppendHeader();

View File

@ -77,6 +77,7 @@ namespace Nz
void AppendAttribute(LocationAttribute location); void AppendAttribute(LocationAttribute location);
void AppendAttribute(SetAttribute set); void AppendAttribute(SetAttribute set);
void AppendAttribute(UnrollAttribute unroll); void AppendAttribute(UnrollAttribute unroll);
void AppendComment(const std::string& section);
void AppendCommentSection(const std::string& section); void AppendCommentSection(const std::string& section);
void AppendHeader(); void AppendHeader();
void AppendLine(const std::string& txt = {}); void AppendLine(const std::string& txt = {});

View File

@ -231,6 +231,7 @@ namespace Nz::ShaderAst
StatementPtr AstCloner::Clone(MultiStatement& node) StatementPtr AstCloner::Clone(MultiStatement& node)
{ {
auto clone = std::make_unique<MultiStatement>(); auto clone = std::make_unique<MultiStatement>();
clone->sectionName = node.sectionName;
clone->statements.reserve(node.statements.size()); clone->statements.reserve(node.statements.size());
for (auto& statement : node.statements) for (auto& statement : node.statements)
clone->statements.push_back(CloneStatement(statement)); clone->statements.push_back(CloneStatement(statement));

View File

@ -315,6 +315,8 @@ namespace Nz::ShaderAst
void AstSerializerBase::Serialize(MultiStatement& node) void AstSerializerBase::Serialize(MultiStatement& node)
{ {
Value(node.sectionName);
Container(node.statements); Container(node.statements);
for (auto& statement : node.statements) for (auto& statement : node.statements)
Node(statement); Node(statement);

View File

@ -1389,6 +1389,8 @@ namespace Nz::ShaderAst
if (!targetModule) if (!targetModule)
throw AstError{ "module " + ModulePathAsString() + " not found" }; throw AstError{ "module " + ModulePathAsString() + " not found" };
targetModule->rootNode->sectionName = "Module " + targetModule->metadata->moduleId.ToString();
std::string error; std::string error;
ModulePtr sanitizedModule = ShaderAst::Sanitize(*targetModule, m_context->options, &error); ModulePtr sanitizedModule = ShaderAst::Sanitize(*targetModule, m_context->options, &error);
if (!sanitizedModule) if (!sanitizedModule)
@ -1462,6 +1464,7 @@ namespace Nz::ShaderAst
StatementPtr SanitizeVisitor::Clone(MultiStatement& node) StatementPtr SanitizeVisitor::Clone(MultiStatement& node)
{ {
auto clone = std::make_unique<MultiStatement>(); auto clone = std::make_unique<MultiStatement>();
clone->sectionName = node.sectionName;
clone->statements.reserve(node.statements.size()); clone->statements.reserve(node.statements.size());
std::vector<StatementPtr>* previousList = m_context->currentStatementList; std::vector<StatementPtr>* previousList = m_context->currentStatementList;

View File

@ -403,6 +403,26 @@ namespace Nz
Append(secondParam, std::forward<Args>(params)...); Append(secondParam, std::forward<Args>(params)...);
} }
void GlslWriter::AppendComment(const std::string& section)
{
std::size_t lineFeed = section.find('\n');
if (lineFeed != section.npos)
{
std::size_t previousCut = 0;
AppendLine("/*");
do
{
AppendLine(section.substr(previousCut, lineFeed - previousCut));
previousCut = lineFeed + 1;
} while ((lineFeed = section.find('\n', previousCut)) != section.npos);
AppendLine(section.substr(previousCut));
AppendLine("*/");
}
else
AppendLine("// ", section);
}
void GlslWriter::AppendCommentSection(const std::string& section) void GlslWriter::AppendCommentSection(const std::string& section)
{ {
NazaraAssert(m_currentState, "This function should only be called while processing an AST"); NazaraAssert(m_currentState, "This function should only be called while processing an AST");
@ -1208,7 +1228,13 @@ namespace Nz
void GlslWriter::Visit(ShaderAst::MultiStatement& node) void GlslWriter::Visit(ShaderAst::MultiStatement& node)
{ {
if (!node.sectionName.empty())
AppendComment(node.sectionName);
AppendStatementList(node.statements); AppendStatementList(node.statements);
if (!node.sectionName.empty())
AppendComment("End: " + node.sectionName);
} }
void GlslWriter::Visit(ShaderAst::NoOpStatement& /*node*/) void GlslWriter::Visit(ShaderAst::NoOpStatement& /*node*/)

View File

@ -502,6 +502,27 @@ namespace Nz
unroll.unroll.GetExpression()->Visit(*this); unroll.unroll.GetExpression()->Visit(*this);
} }
void LangWriter::AppendComment(const std::string& section)
{
std::size_t lineFeed = section.find('\n');
if (lineFeed != section.npos)
{
std::size_t previousCut = 0;
AppendLine("/*");
do
{
AppendLine(section.substr(previousCut, lineFeed - previousCut));
previousCut = lineFeed + 1;
}
while ((lineFeed = section.find('\n', previousCut)) != section.npos);
AppendLine(section.substr(previousCut));
AppendLine("*/");
}
else
AppendLine("// ", section);
}
void LangWriter::AppendCommentSection(const std::string& section) void LangWriter::AppendCommentSection(const std::string& section)
{ {
NazaraAssert(m_currentState, "This function should only be called while processing an AST"); NazaraAssert(m_currentState, "This function should only be called while processing an AST");
@ -1032,7 +1053,13 @@ namespace Nz
void LangWriter::Visit(ShaderAst::MultiStatement& node) void LangWriter::Visit(ShaderAst::MultiStatement& node)
{ {
if (!node.sectionName.empty())
AppendComment(node.sectionName);
AppendStatementList(node.statements); AppendStatementList(node.statements);
if (!node.sectionName.empty())
AppendComment("End: " + node.sectionName);
} }
void LangWriter::Visit(ShaderAst::NoOpStatement& /*node*/) void LangWriter::Visit(ShaderAst::NoOpStatement& /*node*/)