ShaderAst: Add NoOp node

This commit is contained in:
Jérôme Leclercq 2021-01-14 21:58:06 +01:00
parent a9f2e05b57
commit acb998f67e
17 changed files with 70 additions and 1 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -90,6 +90,7 @@ namespace Nz::ShaderNodes
ExpressionStatement,
Identifier,
IntrinsicCall,
NoOp,
Sample2D,
SwizzleOp,
StatementBlock,

View File

@ -161,6 +161,15 @@ namespace Nz
static inline std::shared_ptr<AccessMember> Build(ExpressionPtr structExpr, std::vector<std::size_t> memberIndices, ShaderExpressionType exprType);
};
struct NAZARA_SHADER_API NoOp : public Statement
{
inline NoOp();
void Visit(ShaderAstVisitor& visitor) override;
static inline std::shared_ptr<NoOp> Build();
};
//////////////////////////////////////////////////////////////////////////
struct NAZARA_SHADER_API AssignOp : public Expression

View File

@ -194,6 +194,17 @@ namespace Nz::ShaderNodes
}
inline ShaderNodes::NoOp::NoOp() :
Statement(NodeType::NoOp)
{
}
inline std::shared_ptr<NoOp> NoOp::Build()
{
return std::make_shared<NoOp>();
}
inline AssignOp::AssignOp() :
Expression(NodeType::AssignOp)
{

View File

@ -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;

View File

@ -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);

View File

@ -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)));

View File

@ -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);

View File

@ -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);

View File

@ -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");

View File

@ -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();

View File

@ -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);