diff --git a/include/Nazara/Shader/GlslWriter.hpp b/include/Nazara/Shader/GlslWriter.hpp index d7fb7000a..2584389a2 100644 --- a/include/Nazara/Shader/GlslWriter.hpp +++ b/include/Nazara/Shader/GlslWriter.hpp @@ -79,6 +79,7 @@ namespace Nz void Visit(ShaderNodes::InputVariable& var) override; void Visit(ShaderNodes::IntrinsicCall& node) override; void Visit(ShaderNodes::LocalVariable& var) override; + void Visit(ShaderNodes::NoOp& node) override; void Visit(ShaderNodes::ParameterVariable& var) override; void Visit(ShaderNodes::OutputVariable& var) override; void Visit(ShaderNodes::Sample2D& node) override; diff --git a/include/Nazara/Shader/ShaderAstCloner.hpp b/include/Nazara/Shader/ShaderAstCloner.hpp index 1f5259b51..ddd55e4ba 100644 --- a/include/Nazara/Shader/ShaderAstCloner.hpp +++ b/include/Nazara/Shader/ShaderAstCloner.hpp @@ -46,6 +46,7 @@ namespace Nz void Visit(ShaderNodes::ExpressionStatement& node) override; void Visit(ShaderNodes::Identifier& node) override; void Visit(ShaderNodes::IntrinsicCall& node) override; + void Visit(ShaderNodes::NoOp& node) override; void Visit(ShaderNodes::Sample2D& node) override; void Visit(ShaderNodes::StatementBlock& node) override; void Visit(ShaderNodes::SwizzleOp& node) override; diff --git a/include/Nazara/Shader/ShaderAstRecursiveVisitor.hpp b/include/Nazara/Shader/ShaderAstRecursiveVisitor.hpp index 9e780e340..ce8ba487c 100644 --- a/include/Nazara/Shader/ShaderAstRecursiveVisitor.hpp +++ b/include/Nazara/Shader/ShaderAstRecursiveVisitor.hpp @@ -34,6 +34,7 @@ namespace Nz void Visit(ShaderNodes::ExpressionStatement& node) override; void Visit(ShaderNodes::Identifier& node) override; void Visit(ShaderNodes::IntrinsicCall& node) override; + void Visit(ShaderNodes::NoOp& node) override; void Visit(ShaderNodes::Sample2D& node) override; void Visit(ShaderNodes::StatementBlock& node) override; void Visit(ShaderNodes::SwizzleOp& node) override; diff --git a/include/Nazara/Shader/ShaderAstSerializer.hpp b/include/Nazara/Shader/ShaderAstSerializer.hpp index e6e50487a..ad8af504d 100644 --- a/include/Nazara/Shader/ShaderAstSerializer.hpp +++ b/include/Nazara/Shader/ShaderAstSerializer.hpp @@ -40,6 +40,7 @@ namespace Nz void Serialize(ShaderNodes::Identifier& node); void Serialize(ShaderNodes::IntrinsicCall& node); void Serialize(ShaderNodes::NamedVariable& var); + void Serialize(ShaderNodes::NoOp& node); void Serialize(ShaderNodes::Sample2D& node); void Serialize(ShaderNodes::StatementBlock& node); void Serialize(ShaderNodes::SwizzleOp& node); diff --git a/include/Nazara/Shader/ShaderAstVisitor.hpp b/include/Nazara/Shader/ShaderAstVisitor.hpp index f3b0c5bdc..79fb23e9e 100644 --- a/include/Nazara/Shader/ShaderAstVisitor.hpp +++ b/include/Nazara/Shader/ShaderAstVisitor.hpp @@ -35,6 +35,7 @@ namespace Nz virtual void Visit(ShaderNodes::ExpressionStatement& node) = 0; virtual void Visit(ShaderNodes::Identifier& node) = 0; virtual void Visit(ShaderNodes::IntrinsicCall& node) = 0; + virtual void Visit(ShaderNodes::NoOp& node) = 0; virtual void Visit(ShaderNodes::Sample2D& node) = 0; virtual void Visit(ShaderNodes::StatementBlock& node) = 0; virtual void Visit(ShaderNodes::SwizzleOp& node) = 0; diff --git a/include/Nazara/Shader/ShaderAstVisitorExcept.hpp b/include/Nazara/Shader/ShaderAstVisitorExcept.hpp index 3878d522d..65e507062 100644 --- a/include/Nazara/Shader/ShaderAstVisitorExcept.hpp +++ b/include/Nazara/Shader/ShaderAstVisitorExcept.hpp @@ -30,6 +30,7 @@ namespace Nz void Visit(ShaderNodes::ExpressionStatement& node) override; void Visit(ShaderNodes::Identifier& node) override; void Visit(ShaderNodes::IntrinsicCall& node) override; + void Visit(ShaderNodes::NoOp& node) override; void Visit(ShaderNodes::Sample2D& node) override; void Visit(ShaderNodes::StatementBlock& node) override; void Visit(ShaderNodes::SwizzleOp& node) override; diff --git a/include/Nazara/Shader/ShaderEnums.hpp b/include/Nazara/Shader/ShaderEnums.hpp index 557b31ffa..64d8729f3 100644 --- a/include/Nazara/Shader/ShaderEnums.hpp +++ b/include/Nazara/Shader/ShaderEnums.hpp @@ -90,6 +90,7 @@ namespace Nz::ShaderNodes ExpressionStatement, Identifier, IntrinsicCall, + NoOp, Sample2D, SwizzleOp, StatementBlock, diff --git a/include/Nazara/Shader/ShaderNodes.hpp b/include/Nazara/Shader/ShaderNodes.hpp index e519a0b08..5a8f28ce7 100644 --- a/include/Nazara/Shader/ShaderNodes.hpp +++ b/include/Nazara/Shader/ShaderNodes.hpp @@ -161,6 +161,15 @@ namespace Nz static inline std::shared_ptr Build(ExpressionPtr structExpr, std::vector memberIndices, ShaderExpressionType exprType); }; + struct NAZARA_SHADER_API NoOp : public Statement + { + inline NoOp(); + + void Visit(ShaderAstVisitor& visitor) override; + + static inline std::shared_ptr Build(); + }; + ////////////////////////////////////////////////////////////////////////// struct NAZARA_SHADER_API AssignOp : public Expression diff --git a/include/Nazara/Shader/ShaderNodes.inl b/include/Nazara/Shader/ShaderNodes.inl index f3fbecaff..d050a4a31 100644 --- a/include/Nazara/Shader/ShaderNodes.inl +++ b/include/Nazara/Shader/ShaderNodes.inl @@ -194,6 +194,17 @@ namespace Nz::ShaderNodes } + inline ShaderNodes::NoOp::NoOp() : + Statement(NodeType::NoOp) + { + } + + inline std::shared_ptr NoOp::Build() + { + return std::make_shared(); + } + + inline AssignOp::AssignOp() : Expression(NodeType::AssignOp) { diff --git a/include/Nazara/Shader/SpirvAstVisitor.hpp b/include/Nazara/Shader/SpirvAstVisitor.hpp index 571af6cc5..0cac761ca 100644 --- a/include/Nazara/Shader/SpirvAstVisitor.hpp +++ b/include/Nazara/Shader/SpirvAstVisitor.hpp @@ -42,6 +42,7 @@ namespace Nz void Visit(ShaderNodes::ExpressionStatement& node) override; void Visit(ShaderNodes::Identifier& node) override; void Visit(ShaderNodes::IntrinsicCall& node) override; + void Visit(ShaderNodes::NoOp& node) override; void Visit(ShaderNodes::Sample2D& node) override; void Visit(ShaderNodes::StatementBlock& node) override; void Visit(ShaderNodes::SwizzleOp& node) override; diff --git a/src/Nazara/Shader/GlslWriter.cpp b/src/Nazara/Shader/GlslWriter.cpp index 49fa07aa3..6179f094b 100644 --- a/src/Nazara/Shader/GlslWriter.cpp +++ b/src/Nazara/Shader/GlslWriter.cpp @@ -574,6 +574,11 @@ namespace Nz Append(var.name); } + void GlslWriter::Visit(ShaderNodes::NoOp& /*node*/) + { + /* nothing to do */ + } + void GlslWriter::Visit(ShaderNodes::ParameterVariable& var) { Append(var.name); @@ -598,7 +603,7 @@ namespace Nz bool first = true; for (const ShaderNodes::StatementPtr& statement : node.statements) { - if (!first) + if (!first && statement->GetType() != ShaderNodes::NodeType::NoOp) AppendLine(); Visit(statement); diff --git a/src/Nazara/Shader/ShaderAstCloner.cpp b/src/Nazara/Shader/ShaderAstCloner.cpp index 8a07cf1a7..ebbcfa560 100644 --- a/src/Nazara/Shader/ShaderAstCloner.cpp +++ b/src/Nazara/Shader/ShaderAstCloner.cpp @@ -137,6 +137,11 @@ namespace Nz PushExpression(ShaderNodes::IntrinsicCall::Build(node.intrinsic, std::move(parameters))); } + void ShaderAstCloner::Visit(ShaderNodes::NoOp& /*node*/) + { + PushStatement(ShaderNodes::NoOp::Build()); + } + void ShaderAstCloner::Visit(ShaderNodes::Sample2D& node) { PushExpression(ShaderNodes::Sample2D::Build(CloneExpression(node.sampler), CloneExpression(node.coordinates))); diff --git a/src/Nazara/Shader/ShaderAstRecursiveVisitor.cpp b/src/Nazara/Shader/ShaderAstRecursiveVisitor.cpp index bca595384..d3b404011 100644 --- a/src/Nazara/Shader/ShaderAstRecursiveVisitor.cpp +++ b/src/Nazara/Shader/ShaderAstRecursiveVisitor.cpp @@ -90,6 +90,11 @@ namespace Nz Visit(param); } + void ShaderAstRecursiveVisitor::Visit(ShaderNodes::NoOp& /*node*/) + { + /* Nothing to do */ + } + void ShaderAstRecursiveVisitor::Visit(ShaderNodes::Sample2D& node) { Visit(node.sampler); diff --git a/src/Nazara/Shader/ShaderAstSerializer.cpp b/src/Nazara/Shader/ShaderAstSerializer.cpp index 7f12ad3b5..66b346a7f 100644 --- a/src/Nazara/Shader/ShaderAstSerializer.cpp +++ b/src/Nazara/Shader/ShaderAstSerializer.cpp @@ -87,6 +87,11 @@ namespace Nz Serialize(node); } + void Visit(ShaderNodes::NoOp& node) override + { + Serialize(node); + } + void Visit(ShaderNodes::Sample2D& node) override { Serialize(node); @@ -276,6 +281,11 @@ namespace Nz Type(node.type); } + void ShaderAstSerializerBase::Serialize(ShaderNodes::NoOp& /*node*/) + { + /* Nothing to do */ + } + void ShaderAstSerializerBase::Serialize(ShaderNodes::Sample2D& node) { Node(node.sampler); @@ -682,6 +692,7 @@ namespace Nz HandleType(ExpressionStatement); HandleType(Identifier); HandleType(IntrinsicCall); + HandleType(NoOp); HandleType(Sample2D); HandleType(SwizzleOp); HandleType(StatementBlock); diff --git a/src/Nazara/Shader/ShaderAstVisitorExcept.cpp b/src/Nazara/Shader/ShaderAstVisitorExcept.cpp index 17671a42c..7843281d4 100644 --- a/src/Nazara/Shader/ShaderAstVisitorExcept.cpp +++ b/src/Nazara/Shader/ShaderAstVisitorExcept.cpp @@ -73,6 +73,11 @@ namespace Nz throw std::runtime_error("unhandled IntrinsicCall node"); } + void ShaderAstVisitorExcept::Visit(ShaderNodes::NoOp& node) + { + throw std::runtime_error("unhandled NoOp node"); + } + void ShaderAstVisitorExcept::Visit(ShaderNodes::Sample2D& /*node*/) { throw std::runtime_error("unhandled Sample2D node"); diff --git a/src/Nazara/Shader/ShaderNodes.cpp b/src/Nazara/Shader/ShaderNodes.cpp index 05a59ab96..8d96c40ea 100644 --- a/src/Nazara/Shader/ShaderNodes.cpp +++ b/src/Nazara/Shader/ShaderNodes.cpp @@ -79,6 +79,11 @@ namespace Nz::ShaderNodes visitor.Visit(*this); } + void NoOp::Visit(ShaderAstVisitor& visitor) + { + visitor.Visit(*this); + } + ShaderExpressionType AssignOp::GetExpressionType() const { return left->GetExpressionType(); diff --git a/src/Nazara/Shader/SpirvAstVisitor.cpp b/src/Nazara/Shader/SpirvAstVisitor.cpp index da172fb44..9c6797ff9 100644 --- a/src/Nazara/Shader/SpirvAstVisitor.cpp +++ b/src/Nazara/Shader/SpirvAstVisitor.cpp @@ -605,6 +605,11 @@ namespace Nz } } + void SpirvAstVisitor::Visit(ShaderNodes::NoOp& /*node*/) + { + // nothing to do + } + void SpirvAstVisitor::Visit(ShaderNodes::Sample2D& node) { UInt32 typeId = m_writer.GetTypeId(ShaderNodes::BasicType::Float4);