Shader/ShaderLang: Add support for Unary operators

This commit is contained in:
Lynix
2021-05-16 23:07:25 +02:00
parent 1f05e950e8
commit 525f24af2e
30 changed files with 566 additions and 208 deletions

View File

@@ -48,6 +48,7 @@ namespace Nz::ShaderAst
virtual ExpressionPtr Clone(SelectOptionExpression& node);
virtual ExpressionPtr Clone(SwizzleExpression& node);
virtual ExpressionPtr Clone(VariableExpression& node);
virtual ExpressionPtr Clone(UnaryExpression& node);
virtual StatementPtr Clone(BranchStatement& node);
virtual StatementPtr Clone(ConditionalStatement& node);

View File

@@ -38,6 +38,7 @@ NAZARA_SHADERAST_EXPRESSION(IntrinsicExpression)
NAZARA_SHADERAST_EXPRESSION(SelectOptionExpression)
NAZARA_SHADERAST_EXPRESSION(SwizzleExpression)
NAZARA_SHADERAST_EXPRESSION(VariableExpression)
NAZARA_SHADERAST_EXPRESSION(UnaryExpression)
NAZARA_SHADERAST_STATEMENT(BranchStatement)
NAZARA_SHADERAST_STATEMENT(ConditionalStatement)
NAZARA_SHADERAST_STATEMENT(DeclareExternalStatement)

View File

@@ -32,10 +32,12 @@ namespace Nz::ShaderAst
protected:
ExpressionPtr Clone(BinaryExpression& node) override;
ExpressionPtr Clone(ConditionalExpression& node) override;
ExpressionPtr Clone(UnaryExpression& node) override;
StatementPtr Clone(BranchStatement& node) override;
StatementPtr Clone(ConditionalStatement& node) override;
template<BinaryType Type> ExpressionPtr PropagateConstant(std::unique_ptr<ConstantExpression>&& lhs, std::unique_ptr<ConstantExpression>&& rhs);
template<UnaryType Type> ExpressionPtr PropagateConstant(std::unique_ptr<ConstantExpression>&& operand);
private:
std::optional<UInt64> m_enabledOptions;

View File

@@ -32,6 +32,7 @@ namespace Nz::ShaderAst
void Visit(SelectOptionExpression& node) override;
void Visit(SwizzleExpression& node) override;
void Visit(VariableExpression& node) override;
void Visit(UnaryExpression& node) override;
void Visit(BranchStatement& node) override;
void Visit(ConditionalStatement& node) override;

View File

@@ -35,6 +35,7 @@ namespace Nz::ShaderAst
void Serialize(SelectOptionExpression& node);
void Serialize(SwizzleExpression& node);
void Serialize(VariableExpression& node);
void Serialize(UnaryExpression& node);
void Serialize(BranchStatement& node);
void Serialize(ConditionalStatement& node);

View File

@@ -43,6 +43,7 @@ namespace Nz::ShaderAst
void Visit(SelectOptionExpression& node) override;
void Visit(SwizzleExpression& node) override;
void Visit(VariableExpression& node) override;
void Visit(UnaryExpression& node) override;
ExpressionCategory m_expressionCategory;
};

View File

@@ -29,7 +29,7 @@ namespace Nz::ShaderAst
enum class BinaryType
{
Add, //< +
Subtract, //< -
Subtract, //< -
Multiply, //< *
Divide, //< /
@@ -89,6 +89,13 @@ namespace Nz::ShaderAst
Third,
Fourth
};
enum class UnaryType
{
LogicalNot, //< !v
Minus, //< -v
Plus, //< +v
};
}
#endif // NAZARA_SHADER_ENUMS_HPP

View File

@@ -176,6 +176,15 @@ namespace Nz::ShaderAst
std::size_t variableId;
};
struct NAZARA_SHADER_API UnaryExpression : public Expression
{
NodeType GetType() const override;
void Visit(AstExpressionVisitor& visitor) override;
UnaryType op;
ExpressionPtr expression;
};
// Statements
struct Statement;

View File

@@ -54,6 +54,7 @@ namespace Nz::ShaderAst
ExpressionPtr Clone(IntrinsicExpression& node) override;
ExpressionPtr Clone(SelectOptionExpression& node) override;
ExpressionPtr Clone(SwizzleExpression& node) override;
ExpressionPtr Clone(UnaryExpression& node) override;
StatementPtr Clone(BranchStatement& node) override;
StatementPtr Clone(ConditionalStatement& node) override;

View File

@@ -86,6 +86,7 @@ namespace Nz
void Visit(ShaderAst::IntrinsicExpression& node) override;
void Visit(ShaderAst::SwizzleExpression& node) override;
void Visit(ShaderAst::VariableExpression& node) override;
void Visit(ShaderAst::UnaryExpression& node) override;
void Visit(ShaderAst::BranchStatement& node) override;
void Visit(ShaderAst::ConditionalStatement& node) override;

View File

@@ -85,6 +85,7 @@ namespace Nz
void Visit(ShaderAst::IntrinsicExpression& node) override;
void Visit(ShaderAst::SwizzleExpression& node) override;
void Visit(ShaderAst::VariableExpression& node) override;
void Visit(ShaderAst::UnaryExpression& node) override;
void Visit(ShaderAst::BranchStatement& node) override;
void Visit(ShaderAst::ConditionalStatement& node) override;

View File

@@ -120,6 +120,11 @@ namespace Nz::ShaderBuilder
{
inline std::unique_ptr<ShaderAst::SwizzleExpression> operator()(ShaderAst::ExpressionPtr expression, std::vector<ShaderAst::SwizzleComponent> swizzleComponents) const;
};
struct Unary
{
inline std::unique_ptr<ShaderAst::UnaryExpression> operator()(ShaderAst::UnaryType op, ShaderAst::ExpressionPtr expression) const;
};
}
constexpr Impl::AccessMember AccessMember;
@@ -143,6 +148,7 @@ namespace Nz::ShaderBuilder
constexpr Impl::Return Return;
constexpr Impl::SelectOption SelectOption;
constexpr Impl::Swizzle Swizzle;
constexpr Impl::Unary Unary;
}
#include <Nazara/Shader/ShaderBuilder.inl>

View File

@@ -235,6 +235,15 @@ namespace Nz::ShaderBuilder
return swizzleNode;
}
inline std::unique_ptr<ShaderAst::UnaryExpression> Impl::Unary::operator()(ShaderAst::UnaryType op, ShaderAst::ExpressionPtr expression) const
{
auto unaryNode = std::make_unique<ShaderAst::UnaryExpression>();
unaryNode->expression = std::move(expression);
unaryNode->op = op;
return unaryNode;
}
}
#include <Nazara/Shader/DebugOff.hpp>

View File

@@ -96,9 +96,9 @@ namespace Nz::ShaderLang
// Expressions
ShaderAst::ExpressionPtr ParseBinOpRhs(int exprPrecedence, ShaderAst::ExpressionPtr lhs);
ShaderAst::ExpressionPtr ParseExpression();
ShaderAst::ExpressionPtr ParseFloatingPointExpression(bool minus = false);
ShaderAst::ExpressionPtr ParseFloatingPointExpression();
ShaderAst::ExpressionPtr ParseIdentifier();
ShaderAst::ExpressionPtr ParseIntegerExpression(bool minus = false);
ShaderAst::ExpressionPtr ParseIntegerExpression();
std::vector<ShaderAst::ExpressionPtr> ParseParameters();
ShaderAst::ExpressionPtr ParseParenthesisExpression();
ShaderAst::ExpressionPtr ParsePrimaryExpression();

View File

@@ -62,6 +62,7 @@ namespace Nz
void Visit(ShaderAst::ReturnStatement& node) override;
void Visit(ShaderAst::SwizzleExpression& node) override;
void Visit(ShaderAst::VariableExpression& node) override;
void Visit(ShaderAst::UnaryExpression& node) override;
SpirvAstVisitor& operator=(const SpirvAstVisitor&) = delete;
SpirvAstVisitor& operator=(SpirvAstVisitor&&) = delete;