Shader: Add Discard node

This commit is contained in:
Jérôme Leclercq
2020-12-30 20:05:16 +01:00
parent a1c15a8c16
commit ed72d668d9
22 changed files with 162 additions and 0 deletions

View File

@@ -519,6 +519,11 @@ namespace Nz
AppendLine(";");
}
void GlslWriter::Visit(ShaderNodes::Discard& /*node*/)
{
Append("discard;");
}
void GlslWriter::Visit(ShaderNodes::ExpressionStatement& node)
{
Visit(node.expression);

View File

@@ -111,6 +111,11 @@ namespace Nz
PushStatement(ShaderNodes::DeclareVariable::Build(CloneVariable(node.variable), CloneExpression(node.expression)));
}
void ShaderAstCloner::Visit(ShaderNodes::Discard& /*node*/)
{
PushStatement(ShaderNodes::Discard::Build());
}
void ShaderAstCloner::Visit(ShaderNodes::ExpressionStatement& node)
{
PushStatement(ShaderNodes::ExpressionStatement::Build(CloneExpression(node.expression)));

View File

@@ -69,6 +69,11 @@ namespace Nz
Visit(node.expression);
}
void ShaderAstRecursiveVisitor::Visit(ShaderNodes::Discard& /*node*/)
{
/* Nothing to do */
}
void ShaderAstRecursiveVisitor::Visit(ShaderNodes::ExpressionStatement& node)
{
Visit(node.expression);

View File

@@ -67,6 +67,11 @@ namespace Nz
Serialize(node);
}
void Visit(ShaderNodes::Discard& node) override
{
Serialize(node);
}
void Visit(ShaderNodes::ExpressionStatement& node) override
{
Serialize(node);
@@ -242,6 +247,11 @@ namespace Nz
Node(node.expression);
}
void ShaderAstSerializerBase::Serialize(ShaderNodes::Discard& /*node*/)
{
/* Nothing to do */
}
void ShaderAstSerializerBase::Serialize(ShaderNodes::ExpressionStatement& node)
{
Node(node.expression);
@@ -665,6 +675,7 @@ namespace Nz
HandleType(ConditionalExpression);
HandleType(ConditionalStatement);
HandleType(DeclareVariable);
HandleType(Discard);
HandleType(ExpressionStatement);
HandleType(Identifier);
HandleType(IntrinsicCall);

View File

@@ -53,6 +53,11 @@ namespace Nz
throw std::runtime_error("unhandled DeclareVariable node");
}
void ShaderAstVisitorExcept::Visit(ShaderNodes::Discard& /*node*/)
{
throw std::runtime_error("unhandled Discard node");
}
void ShaderAstVisitorExcept::Visit(ShaderNodes::ExpressionStatement& /*node*/)
{
throw std::runtime_error("unhandled ExpressionStatement node");

View File

@@ -42,6 +42,12 @@ namespace Nz::ShaderNodes
}
void Discard::Visit(ShaderAstVisitor& visitor)
{
visitor.Visit(*this);
}
ExpressionCategory Identifier::GetExpressionCategory() const
{
return ExpressionCategory::LValue;

View File

@@ -346,6 +346,11 @@ namespace Nz
}
}
void SpirvAstVisitor::Visit(ShaderNodes::Discard& /*node*/)
{
m_writer.GetInstructions().Append(SpirvOp::OpKill);
}
void SpirvAstVisitor::Visit(ShaderNodes::ExpressionStatement& node)
{
Visit(node.expression);