From 28531f5118e20468c39e13f25d53839a66cfcd02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 25 Feb 2022 19:36:54 +0100 Subject: [PATCH 1/6] Minor changes --- examples/GraphicsTest/main.cpp | 6 ++++-- examples/WidgetDemo/main.cpp | 6 ++++-- include/Nazara/Core/Flags.hpp | 4 ++-- include/Nazara/Graphics.hpp | 3 +++ xmake-repo/packages/q/qt5widgets/xmake.lua | 2 -- xmake.lua | 13 +++++++++---- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/examples/GraphicsTest/main.cpp b/examples/GraphicsTest/main.cpp index 156d435e8..5a71b028a 100644 --- a/examples/GraphicsTest/main.cpp +++ b/examples/GraphicsTest/main.cpp @@ -105,8 +105,9 @@ int main() framePipeline.RegisterRenderable(worldInstanceIndex1, &model, 0xFFFFFFFF, scissorBox); framePipeline.RegisterRenderable(worldInstanceIndex2, &model, 0xFFFFFFFF, scissorBox); - std::shared_ptr light = std::make_shared(); - light->UpdateColor(Nz::Color::Green); + std::shared_ptr light = std::make_shared(); + light->UpdateInnerAngle(Nz::DegreeAnglef(15.f)); + light->UpdateOuterAngle(Nz::DegreeAnglef(20.f)); framePipeline.RegisterLight(light, 0xFFFFFFFF); @@ -165,6 +166,7 @@ int main() camAngles.pitch = Nz::Clamp(camAngles.pitch - event.mouseMove.deltaY*sensitivity, -89.f, 89.f); camQuat = camAngles; + light->UpdateRotation(camQuat); break; } diff --git a/examples/WidgetDemo/main.cpp b/examples/WidgetDemo/main.cpp index a8d930cc4..692646b3a 100644 --- a/examples/WidgetDemo/main.cpp +++ b/examples/WidgetDemo/main.cpp @@ -60,13 +60,15 @@ int main() labelWidget->SetPosition(0.f, 200.f, 0.f); labelWidget->UpdateText(Nz::SimpleTextDrawer::Draw("Je suis un LabelWidget !", 72)); + unsigned int clickCount = 0; + Nz::ButtonWidget* buttonWidget = canvas2D.Add(); buttonWidget->SetPosition(200.f, 400.f); buttonWidget->UpdateText(Nz::SimpleTextDrawer::Draw("Press me senpai", 72)); buttonWidget->Resize(buttonWidget->GetPreferredSize()); - buttonWidget->OnButtonTrigger.Connect([=](const Nz::ButtonWidget*) + buttonWidget->OnButtonTrigger.Connect([&](const Nz::ButtonWidget*) { - buttonWidget->Destroy(); + labelWidget->UpdateText(Nz::SimpleTextDrawer::Draw("You clicked the button " + std::to_string(++clickCount) + " times", 72)); }); std::shared_ptr material = std::make_shared(); diff --git a/include/Nazara/Core/Flags.hpp b/include/Nazara/Core/Flags.hpp index b0b2ad0e0..bc670b96a 100644 --- a/include/Nazara/Core/Flags.hpp +++ b/include/Nazara/Core/Flags.hpp @@ -27,10 +27,10 @@ namespace Nz template - struct GetEnumAutoFlag : std::integral_constant {}; + struct GetEnumAutoFlag : std::bool_constant {}; template - struct GetEnumAutoFlag> : std::integral_constant {}; + struct GetEnumAutoFlag> : std::bool_constant {}; template class Flags diff --git a/include/Nazara/Graphics.hpp b/include/Nazara/Graphics.hpp index 409850c9f..7002d9f15 100644 --- a/include/Nazara/Graphics.hpp +++ b/include/Nazara/Graphics.hpp @@ -36,14 +36,17 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include #include +#include #include #include #include diff --git a/xmake-repo/packages/q/qt5widgets/xmake.lua b/xmake-repo/packages/q/qt5widgets/xmake.lua index 5692df2db..ee0a4cb85 100644 --- a/xmake-repo/packages/q/qt5widgets/xmake.lua +++ b/xmake-repo/packages/q/qt5widgets/xmake.lua @@ -15,11 +15,9 @@ package("qt5widgets") end) on_fetch(function (package) - print("on_fetch") local base = package:dep("qt5base") local qt = base:data("qtdir") if not qt then - print("nani") return end diff --git a/xmake.lua b/xmake.lua index c3b210942..a8e456664 100644 --- a/xmake.lua +++ b/xmake.lua @@ -107,6 +107,7 @@ NazaraModules = modules includes("xmake/**.lua") +set_project("NazaraEngine") set_xmakever("2.6.3") add_repositories("local-repo xmake-repo") @@ -117,13 +118,17 @@ add_requires("libvorbis", { configs = { with_vorbisenc = false } }) add_requires("openal-soft", { configs = { shared = true }}) add_requires("newtondynamics", { debug = is_plat("windows") and is_mode("debug") }) -- Newton doesn't like compiling in Debug on Linux -set_project("NazaraEngine") - -add_rules("mode.asan", "mode.coverage", "mode.debug", "mode.releasedbg") +add_rules("mode.asan", "mode.debug", "mode.releasedbg") add_rules("plugin.vsxmake.autoupdate") add_rules("build_rendererplugins") -set_allowedmodes("debug", "releasedbg", "asan", "coverage") +if is_plat("windows") then + set_allowedmodes("debug", "releasedbg", "asan") +else + set_allowedmodes("debug", "releasedbg", "asan", "coverage") + add_rules("mode.coverage") +end + set_allowedplats("windows", "mingw", "linux", "macosx") set_allowedarchs("windows|x64", "mingw|x86_64", "linux|x86_64", "macosx|x86_64") set_defaultmode("debug") From 8a097afb1b9692455272563ba8dd7ed70b62ca16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Sun, 27 Feb 2022 18:37:05 +0100 Subject: [PATCH 2/6] Graphics/FramePass: Replace render rect parameter of CommandCallback by FramePassEnvironment --- examples/DeferredShading/main.cpp | 66 ++++++++++---------- include/Nazara/Graphics/FramePass.hpp | 11 +++- include/Nazara/OpenGLRenderer/Utils.inl | 1 + src/Nazara/Graphics/BakedFrameGraph.cpp | 8 ++- src/Nazara/Graphics/DepthPipelinePass.cpp | 2 +- src/Nazara/Graphics/ForwardFramePipeline.cpp | 6 +- src/Nazara/Graphics/ForwardPipelinePass.cpp | 2 +- 7 files changed, 56 insertions(+), 40 deletions(-) diff --git a/examples/DeferredShading/main.cpp b/examples/DeferredShading/main.cpp index cf339da1f..6fc6d8477 100644 --- a/examples/DeferredShading/main.cpp +++ b/examples/DeferredShading/main.cpp @@ -840,14 +840,14 @@ int main() return Nz::FramePassExecution::Execute; }); - gbufferPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) + gbufferPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::FramePassEnvironment& env) { - builder.SetViewport(renderArea); + builder.SetViewport(env.renderRect); std::vector> elements; - spaceshipModel.BuildElement(forwardPassIndex, modelInstance1, elements, renderArea); - spaceshipModel.BuildElement(forwardPassIndex, modelInstance2, elements, renderArea); - planeModel.BuildElement(forwardPassIndex, planeInstance, elements, renderArea); + spaceshipModel.BuildElement(forwardPassIndex, modelInstance1, elements, env.renderRect); + spaceshipModel.BuildElement(forwardPassIndex, modelInstance2, elements, env.renderRect); + planeModel.BuildElement(forwardPassIndex, planeInstance, elements, env.renderRect); std::vector> elementPointers; std::vector renderStates(elements.size()); @@ -866,10 +866,10 @@ int main() return (lightUpdate) ? Nz::FramePassExecution::UpdateAndExecute : Nz::FramePassExecution::Execute; }); - lightingPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) + lightingPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::FramePassEnvironment& env) { - builder.SetScissor(renderArea); - builder.SetViewport(renderArea); + builder.SetScissor(env.renderRect); + builder.SetViewport(env.renderRect); //builder.BindVertexBuffer(0, vertexBuffer.get()); builder.BindIndexBuffer(*coneMeshGfx->GetIndexBuffer(0).get()); @@ -897,10 +897,10 @@ int main() lightingPass.SetDepthStencilInput(depthBuffer1); Nz::FramePass& forwardPass = graph.AddPass("Forward pass"); - forwardPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) + forwardPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::FramePassEnvironment& env) { - builder.SetScissor(renderArea); - builder.SetViewport(renderArea); + builder.SetScissor(env.renderRect); + builder.SetViewport(env.renderRect); builder.BindShaderBinding(0, *skyboxShaderBinding); @@ -911,7 +911,7 @@ int main() builder.DrawIndexed(Nz::SafeCast(cubeMeshGfx->GetIndexCount(0))); std::vector> elements; - flareSprite.BuildElement(forwardPassIndex, flareInstance, elements, renderArea); + flareSprite.BuildElement(forwardPassIndex, flareInstance, elements, env.renderRect); std::vector> elementPointers; std::vector renderStates(elements.size()); @@ -935,12 +935,12 @@ int main() Nz::FramePass& occluderPass = graph.AddPass("Occluder pass"); - occluderPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) + occluderPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::FramePassEnvironment& env) { - builder.SetViewport(renderArea); + builder.SetViewport(env.renderRect); std::vector> elements; - flareSprite.BuildElement(forwardPassIndex, flareInstance, elements, renderArea); + flareSprite.BuildElement(forwardPassIndex, flareInstance, elements, env.renderRect); std::vector> elementPointers; std::vector renderStates(elements.size()); @@ -959,10 +959,10 @@ int main() occluderPass.SetDepthStencilInput(depthBuffer1); Nz::FramePass& godraysPass = graph.AddPass("Light scattering pass"); - godraysPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) + godraysPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::FramePassEnvironment& env) { - builder.SetScissor(renderArea); - builder.SetViewport(renderArea); + builder.SetScissor(env.renderRect); + builder.SetViewport(env.renderRect); builder.BindShaderBinding(0, *godRaysShaderBinding); @@ -976,10 +976,10 @@ int main() godraysPass.AddOutput(godRaysTexture); Nz::FramePass& bloomBrightPass = graph.AddPass("Bloom pass - extract bright pixels"); - bloomBrightPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) + bloomBrightPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::FramePassEnvironment& env) { - builder.SetScissor(renderArea); - builder.SetViewport(renderArea); + builder.SetScissor(env.renderRect); + builder.SetViewport(env.renderRect); builder.BindShaderBinding(0, *bloomBrightShaderBinding); @@ -1000,10 +1000,10 @@ int main() for (std::size_t i = 0; i < BloomSubdivisionCount; ++i) { Nz::FramePass& bloomBlurPassHorizontal = graph.AddPass("Bloom pass - gaussian blur #" + std::to_string(i) + " - horizontal"); - bloomBlurPassHorizontal.SetCommandCallback([&, i](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) + bloomBlurPassHorizontal.SetCommandCallback([&, i](Nz::CommandBufferBuilder& builder, const Nz::FramePassEnvironment& env) { - builder.SetScissor(renderArea); - builder.SetViewport(renderArea); + builder.SetScissor(env.renderRect); + builder.SetViewport(env.renderRect); builder.BindShaderBinding(0, *gaussianBlurShaderBinding[i * 2 + 0]); builder.BindPipeline(*gaussianBlurPipeline); @@ -1021,10 +1021,10 @@ int main() bloomBlurPassHorizontal.AddOutput(bloomTextures[bloomTextureIndex]); Nz::FramePass& bloomBlurPassVertical = graph.AddPass("Bloom pass - gaussian blur #" + std::to_string(i) + " - vertical"); - bloomBlurPassVertical.SetCommandCallback([&, i](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) + bloomBlurPassVertical.SetCommandCallback([&, i](Nz::CommandBufferBuilder& builder, const Nz::FramePassEnvironment& env) { - builder.SetScissor(renderArea); - builder.SetViewport(renderArea); + builder.SetScissor(env.renderRect); + builder.SetViewport(env.renderRect); builder.BindShaderBinding(0, *gaussianBlurShaderBinding[i * 2 + 1]); builder.BindPipeline(*gaussianBlurPipeline); @@ -1043,10 +1043,10 @@ int main() } Nz::FramePass& bloomBlendPass = graph.AddPass("Bloom pass - blend"); - bloomBlendPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) + bloomBlendPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::FramePassEnvironment& env) { - builder.SetScissor(renderArea); - builder.SetViewport(renderArea); + builder.SetScissor(env.renderRect); + builder.SetViewport(env.renderRect); builder.BindVertexBuffer(0, *fullscreenVertexBuffer); // Blend bloom @@ -1079,10 +1079,10 @@ int main() Nz::FramePass& toneMappingPass = graph.AddPass("Tone mapping"); toneMappingPass.AddInput(bloomOutput); toneMappingPass.AddOutput(toneMappingOutput); - toneMappingPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) + toneMappingPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::FramePassEnvironment& env) { - builder.SetScissor(renderArea); - builder.SetViewport(renderArea); + builder.SetScissor(env.renderRect); + builder.SetViewport(env.renderRect); builder.BindShaderBinding(0, *toneMappingShaderBinding); builder.BindPipeline(*toneMappingPipeline); diff --git a/include/Nazara/Graphics/FramePass.hpp b/include/Nazara/Graphics/FramePass.hpp index 6e94ec39b..7e9db3101 100644 --- a/include/Nazara/Graphics/FramePass.hpp +++ b/include/Nazara/Graphics/FramePass.hpp @@ -19,8 +19,10 @@ namespace Nz { + class BakedFrameGraph; class CommandBufferBuilder; class FrameGraph; + class RenderFrame; enum class FramePassExecution { @@ -29,10 +31,17 @@ namespace Nz UpdateAndExecute }; + struct FramePassEnvironment + { + BakedFrameGraph& frameGraph; + Recti renderRect; + RenderFrame& renderFrame; + }; + class NAZARA_GRAPHICS_API FramePass { public: - using CommandCallback = std::function; + using CommandCallback = std::function; using ExecutionCallback = std::function; struct DepthStencilClear; struct Input; diff --git a/include/Nazara/OpenGLRenderer/Utils.inl b/include/Nazara/OpenGLRenderer/Utils.inl index d119a3123..07983abe7 100644 --- a/include/Nazara/OpenGLRenderer/Utils.inl +++ b/include/Nazara/OpenGLRenderer/Utils.inl @@ -21,6 +21,7 @@ namespace Nz case PixelFormat::BGRA8: return GLTextureFormat{ GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }; case PixelFormat::BGRA8_SRGB: return GLTextureFormat{ GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }; case PixelFormat::Depth16: return GLTextureFormat{ GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, GL_RED, GL_ZERO, GL_ZERO, GL_ZERO }; + case PixelFormat::Depth24: return GLTextureFormat{ GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_RED, GL_ZERO, GL_ZERO, GL_ZERO }; case PixelFormat::Depth24Stencil8: return GLTextureFormat{ GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_RED, GL_GREEN, GL_ZERO, GL_ZERO }; case PixelFormat::Depth32F: return GLTextureFormat{ GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, GL_RED, GL_ZERO, GL_ZERO, GL_ZERO }; case PixelFormat::Depth32FStencil8: return GLTextureFormat{ GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_RED, GL_GREEN, GL_ZERO, GL_ZERO }; diff --git a/src/Nazara/Graphics/BakedFrameGraph.cpp b/src/Nazara/Graphics/BakedFrameGraph.cpp index 0b9dca644..0182185a4 100644 --- a/src/Nazara/Graphics/BakedFrameGraph.cpp +++ b/src/Nazara/Graphics/BakedFrameGraph.cpp @@ -67,6 +67,12 @@ namespace Nz if (!passData.name.empty()) builder.BeginDebugRegion(passData.name, Color::Green); + FramePassEnvironment env{ + *this, + passData.renderRect, + renderFrame + }; + bool first = true; for (auto& subpass : passData.subpasses) { @@ -75,7 +81,7 @@ namespace Nz first = false; - subpass.commandCallback(builder, passData.renderRect); + subpass.commandCallback(builder, env); } if (!passData.name.empty()) diff --git a/src/Nazara/Graphics/DepthPipelinePass.cpp b/src/Nazara/Graphics/DepthPipelinePass.cpp index 56b485dd9..3826b8279 100644 --- a/src/Nazara/Graphics/DepthPipelinePass.cpp +++ b/src/Nazara/Graphics/DepthPipelinePass.cpp @@ -137,7 +137,7 @@ namespace Nz return (m_rebuildCommandBuffer) ? FramePassExecution::UpdateAndExecute : FramePassExecution::Execute; }); - depthPrepass.SetCommandCallback([this](CommandBufferBuilder& builder, const Recti& /*renderRect*/) + depthPrepass.SetCommandCallback([this](CommandBufferBuilder& builder, const FramePassEnvironment& /*env*/) { Recti viewport = m_viewer->GetViewport(); diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp index 73688d3a0..ad6916161 100644 --- a/src/Nazara/Graphics/ForwardFramePipeline.cpp +++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp @@ -532,10 +532,10 @@ namespace Nz mergePass.AddOutput(renderTargetData.finalAttachment); mergePass.SetClearColor(0, Color::Black); - mergePass.SetCommandCallback([&targetViewers](CommandBufferBuilder& builder, const Recti& renderRect) + mergePass.SetCommandCallback([&targetViewers](CommandBufferBuilder& builder, const Nz::FramePassEnvironment& env) { - builder.SetScissor(renderRect); - builder.SetViewport(renderRect); + builder.SetScissor(env.renderRect); + builder.SetViewport(env.renderRect); Graphics* graphics = Graphics::Instance(); builder.BindPipeline(*graphics->GetBlitPipeline(false)); diff --git a/src/Nazara/Graphics/ForwardPipelinePass.cpp b/src/Nazara/Graphics/ForwardPipelinePass.cpp index f7f12640b..dee3e9fa4 100644 --- a/src/Nazara/Graphics/ForwardPipelinePass.cpp +++ b/src/Nazara/Graphics/ForwardPipelinePass.cpp @@ -282,7 +282,7 @@ namespace Nz return (m_rebuildCommandBuffer) ? FramePassExecution::UpdateAndExecute : FramePassExecution::Execute; }); - forwardPass.SetCommandCallback([this](CommandBufferBuilder& builder, const Recti& /*renderRect*/) + forwardPass.SetCommandCallback([this](CommandBufferBuilder& builder, const FramePassEnvironment& /*env*/) { Recti viewport = m_viewer->GetViewport(); From 55a5ae06485b586d7c11ff3507cc3bb20b673205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Sun, 27 Feb 2022 18:41:43 +0100 Subject: [PATCH 3/6] VulkanRenderer: Improve pixel format handling --- include/Nazara/VulkanRenderer/Utils.inl | 7 ++++++- src/Nazara/VulkanRenderer/VulkanDevice.cpp | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/include/Nazara/VulkanRenderer/Utils.inl b/include/Nazara/VulkanRenderer/Utils.inl index 94a66f42c..ba698b072 100644 --- a/include/Nazara/VulkanRenderer/Utils.inl +++ b/include/Nazara/VulkanRenderer/Utils.inl @@ -256,6 +256,7 @@ namespace Nz case PixelFormat::BGRA8_SRGB: return VK_FORMAT_B8G8R8A8_SRGB; case PixelFormat::Depth16: return VK_FORMAT_D16_UNORM; case PixelFormat::Depth16Stencil8: return VK_FORMAT_D16_UNORM_S8_UINT; + case PixelFormat::Depth24: return VK_FORMAT_UNDEFINED; case PixelFormat::Depth24Stencil8: return VK_FORMAT_D24_UNORM_S8_UINT; case PixelFormat::Depth32F: return VK_FORMAT_D32_SFLOAT; case PixelFormat::Depth32FStencil8: return VK_FORMAT_D32_SFLOAT_S8_UINT; @@ -265,11 +266,15 @@ namespace Nz case PixelFormat::RGBA8_SRGB: return VK_FORMAT_R8G8B8A8_SRGB; case PixelFormat::RGBA16F: return VK_FORMAT_R16G16B16A16_SFLOAT; case PixelFormat::RGBA32F: return VK_FORMAT_R32G32B32A32_SFLOAT; + case PixelFormat::Stencil1: return VK_FORMAT_UNDEFINED; + case PixelFormat::Stencil4: return VK_FORMAT_UNDEFINED; + case PixelFormat::Stencil8: return VK_FORMAT_S8_UINT; + case PixelFormat::Stencil16: return VK_FORMAT_UNDEFINED; default: break; } NazaraError("Unhandled PixelFormat 0x" + NumberToString(UnderlyingCast(pixelFormat), 16)); - return {}; + return VK_FORMAT_UNDEFINED; } VkImageAspectFlags ToVulkan(PixelFormatContent pixelFormatContent) diff --git a/src/Nazara/VulkanRenderer/VulkanDevice.cpp b/src/Nazara/VulkanRenderer/VulkanDevice.cpp index 82bfa3835..0f03c63b6 100644 --- a/src/Nazara/VulkanRenderer/VulkanDevice.cpp +++ b/src/Nazara/VulkanRenderer/VulkanDevice.cpp @@ -91,6 +91,10 @@ namespace Nz bool VulkanDevice::IsTextureFormatSupported(PixelFormat format, TextureUsage usage) const { + VkFormat vulkanFormat = ToVulkan(format); + if (vulkanFormat == VK_FORMAT_UNDEFINED) + return false; + VkFormatFeatureFlags flags = 0; switch (usage) { @@ -116,7 +120,7 @@ namespace Nz break; } - VkFormatProperties formatProperties = GetInstance().GetPhysicalDeviceFormatProperties(GetPhysicalDevice(), ToVulkan(format)); + VkFormatProperties formatProperties = GetInstance().GetPhysicalDeviceFormatProperties(GetPhysicalDevice(), vulkanFormat); return formatProperties.optimalTilingFeatures & flags; //< Assume optimal tiling } } From fbae4136204479f6f31bad6ce25745fb76b31d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Sun, 27 Feb 2022 18:42:41 +0100 Subject: [PATCH 4/6] Shader/GlslWriter: Improve removal of unused code --- .../Shader/Ast/EliminateUnusedPassVisitor.hpp | 11 ++++++++-- .../Shader/Ast/EliminateUnusedPassVisitor.inl | 4 ++-- .../Shader/Ast/EliminateUnusedPassVisitor.cpp | 21 ++++++++++++++++--- src/Nazara/Shader/GlslWriter.cpp | 6 +++++- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/include/Nazara/Shader/Ast/EliminateUnusedPassVisitor.hpp b/include/Nazara/Shader/Ast/EliminateUnusedPassVisitor.hpp index 1631b684b..854ee69df 100644 --- a/include/Nazara/Shader/Ast/EliminateUnusedPassVisitor.hpp +++ b/include/Nazara/Shader/Ast/EliminateUnusedPassVisitor.hpp @@ -17,16 +17,23 @@ namespace Nz::ShaderAst class NAZARA_SHADER_API EliminateUnusedPassVisitor : AstCloner { public: + struct Config; + EliminateUnusedPassVisitor() = default; EliminateUnusedPassVisitor(const EliminateUnusedPassVisitor&) = delete; EliminateUnusedPassVisitor(EliminateUnusedPassVisitor&&) = delete; ~EliminateUnusedPassVisitor() = default; - StatementPtr Process(Statement& statement); + StatementPtr Process(Statement& statement, const Config& config = {}); EliminateUnusedPassVisitor& operator=(const EliminateUnusedPassVisitor&) = delete; EliminateUnusedPassVisitor& operator=(EliminateUnusedPassVisitor&&) = delete; + struct Config + { + ShaderStageTypeFlags usedShaderStages = ShaderStageType_All; + }; + private: using AstCloner::Clone; StatementPtr Clone(DeclareExternalStatement& node) override; @@ -42,7 +49,7 @@ namespace Nz::ShaderAst Context* m_context; }; - inline StatementPtr EliminateUnusedPass(Statement& ast); + inline StatementPtr EliminateUnusedPass(Statement& ast, const EliminateUnusedPassVisitor::Config& config = {}); } #include diff --git a/include/Nazara/Shader/Ast/EliminateUnusedPassVisitor.inl b/include/Nazara/Shader/Ast/EliminateUnusedPassVisitor.inl index 08512f309..db8124116 100644 --- a/include/Nazara/Shader/Ast/EliminateUnusedPassVisitor.inl +++ b/include/Nazara/Shader/Ast/EliminateUnusedPassVisitor.inl @@ -7,10 +7,10 @@ namespace Nz::ShaderAst { - inline StatementPtr EliminateUnusedPass(Statement& ast) + inline StatementPtr EliminateUnusedPass(Statement& ast, const EliminateUnusedPassVisitor::Config& config) { EliminateUnusedPassVisitor visitor; - return visitor.Process(ast); + return visitor.Process(ast, config); } } diff --git a/src/Nazara/Shader/Ast/EliminateUnusedPassVisitor.cpp b/src/Nazara/Shader/Ast/EliminateUnusedPassVisitor.cpp index 9fccbceac..95afe355d 100644 --- a/src/Nazara/Shader/Ast/EliminateUnusedPassVisitor.cpp +++ b/src/Nazara/Shader/Ast/EliminateUnusedPassVisitor.cpp @@ -29,6 +29,11 @@ namespace Nz::ShaderAst struct UsageChecker : AstRecursiveVisitor { + UsageChecker(const EliminateUnusedPassVisitor::Config& Config) : + config(Config) + { + } + struct UsageSet; void Resolve() @@ -129,7 +134,11 @@ namespace Nz::ShaderAst } if (node.entryStage.HasValue()) - globalUsage.usedFunctions.UnboundedSet(*node.funcIndex); + { + ShaderStageType shaderStage = node.entryStage.GetResultingValue(); + if (shaderStage & config.usedShaderStages) + globalUsage.usedFunctions.UnboundedSet(*node.funcIndex); + } currentFunctionIndex = node.funcIndex; AstRecursiveVisitor::Visit(node); @@ -195,6 +204,7 @@ namespace Nz::ShaderAst Bitset<> usedVariables; }; + const EliminateUnusedPassVisitor::Config& config; std::optional currentFunctionIndex; std::optional currentVariableDeclIndex; std::unordered_map functionUsages; @@ -207,12 +217,17 @@ namespace Nz::ShaderAst struct EliminateUnusedPassVisitor::Context { + Context(const Config& config) : + usageChecker(config) + { + } + UsageChecker usageChecker; }; - StatementPtr EliminateUnusedPassVisitor::Process(Statement& statement) + StatementPtr EliminateUnusedPassVisitor::Process(Statement& statement, const Config& config) { - Context context; + Context context(config); statement.Visit(context.usageChecker); context.usageChecker.Resolve(); diff --git a/src/Nazara/Shader/GlslWriter.cpp b/src/Nazara/Shader/GlslWriter.cpp index 5b05f1f09..6a60c6991 100644 --- a/src/Nazara/Shader/GlslWriter.cpp +++ b/src/Nazara/Shader/GlslWriter.cpp @@ -180,8 +180,12 @@ namespace Nz { ShaderAst::StatementPtr tempAst; + ShaderAst::EliminateUnusedPassVisitor::Config eliminateUnunsedConfig; + if (shaderStage) + eliminateUnunsedConfig.usedShaderStages = *shaderStage; + tempAst = ShaderAst::PropagateConstants(*targetAst); - optimizedAst = ShaderAst::EliminateUnusedPass(*tempAst); + optimizedAst = ShaderAst::EliminateUnusedPass(*tempAst, eliminateUnunsedConfig); targetAst = optimizedAst.get(); } From 0fe7f6b899de91495b9e34fbdd7ce7b595178915 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Sun, 27 Feb 2022 18:43:02 +0100 Subject: [PATCH 5/6] Shader/EliminateUnusedPassVisitor: Fix function call --- .../Shader/Ast/EliminateUnusedPassVisitor.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Nazara/Shader/Ast/EliminateUnusedPassVisitor.cpp b/src/Nazara/Shader/Ast/EliminateUnusedPassVisitor.cpp index 95afe355d..8d5f9e913 100644 --- a/src/Nazara/Shader/Ast/EliminateUnusedPassVisitor.cpp +++ b/src/Nazara/Shader/Ast/EliminateUnusedPassVisitor.cpp @@ -61,14 +61,24 @@ namespace Nz::ShaderAst void Visit(CallFunctionExpression& node) override { - const auto& targetFuncType = GetExpressionType(node); + const auto& targetFuncType = GetExpressionType(*node.targetFunction); assert(std::holds_alternative(targetFuncType)); const auto& funcType = std::get(targetFuncType); assert(currentFunctionIndex); - UsageSet& usageSet = Retrieve(functionUsages, *currentFunctionIndex); - usageSet.usedFunctions.UnboundedSet(funcType.funcIndex); + if (currentVariableDeclIndex) + { + UsageSet& usageSet = Retrieve(variableUsages, *currentVariableDeclIndex); + usageSet.usedFunctions.UnboundedSet(funcType.funcIndex); + } + else + { + UsageSet& usageSet = Retrieve(functionUsages, *currentFunctionIndex); + usageSet.usedFunctions.UnboundedSet(funcType.funcIndex); + } + + AstRecursiveVisitor::Visit(node); } void Visit(DeclareExternalStatement& node) override From 6ee3899400dd0cf7ccfc2f3ecf855cdae374bc2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Sun, 27 Feb 2022 18:43:38 +0100 Subject: [PATCH 6/6] Shader/SanitizeVisitor: Fix variable shadowing --- src/Nazara/Shader/Ast/SanitizeVisitor.cpp | 40 +++++++++++++++-------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/Nazara/Shader/Ast/SanitizeVisitor.cpp b/src/Nazara/Shader/Ast/SanitizeVisitor.cpp index e4fb16e56..4d67f5461 100644 --- a/src/Nazara/Shader/Ast/SanitizeVisitor.cpp +++ b/src/Nazara/Shader/Ast/SanitizeVisitor.cpp @@ -2271,23 +2271,35 @@ namespace Nz::ShaderAst TypeMustMatch(resolvedType, GetExpressionType(*node.initialExpression)); } - if (m_context->options.makeVariableNameUnique && FindIdentifier(node.varName) != nullptr) - { - // Try to make variable name unique by appending _X to its name (incrementing X until it's unique) to the variable name until by incrementing X - unsigned int cloneIndex = 2; - std::string candidateName; - do - { - candidateName = node.varName + "_" + std::to_string(cloneIndex++); - } - while (FindIdentifier(candidateName) != nullptr); - - node.varName = std::move(candidateName); - } - node.varIndex = RegisterVariable(node.varName, resolvedType); node.varType = std::move(resolvedType); + if (m_context->options.makeVariableNameUnique) + { + // Since we are registered, FindIdentifier will find us + auto IgnoreOurself = [varIndex = *node.varIndex](const Identifier& identifier) + { + if (identifier.type == Identifier::Type::Variable && identifier.index == varIndex) + return false; + + return true; + }; + + if (FindIdentifier(node.varName, IgnoreOurself) != nullptr) + { + // Try to make variable name unique by appending _X to its name (incrementing X until it's unique) to the variable name until by incrementing X + unsigned int cloneIndex = 2; + std::string candidateName; + do + { + candidateName = node.varName + "_" + std::to_string(cloneIndex++); + } + while (FindIdentifier(candidateName, IgnoreOurself) != nullptr); + + node.varName = std::move(candidateName); + } + } + SanitizeIdentifier(node.varName); }