// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Shader module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_SHADER_AST_NODES_HPP #define NAZARA_SHADER_AST_NODES_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Nz::ShaderAst { class AstExpressionVisitor; class AstStatementVisitor; struct Node; using NodePtr = std::unique_ptr; struct NAZARA_SHADER_API Node { Node() = default; Node(const Node&) = delete; Node(Node&&) noexcept = default; virtual ~Node(); virtual NodeType GetType() const = 0; Node& operator=(const Node&) = delete; Node& operator=(Node&&) noexcept = default; ShaderLang::SourceLocation sourceLocation; }; // Expressions struct Expression; using ExpressionPtr = std::unique_ptr; struct NAZARA_SHADER_API Expression : Node { Expression() = default; Expression(const Expression&) = delete; Expression(Expression&&) noexcept = default; ~Expression() = default; virtual void Visit(AstExpressionVisitor& visitor) = 0; Expression& operator=(const Expression&) = delete; Expression& operator=(Expression&&) noexcept = default; std::optional cachedExpressionType; }; struct NAZARA_SHADER_API AccessIdentifierExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; struct Identifier { std::string identifier; ShaderLang::SourceLocation sourceLocation; }; std::vector identifiers; ExpressionPtr expr; }; struct NAZARA_SHADER_API AccessIndexExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::vector indices; ExpressionPtr expr; }; struct NAZARA_SHADER_API AliasValueExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::size_t aliasId; }; struct NAZARA_SHADER_API AssignExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; AssignType op; ExpressionPtr left; ExpressionPtr right; }; struct NAZARA_SHADER_API BinaryExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; BinaryType op; ExpressionPtr left; ExpressionPtr right; }; struct NAZARA_SHADER_API CallFunctionExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::vector parameters; ExpressionPtr targetFunction; }; struct NAZARA_SHADER_API CallMethodExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::string methodName; std::vector parameters; ExpressionPtr object; }; struct NAZARA_SHADER_API CastExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::array expressions; ExpressionValue targetType; }; struct NAZARA_SHADER_API ConditionalExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ExpressionPtr condition; ExpressionPtr falsePath; ExpressionPtr truePath; }; struct NAZARA_SHADER_API ConstantExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::size_t constantId; }; struct NAZARA_SHADER_API ConstantValueExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ConstantValue value; }; struct NAZARA_SHADER_API FunctionExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::size_t funcId; }; struct NAZARA_SHADER_API IdentifierExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::string identifier; }; struct NAZARA_SHADER_API IntrinsicExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::vector parameters; IntrinsicType intrinsic; }; struct NAZARA_SHADER_API IntrinsicFunctionExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::size_t intrinsicId; }; struct NAZARA_SHADER_API StructTypeExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::size_t structTypeId; }; struct NAZARA_SHADER_API SwizzleExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::array components; std::size_t componentCount; ExpressionPtr expression; }; struct NAZARA_SHADER_API TypeExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::size_t typeId; }; struct NAZARA_SHADER_API VariableValueExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::size_t variableId; }; struct NAZARA_SHADER_API UnaryExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ExpressionPtr expression; UnaryType op; }; // Statements struct Statement; using StatementPtr = std::unique_ptr; struct NAZARA_SHADER_API Statement : Node { Statement() = default; Statement(const Statement&) = delete; Statement(Statement&&) noexcept = default; ~Statement() = default; virtual void Visit(AstStatementVisitor& visitor) = 0; Statement& operator=(const Statement&) = delete; Statement& operator=(Statement&&) noexcept = default; }; struct NAZARA_SHADER_API BranchStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; struct ConditionalStatement { ExpressionPtr condition; StatementPtr statement; }; std::vector condStatements; StatementPtr elseStatement; bool isConst = false; }; struct NAZARA_SHADER_API ConditionalStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; ExpressionPtr condition; StatementPtr statement; }; struct NAZARA_SHADER_API DeclareAliasStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::optional aliasIndex; std::string name; ExpressionPtr expression; }; struct NAZARA_SHADER_API DeclareConstStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::optional constIndex; std::string name; ExpressionPtr expression; ExpressionValue type; }; struct NAZARA_SHADER_API DeclareExternalStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; struct ExternalVar { std::optional varIndex; std::string name; ExpressionValue bindingIndex; ExpressionValue bindingSet; ExpressionValue type; ShaderLang::SourceLocation sourceLocation; }; std::vector externalVars; ExpressionValue bindingSet; }; struct NAZARA_SHADER_API DeclareFunctionStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; struct Parameter { std::optional varIndex; std::string name; ExpressionValue type; ShaderLang::SourceLocation sourceLocation; }; std::optional funcIndex; std::string name; std::vector parameters; std::vector statements; ExpressionValue depthWrite; ExpressionValue entryStage; ExpressionValue returnType; ExpressionValue earlyFragmentTests; ExpressionValue isExported; }; struct NAZARA_SHADER_API DeclareOptionStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::optional optIndex; std::string optName; ExpressionPtr defaultValue; ExpressionValue optType; }; struct NAZARA_SHADER_API DeclareStructStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::optional structIndex; ExpressionValue isExported; StructDescription description; }; struct NAZARA_SHADER_API DeclareVariableStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::optional varIndex; std::string varName; ExpressionPtr initialExpression; ExpressionValue varType; }; struct NAZARA_SHADER_API DiscardStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; }; struct NAZARA_SHADER_API ExpressionStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; ExpressionPtr expression; }; struct NAZARA_SHADER_API ForStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::optional varIndex; std::string varName; ExpressionPtr fromExpr; ExpressionPtr stepExpr; ExpressionPtr toExpr; ExpressionValue unroll; StatementPtr statement; }; struct NAZARA_SHADER_API ForEachStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::optional varIndex; std::string varName; ExpressionPtr expression; ExpressionValue unroll; StatementPtr statement; }; struct NAZARA_SHADER_API ImportStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::string moduleName; }; struct NAZARA_SHADER_API MultiStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::vector statements; }; struct NAZARA_SHADER_API NoOpStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; }; struct NAZARA_SHADER_API ReturnStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; ExpressionPtr returnExpr; }; struct NAZARA_SHADER_API ScopedStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; StatementPtr statement; }; struct NAZARA_SHADER_API WhileStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; ExpressionPtr condition; ExpressionValue unroll; StatementPtr body; }; #define NAZARA_SHADERAST_NODE(X) using X##Ptr = std::unique_ptr; #include inline const ExpressionType* GetExpressionType(Expression& expr); inline ExpressionType* GetExpressionTypeMut(Expression& expr); inline bool IsExpression(NodeType nodeType); inline bool IsStatement(NodeType nodeType); inline const ExpressionType& ResolveAlias(const ExpressionType& exprType); } #include #endif // NAZARA_SHADER_AST_NODES_HPP