Shader: Add support for while loops
This commit is contained in:
@@ -67,6 +67,7 @@ namespace Nz::ShaderAst
|
||||
virtual StatementPtr Clone(MultiStatement& node);
|
||||
virtual StatementPtr Clone(NoOpStatement& node);
|
||||
virtual StatementPtr Clone(ReturnStatement& node);
|
||||
virtual StatementPtr Clone(WhileStatement& node);
|
||||
|
||||
#define NAZARA_SHADERAST_NODE(NodeType) void Visit(NodeType& node) override;
|
||||
#include <Nazara/Shader/Ast/AstNodeList.hpp>
|
||||
|
||||
@@ -55,7 +55,8 @@ NAZARA_SHADERAST_STATEMENT(DiscardStatement)
|
||||
NAZARA_SHADERAST_STATEMENT(ExpressionStatement)
|
||||
NAZARA_SHADERAST_STATEMENT(MultiStatement)
|
||||
NAZARA_SHADERAST_STATEMENT(NoOpStatement)
|
||||
NAZARA_SHADERAST_STATEMENT_LAST(ReturnStatement)
|
||||
NAZARA_SHADERAST_STATEMENT(ReturnStatement)
|
||||
NAZARA_SHADERAST_STATEMENT_LAST(WhileStatement)
|
||||
|
||||
#undef NAZARA_SHADERAST_EXPRESSION
|
||||
#undef NAZARA_SHADERAST_NODE
|
||||
|
||||
@@ -49,6 +49,7 @@ namespace Nz::ShaderAst
|
||||
void Visit(MultiStatement& node) override;
|
||||
void Visit(NoOpStatement& node) override;
|
||||
void Visit(ReturnStatement& node) override;
|
||||
void Visit(WhileStatement& node) override;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ namespace Nz::ShaderAst
|
||||
void Serialize(MultiStatement& node);
|
||||
void Serialize(NoOpStatement& node);
|
||||
void Serialize(ReturnStatement& node);
|
||||
void Serialize(WhileStatement& node);
|
||||
|
||||
protected:
|
||||
template<typename T> void Attribute(AttributeValue<T>& attribute);
|
||||
|
||||
@@ -362,6 +362,15 @@ namespace Nz::ShaderAst
|
||||
ExpressionPtr returnExpr;
|
||||
};
|
||||
|
||||
struct NAZARA_SHADER_API WhileStatement : Statement
|
||||
{
|
||||
NodeType GetType() const override;
|
||||
void Visit(AstStatementVisitor& visitor) override;
|
||||
|
||||
ExpressionPtr condition;
|
||||
StatementPtr body;
|
||||
};
|
||||
|
||||
inline const ShaderAst::ExpressionType& GetExpressionType(ShaderAst::Expression& expr);
|
||||
inline bool IsExpression(NodeType nodeType);
|
||||
inline bool IsStatement(NodeType nodeType);
|
||||
|
||||
@@ -74,6 +74,7 @@ namespace Nz::ShaderAst
|
||||
StatementPtr Clone(DiscardStatement& node) override;
|
||||
StatementPtr Clone(ExpressionStatement& node) override;
|
||||
StatementPtr Clone(MultiStatement& node) override;
|
||||
StatementPtr Clone(WhileStatement& node) override;
|
||||
|
||||
const Identifier* FindIdentifier(const std::string_view& identifierName) const;
|
||||
|
||||
|
||||
@@ -105,6 +105,7 @@ namespace Nz
|
||||
void Visit(ShaderAst::MultiStatement& node) override;
|
||||
void Visit(ShaderAst::NoOpStatement& node) override;
|
||||
void Visit(ShaderAst::ReturnStatement& node) override;
|
||||
void Visit(ShaderAst::WhileStatement& node) override;
|
||||
|
||||
static bool HasExplicitBinding(ShaderAst::StatementPtr& shader);
|
||||
static bool HasExplicitLocation(ShaderAst::StatementPtr& shader);
|
||||
|
||||
@@ -108,6 +108,7 @@ namespace Nz
|
||||
void Visit(ShaderAst::MultiStatement& node) override;
|
||||
void Visit(ShaderAst::NoOpStatement& node) override;
|
||||
void Visit(ShaderAst::ReturnStatement& node) override;
|
||||
void Visit(ShaderAst::WhileStatement& node) override;
|
||||
|
||||
struct State;
|
||||
|
||||
|
||||
@@ -140,6 +140,11 @@ namespace Nz::ShaderBuilder
|
||||
{
|
||||
inline std::unique_ptr<ShaderAst::UnaryExpression> operator()(ShaderAst::UnaryType op, ShaderAst::ExpressionPtr expression) const;
|
||||
};
|
||||
|
||||
struct While
|
||||
{
|
||||
inline std::unique_ptr<ShaderAst::WhileStatement> operator()(ShaderAst::ExpressionPtr condition, ShaderAst::StatementPtr body) const;
|
||||
};
|
||||
}
|
||||
|
||||
constexpr Impl::AccessIndex AccessIndex;
|
||||
@@ -167,6 +172,7 @@ namespace Nz::ShaderBuilder
|
||||
constexpr Impl::Return Return;
|
||||
constexpr Impl::Swizzle Swizzle;
|
||||
constexpr Impl::Unary Unary;
|
||||
constexpr Impl::While While;
|
||||
}
|
||||
|
||||
#include <Nazara/Shader/ShaderBuilder.inl>
|
||||
|
||||
@@ -298,6 +298,15 @@ namespace Nz::ShaderBuilder
|
||||
|
||||
return unaryNode;
|
||||
}
|
||||
|
||||
inline std::unique_ptr<ShaderAst::WhileStatement> Impl::While::operator()(ShaderAst::ExpressionPtr condition, ShaderAst::StatementPtr body) const
|
||||
{
|
||||
auto whileNode = std::make_unique<ShaderAst::WhileStatement>();
|
||||
whileNode->condition = std::move(condition);
|
||||
whileNode->body = std::move(body);
|
||||
|
||||
return whileNode;
|
||||
}
|
||||
}
|
||||
|
||||
#include <Nazara/Shader/DebugOff.hpp>
|
||||
|
||||
@@ -98,6 +98,7 @@ namespace Nz::ShaderLang
|
||||
std::vector<ShaderAst::StatementPtr> ParseStatementList();
|
||||
ShaderAst::StatementPtr ParseStructDeclaration(std::vector<ShaderAst::Attribute> attributes = {});
|
||||
ShaderAst::StatementPtr ParseVariableDeclaration();
|
||||
ShaderAst::StatementPtr ParseWhileStatement();
|
||||
|
||||
// Expressions
|
||||
ShaderAst::ExpressionPtr ParseBinOpRhs(int exprPrecedence, ShaderAst::ExpressionPtr lhs);
|
||||
|
||||
@@ -60,6 +60,7 @@ NAZARA_SHADERLANG_TOKEN(Option)
|
||||
NAZARA_SHADERLANG_TOKEN(Semicolon)
|
||||
NAZARA_SHADERLANG_TOKEN(Return)
|
||||
NAZARA_SHADERLANG_TOKEN(Struct)
|
||||
NAZARA_SHADERLANG_TOKEN(While)
|
||||
|
||||
#undef NAZARA_SHADERLANG_TOKEN
|
||||
#undef NAZARA_SHADERLANG_TOKEN_LAST
|
||||
|
||||
@@ -61,8 +61,9 @@ namespace Nz
|
||||
void Visit(ShaderAst::NoOpStatement& node) override;
|
||||
void Visit(ShaderAst::ReturnStatement& node) override;
|
||||
void Visit(ShaderAst::SwizzleExpression& node) override;
|
||||
void Visit(ShaderAst::VariableExpression& node) override;
|
||||
void Visit(ShaderAst::UnaryExpression& node) override;
|
||||
void Visit(ShaderAst::VariableExpression& node) override;
|
||||
void Visit(ShaderAst::WhileStatement& node) override;
|
||||
|
||||
SpirvAstVisitor& operator=(const SpirvAstVisitor&) = delete;
|
||||
SpirvAstVisitor& operator=(SpirvAstVisitor&&) = delete;
|
||||
|
||||
Reference in New Issue
Block a user