// Copyright (C) 2020 Jérôme Leclercq // This file is part of the "Nazara Engine - Shader generator" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_SHADERASTOPTIMISER_HPP #define NAZARA_SHADERASTOPTIMISER_HPP #include #include #include #include #include namespace Nz::ShaderAst { class NAZARA_SHADER_API AstOptimizer : public AstCloner { public: AstOptimizer() = default; AstOptimizer(const AstOptimizer&) = delete; AstOptimizer(AstOptimizer&&) = delete; ~AstOptimizer() = default; StatementPtr Optimise(const StatementPtr& statement); StatementPtr Optimise(const StatementPtr& statement, UInt64 enabledConditions); AstOptimizer& operator=(const AstOptimizer&) = delete; AstOptimizer& operator=(AstOptimizer&&) = delete; protected: ExpressionPtr Clone(BinaryExpression& node) override; ExpressionPtr Clone(CastExpression& node) override; ExpressionPtr Clone(ConditionalExpression& node) override; ExpressionPtr Clone(UnaryExpression& node) override; StatementPtr Clone(BranchStatement& node) override; StatementPtr Clone(ConditionalStatement& node) override; template ExpressionPtr PropagateBinaryConstant(std::unique_ptr&& lhs, std::unique_ptr&& rhs); template ExpressionPtr PropagateSingleValueCast(std::unique_ptr&& operand); template ExpressionPtr PropagateUnaryConstant(std::unique_ptr&& operand); template ExpressionPtr PropagateVec2Cast(TargetType v1, TargetType v2); template ExpressionPtr PropagateVec3Cast(TargetType v1, TargetType v2, TargetType v3); template ExpressionPtr PropagateVec4Cast(TargetType v1, TargetType v2, TargetType v3, TargetType v4); private: std::optional m_enabledOptions; }; inline StatementPtr Optimize(const StatementPtr& ast); inline StatementPtr Optimize(const StatementPtr& ast, UInt64 enabledConditions); } #include #endif