From 3185e739417aad6d1dccaf560a59f58445c4c98d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Sun, 12 Dec 2021 23:04:37 +0100 Subject: [PATCH] Shader: Fix handling of if/else construct --- src/Nazara/Shader/ShaderLangParser.cpp | 3 +++ src/Nazara/Shader/SpirvAstVisitor.cpp | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/Nazara/Shader/ShaderLangParser.cpp b/src/Nazara/Shader/ShaderLangParser.cpp index 7ca503181..4c2034b93 100644 --- a/src/Nazara/Shader/ShaderLangParser.cpp +++ b/src/Nazara/Shader/ShaderLangParser.cpp @@ -458,7 +458,10 @@ namespace Nz::ShaderLang } if (Peek().type == TokenType::Else) + { + Consume(); branch->elseStatement = ParseStatement(); + } return branch; } diff --git a/src/Nazara/Shader/SpirvAstVisitor.cpp b/src/Nazara/Shader/SpirvAstVisitor.cpp index 74a075a87..56bf2d65b 100644 --- a/src/Nazara/Shader/SpirvAstVisitor.cpp +++ b/src/Nazara/Shader/SpirvAstVisitor.cpp @@ -375,6 +375,9 @@ namespace Nz firstCond.statement->Visit(*this); SpirvBlock mergeBlock(m_writer); + + previousContentBlock.Append(SpirvOp::OpBranch, mergeBlock.GetLabelId()); //< FIXME: Shouldn't terminate twice + m_functionBlocks.back().Append(SpirvOp::OpSelectionMerge, mergeBlock.GetLabelId(), SpirvSelectionControl::None); std::optional nextBlock; @@ -393,6 +396,8 @@ namespace Nz m_currentBlock = &previousContentBlock; statement.statement->Visit(*this); + + previousContentBlock.Append(SpirvOp::OpBranch, mergeBlock.GetLabelId()); //< FIXME: Shouldn't terminate twice } if (node.elseStatement)