From ce93b61c915c9cd51d54b8f04a94659eb8aadb3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 9 Mar 2022 12:32:48 +0100 Subject: [PATCH] Shader: Serialize cached expression type --- include/Nazara/Shader/Ast/AstSerializer.hpp | 2 ++ include/Nazara/Shader/Ast/AstSerializer.inl | 17 +++++++++++++++++ src/Nazara/Shader/Ast/AstSerializer.cpp | 12 +++++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/Nazara/Shader/Ast/AstSerializer.hpp b/include/Nazara/Shader/Ast/AstSerializer.hpp index a6d683125..d0ebde7a4 100644 --- a/include/Nazara/Shader/Ast/AstSerializer.hpp +++ b/include/Nazara/Shader/Ast/AstSerializer.hpp @@ -41,6 +41,7 @@ namespace Nz::ShaderAst void Serialize(SwizzleExpression& node); void Serialize(VariableValueExpression& node); void Serialize(UnaryExpression& node); + void SerializeExpressionCommon(Expression& expr); void Serialize(BranchStatement& node); void Serialize(ConditionalStatement& node); @@ -67,6 +68,7 @@ namespace Nz::ShaderAst template void Enum(T& enumVal); template void ExprValue(ExpressionValue& attribute); template void OptEnum(std::optional& optVal); + inline void OptType(std::optional& optType); template void OptVal(std::optional& optVal); virtual bool IsWriting() const = 0; diff --git a/include/Nazara/Shader/Ast/AstSerializer.inl b/include/Nazara/Shader/Ast/AstSerializer.inl index 9922530ff..e0e60d04e 100644 --- a/include/Nazara/Shader/Ast/AstSerializer.inl +++ b/include/Nazara/Shader/Ast/AstSerializer.inl @@ -126,6 +126,23 @@ namespace Nz::ShaderAst Enum(optVal.value()); } + inline void AstSerializerBase::OptType(std::optional& optType) + { + bool isWriting = IsWriting(); + + bool hasValue; + if (isWriting) + hasValue = optType.has_value(); + + Value(hasValue); + + if (!isWriting && hasValue) + optType.emplace(); + + if (optType.has_value()) + Type(optType.value()); + } + template void AstSerializerBase::OptVal(std::optional& optVal) { diff --git a/src/Nazara/Shader/Ast/AstSerializer.cpp b/src/Nazara/Shader/Ast/AstSerializer.cpp index e3a6b376c..0548e7c85 100644 --- a/src/Nazara/Shader/Ast/AstSerializer.cpp +++ b/src/Nazara/Shader/Ast/AstSerializer.cpp @@ -23,7 +23,13 @@ namespace Nz::ShaderAst { } -#define NAZARA_SHADERAST_NODE(Node) void Visit(Node& node) override \ +#define NAZARA_SHADERAST_EXPRESSION(Node) void Visit(Node& node) override \ + { \ + m_serializer.Serialize(node); \ + m_serializer.SerializeExpressionCommon(node); \ + } + +#define NAZARA_SHADERAST_STATEMENT(Node) void Visit(Node& node) override \ { \ m_serializer.Serialize(node); \ } @@ -188,6 +194,10 @@ namespace Nz::ShaderAst Node(node.expression); } + void AstSerializerBase::SerializeExpressionCommon(Expression& expr) + { + OptType(expr.cachedExpressionType); + } void AstSerializerBase::Serialize(BranchStatement& node) {