// 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_SPIRVEXPRESSIONSTORE_HPP #define NAZARA_SHADER_SPIRVEXPRESSIONSTORE_HPP #include #include #include #include #include namespace Nz { class SpirvAstVisitor; class SpirvBlock; class SpirvWriter; class NAZARA_SHADER_API SpirvExpressionStore : public ShaderAst::AstExpressionVisitorExcept { public: inline SpirvExpressionStore(SpirvWriter& writer, SpirvAstVisitor& visitor, SpirvBlock& block); SpirvExpressionStore(const SpirvExpressionStore&) = delete; SpirvExpressionStore(SpirvExpressionStore&&) = delete; ~SpirvExpressionStore() = default; void Store(ShaderAst::ExpressionPtr& node, UInt32 resultId); using AstExpressionVisitorExcept::Visit; void Visit(ShaderAst::AccessIndexExpression& node) override; void Visit(ShaderAst::SwizzleExpression& node) override; void Visit(ShaderAst::VariableValueExpression& node) override; SpirvExpressionStore& operator=(const SpirvExpressionStore&) = delete; SpirvExpressionStore& operator=(SpirvExpressionStore&&) = delete; private: struct Pointer { SpirvStorageClass storage; UInt32 pointerId; }; struct SwizzledPointer : Pointer { ShaderAst::VectorType swizzledType; std::array swizzleIndices; std::size_t componentCount; }; SpirvAstVisitor& m_visitor; SpirvBlock& m_block; SpirvWriter& m_writer; std::variant m_value; }; } #include #endif // NAZARA_SHADER_SPIRVEXPRESSIONSTORE_HPP