diff --git a/examples/DeferredShading/main.cpp b/examples/DeferredShading/main.cpp index 00f6fdc16..b575d1c28 100644 --- a/examples/DeferredShading/main.cpp +++ b/examples/DeferredShading/main.cpp @@ -234,7 +234,6 @@ int main() Nz::WorldInstance planeInstance; Nz::RenderWindowImpl* windowImpl = window.GetImpl(); - std::shared_ptr commandPool = windowImpl->CreateCommandPool(Nz::QueueType::Graphics); Nz::RenderPipelineLayoutInfo lightingPipelineLayoutInfo; @@ -629,18 +628,22 @@ int main() return (matUpdate) ? Nz::FramePassExecution::UpdateAndExecute : Nz::FramePassExecution::Execute; }); - gbufferPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder) + gbufferPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) { - builder.SetScissor(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); - builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); + builder.SetScissor(renderArea); + builder.SetViewport(renderArea); - builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); + builder.BindShaderBinding(Nz::Graphics::ViewerBindingSet, viewerInstance.GetShaderBinding()); - spaceshipModel.Draw(builder, modelInstance1); - spaceshipModel.Draw(builder, modelInstance2); + builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, modelInstance1.GetShaderBinding()); + spaceshipModel.Draw(builder); + + builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, modelInstance2.GetShaderBinding()); + spaceshipModel.Draw(builder); // Plane - planeModel.Draw(builder, planeInstance); + builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, planeInstance.GetShaderBinding()); + planeModel.Draw(builder); }); Nz::FramePass& lightingPass = graph.AddPass("Lighting pass"); @@ -649,10 +652,10 @@ int main() return (lightUpdate) ? Nz::FramePassExecution::UpdateAndExecute : Nz::FramePassExecution::Execute; }); - lightingPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder) + lightingPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) { - builder.SetScissor(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); - builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); + builder.SetScissor(renderArea); + builder.SetViewport(renderArea); //builder.BindVertexBuffer(0, vertexBuffer.get()); builder.BindIndexBuffer(coneMeshGfx->GetIndexBuffer(0).get()); @@ -682,10 +685,10 @@ int main() lightingPass.SetDepthStencilOutput(depthBuffer); Nz::FramePass& forwardPass = graph.AddPass("Forward pass"); - forwardPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder) + forwardPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) { - builder.SetScissor(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); - builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); + builder.SetScissor(renderArea); + builder.SetViewport(renderArea); builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(1, *skyboxShaderBinding); @@ -707,10 +710,10 @@ int main() forwardPass.SetDepthStencilOutput(depthBuffer); Nz::FramePass& bloomBrightPass = graph.AddPass("Bloom pass - extract bright pixels"); - bloomBrightPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder) + bloomBrightPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) { - builder.SetScissor(Nz::Recti{ 0, 0, int(offscreenWidth) / 10, int(offscreenHeight) / 10 }); - builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth) / 10, int(offscreenHeight) / 10 }); + builder.SetScissor(renderArea); + builder.SetViewport(renderArea); builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(1, *bloomBrightShaderBinding); @@ -729,10 +732,10 @@ int main() bloomBrightPass.AddOutput(bloomTextureA); Nz::FramePass& bloomBlurPass = graph.AddPass("Bloom pass - gaussian blur"); - bloomBlurPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder) + bloomBlurPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) { - builder.SetScissor(Nz::Recti{ 0, 0, int(offscreenWidth) / 10, int(offscreenHeight) / 10 }); - builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth) / 10, int(offscreenHeight) / 10 }); + builder.SetScissor(renderArea); + builder.SetViewport(renderArea); builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(1, *gaussianBlurShaderBinding); @@ -750,10 +753,10 @@ int main() bloomBlurPass.AddOutput(bloomTextureB); Nz::FramePass& bloomBlendPass = graph.AddPass("Bloom pass - blend"); - bloomBlendPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder) + bloomBlendPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea) { - builder.SetScissor(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); - builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); + builder.SetScissor(renderArea); + builder.SetViewport(renderArea); builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(1, *bloomBlendShaderBinding); @@ -877,37 +880,6 @@ int main() }); - Nz::CommandBufferPtr drawCommandBuffer; - auto RebuildCommandBuffer = [&] - { - Nz::Vector2ui windowSize = window.GetSize(); - - drawCommandBuffer = commandPool->BuildCommandBuffer([&](Nz::CommandBufferBuilder& builder) - { - Nz::Recti windowRenderRect(0, 0, window.GetSize().x, window.GetSize().y); - - builder.TextureBarrier(Nz::PipelineStage::ColorOutput, Nz::PipelineStage::FragmentShader, Nz::MemoryAccess::ColorWrite, Nz::MemoryAccess::ShaderRead, Nz::TextureLayout::ColorOutput, Nz::TextureLayout::ColorInput, *bakedGraph.GetAttachmentTexture(backbuffer)); - - builder.BeginDebugRegion("Main window rendering", Nz::Color::Green); - { - builder.BeginRenderPass(windowImpl->GetFramebuffer(), windowImpl->GetRenderPass(), windowRenderRect); - { - builder.SetScissor(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); - builder.SetViewport(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); - - builder.BindShaderBinding(0, *finalBlitBinding); - builder.BindPipeline(*fullscreenPipeline); - builder.BindVertexBuffer(0, fullscreenVertexBuffer.get()); - builder.Draw(3); - } - builder.EndRenderPass(); - } - builder.EndDebugRegion(); - }); - }; - RebuildCommandBuffer(); - - Nz::Vector3f viewerPos = Nz::Vector3f::Backward() * 10.f + Nz::Vector3f::Up() * 3.f; Nz::EulerAnglesf camAngles(-30.f, 0.f, 0.f); @@ -1049,12 +1021,6 @@ int main() if (!frame) continue; - if (frame.IsFramebufferInvalidated()) - { - frame.PushForRelease(std::move(drawCommandBuffer)); - RebuildCommandBuffer(); - } - Nz::UploadPool& uploadPool = frame.GetUploadPool(); frame.Execute([&](Nz::CommandBufferBuilder& builder) @@ -1108,7 +1074,29 @@ int main() }, Nz::QueueType::Transfer); bakedGraph.Execute(frame); - frame.SubmitCommandBuffer(drawCommandBuffer.get(), Nz::QueueType::Graphics); + + frame.Execute([&](Nz::CommandBufferBuilder& builder) + { + Nz::Recti windowRenderRect(0, 0, window.GetSize().x, window.GetSize().y); + + builder.TextureBarrier(Nz::PipelineStage::ColorOutput, Nz::PipelineStage::FragmentShader, Nz::MemoryAccess::ColorWrite, Nz::MemoryAccess::ShaderRead, Nz::TextureLayout::ColorOutput, Nz::TextureLayout::ColorInput, *bakedGraph.GetAttachmentTexture(backbuffer)); + + builder.BeginDebugRegion("Main window rendering", Nz::Color::Green); + { + builder.BeginRenderPass(windowImpl->GetFramebuffer(frame.GetFramebufferIndex()), windowImpl->GetRenderPass(), windowRenderRect); + { + builder.SetScissor(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); + builder.SetViewport(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); + + builder.BindShaderBinding(0, *finalBlitBinding); + builder.BindPipeline(*fullscreenPipeline); + builder.BindVertexBuffer(0, fullscreenVertexBuffer.get()); + builder.Draw(3); + } + builder.EndRenderPass(); + } + builder.EndDebugRegion(); + }, Nz::QueueType::Graphics); frame.Present(); diff --git a/examples/GraphicsTest/main.cpp b/examples/GraphicsTest/main.cpp index 38f5330a4..6b7d81893 100644 --- a/examples/GraphicsTest/main.cpp +++ b/examples/GraphicsTest/main.cpp @@ -30,7 +30,7 @@ int main() meshParams.center = true; meshParams.storage = Nz::DataStorage::Software; meshParams.matrix = Nz::Matrix4f::Rotate(Nz::EulerAnglesf(0.f, -90.f, 0.f)) * Nz::Matrix4f::Scale(Nz::Vector3f(0.002f)); - meshParams.vertexDeclaration = Nz::VertexDeclaration::Get(Nz::VertexLayout::XYZ_Normal_UV); + meshParams.vertexDeclaration = Nz::VertexDeclaration::Get(Nz::VertexLayout::XYZ_UV); std::shared_ptr device = Nz::Graphics::Instance()->GetRenderDevice(); @@ -88,50 +88,6 @@ int main() modelInstance2.UpdateWorldMatrix(Nz::Matrix4f::Translate(Nz::Vector3f::Forward() * 2 + Nz::Vector3f::Right())); Nz::RenderWindowImpl* windowImpl = window.GetImpl(); - std::shared_ptr commandPool = windowImpl->CreateCommandPool(Nz::QueueType::Graphics); - - Nz::CommandBufferPtr drawCommandBuffer; - auto RebuildCommandBuffer = [&] - { - Nz::Vector2ui windowSize = window.GetSize(); - drawCommandBuffer = commandPool->BuildCommandBuffer([&](Nz::CommandBufferBuilder& builder) - { - Nz::Recti renderRect(0, 0, window.GetSize().x, window.GetSize().y); - - Nz::CommandBufferBuilder::ClearValues clearValues[2]; - clearValues[0].color = Nz::Color::Black; - clearValues[1].depth = 1.f; - clearValues[1].stencil = 0; - - builder.BeginDebugRegion("Main window rendering", Nz::Color::Green); - { - builder.BeginRenderPass(windowImpl->GetFramebuffer(), windowImpl->GetRenderPass(), renderRect, { clearValues[0], clearValues[1] }); - { - builder.SetScissor(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); - builder.SetViewport(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); - builder.BindShaderBinding(Nz::Graphics::ViewerBindingSet, viewerInstance.GetShaderBinding()); - - for (Nz::WorldInstance& instance : { std::ref(modelInstance), std::ref(modelInstance2) }) - { - builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, instance.GetShaderBinding()); - - for (std::size_t i = 0; i < model.GetSubMeshCount(); ++i) - { - builder.BindIndexBuffer(model.GetIndexBuffer(i).get()); - builder.BindVertexBuffer(0, model.GetVertexBuffer(i).get()); - builder.BindPipeline(*model.GetRenderPipeline(i)); - builder.BindShaderBinding(Nz::Graphics::MaterialBindingSet, model.GetMaterial(i)->GetShaderBinding()); - - builder.DrawIndexed(model.GetIndexCount(i)); - } - } - } - builder.EndRenderPass(); - } - builder.EndDebugRegion(); - }); - }; - Nz::Vector3f viewerPos = Nz::Vector3f::Zero(); @@ -250,13 +206,42 @@ int main() builder.EndDebugRegion(); }, Nz::QueueType::Transfer); - if (updateMat || frame.IsFramebufferInvalidated()) + frame.Execute([&](Nz::CommandBufferBuilder& builder) { - frame.PushForRelease(std::move(drawCommandBuffer)); - RebuildCommandBuffer(); - } + Nz::Recti renderRect(0, 0, window.GetSize().x, window.GetSize().y); - frame.SubmitCommandBuffer(drawCommandBuffer.get(), Nz::QueueType::Graphics); + Nz::CommandBufferBuilder::ClearValues clearValues[2]; + clearValues[0].color = Nz::Color::Black; + clearValues[1].depth = 1.f; + clearValues[1].stencil = 0; + + builder.BeginDebugRegion("Main window rendering", Nz::Color::Green); + { + builder.BeginRenderPass(windowImpl->GetFramebuffer(frame.GetFramebufferIndex()), windowImpl->GetRenderPass(), renderRect, { clearValues[0], clearValues[1] }); + { + builder.SetScissor(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); + builder.SetViewport(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); + builder.BindShaderBinding(Nz::Graphics::ViewerBindingSet, viewerInstance.GetShaderBinding()); + + for (Nz::WorldInstance& instance : { std::ref(modelInstance), std::ref(modelInstance2) }) + { + builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, instance.GetShaderBinding()); + + for (std::size_t i = 0; i < model.GetSubMeshCount(); ++i) + { + builder.BindIndexBuffer(model.GetIndexBuffer(i).get()); + builder.BindVertexBuffer(0, model.GetVertexBuffer(i).get()); + builder.BindPipeline(*model.GetRenderPipeline(i)); + builder.BindShaderBinding(Nz::Graphics::MaterialBindingSet, model.GetMaterial(i)->GetShaderBinding()); + + builder.DrawIndexed(model.GetIndexCount(i)); + } + } + } + builder.EndRenderPass(); + } + builder.EndDebugRegion(); + }, Nz::QueueType::Graphics); frame.Present(); diff --git a/examples/RenderTest/main.cpp b/examples/RenderTest/main.cpp index f8da8f408..77fe25490 100644 --- a/examples/RenderTest/main.cpp +++ b/examples/RenderTest/main.cpp @@ -240,43 +240,6 @@ int main() Nz::AbstractBuffer* indexBufferImpl = renderBufferIB->GetHardwareBuffer(renderDevice); Nz::AbstractBuffer* vertexBufferImpl = renderBufferVB->GetHardwareBuffer(renderDevice); - Nz::CommandBufferPtr drawCommandBuffer; - auto RebuildCommandBuffer = [&] - { - Nz::Vector2ui windowSize = window.GetSize(); - - drawCommandBuffer = commandPool->BuildCommandBuffer([&](Nz::CommandBufferBuilder& builder) - { - Nz::Recti renderRect(0, 0, window.GetSize().x, window.GetSize().y); - - Nz::CommandBufferBuilder::ClearValues clearValues[2]; - clearValues[0].color = Nz::Color::Black; - clearValues[1].depth = 1.f; - clearValues[1].stencil = 0; - - builder.BeginDebugRegion("Main window rendering", Nz::Color::Green); - { - builder.BeginRenderPass(windowImpl->GetFramebuffer(), windowImpl->GetRenderPass(), renderRect, { clearValues[0], clearValues[1] }); - { - builder.BindIndexBuffer(indexBufferImpl); - builder.BindPipeline(*pipeline); - builder.BindVertexBuffer(0, vertexBufferImpl); - builder.BindShaderBinding(0, *viewerShaderBinding); - builder.BindShaderBinding(1, *textureShaderBinding); - - builder.SetScissor(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); - builder.SetViewport(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); - - builder.DrawIndexed(meshIB->GetIndexCount()); - } - builder.EndRenderPass(); - } - builder.EndDebugRegion(); - }); - }; - RebuildCommandBuffer(); - - Nz::Vector3f viewerPos = Nz::Vector3f::Zero(); Nz::EulerAnglesf camAngles(0.f, 0.f, 0.f); @@ -368,12 +331,6 @@ int main() if (!frame) continue; - if (frame.IsFramebufferInvalidated()) - { - frame.PushForRelease(std::move(drawCommandBuffer)); - RebuildCommandBuffer(); - } - ubo.viewMatrix = Nz::Matrix4f::ViewMatrix(viewerPos, camAngles); if (uboUpdate) @@ -396,7 +353,35 @@ int main() uboUpdate = false; } - frame.SubmitCommandBuffer(drawCommandBuffer.get(), Nz::QueueType::Graphics); + frame.Execute([&](Nz::CommandBufferBuilder& builder) + { + Nz::Recti renderRect(0, 0, window.GetSize().x, window.GetSize().y); + + Nz::CommandBufferBuilder::ClearValues clearValues[2]; + clearValues[0].color = Nz::Color::Black; + clearValues[1].depth = 1.f; + clearValues[1].stencil = 0; + + builder.BeginDebugRegion("Main window rendering", Nz::Color::Green); + { + builder.BeginRenderPass(windowImpl->GetFramebuffer(frame.GetFramebufferIndex()), windowImpl->GetRenderPass(), renderRect, { clearValues[0], clearValues[1] }); + { + builder.BindIndexBuffer(indexBufferImpl); + builder.BindPipeline(*pipeline); + builder.BindVertexBuffer(0, vertexBufferImpl); + builder.BindShaderBinding(0, *viewerShaderBinding); + builder.BindShaderBinding(1, *textureShaderBinding); + + builder.SetScissor(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); + builder.SetViewport(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); + + builder.DrawIndexed(meshIB->GetIndexCount()); + } + builder.EndRenderPass(); + } + builder.EndDebugRegion(); + + }, Nz::QueueType::Graphics); frame.Present(); diff --git a/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.hpp b/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.hpp index e5354471c..504cfa292 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.hpp @@ -35,7 +35,7 @@ namespace Nz OpenGLCommandBuffer(OpenGLCommandBuffer&&) = delete; ~OpenGLCommandBuffer() = default; - inline void BeginDebugRegion(const std::string_view& regionName, const Nz::Color& color); + inline void BeginDebugRegion(const std::string_view& regionName, const Color& color); inline void BindIndexBuffer(GLuint indexBuffer, UInt64 offset = 0); inline void BindPipeline(const OpenGLRenderPipeline* pipeline); @@ -57,8 +57,8 @@ namespace Nz inline const OpenGLCommandPool& GetOwner() const; inline void SetFramebuffer(const OpenGLFramebuffer& framebuffer, const OpenGLRenderPass& renderPass, const CommandBufferBuilder::ClearValues* clearValues, std::size_t clearValueCount); - inline void SetScissor(Nz::Recti scissorRegion); - inline void SetViewport(Nz::Recti viewportRegion); + inline void SetScissor(const Recti& scissorRegion); + inline void SetViewport(const Recti& viewportRegion); OpenGLCommandBuffer& operator=(const OpenGLCommandBuffer&) = delete; OpenGLCommandBuffer& operator=(OpenGLCommandBuffer&&) = delete; @@ -72,7 +72,7 @@ namespace Nz struct BeginDebugRegionData { std::string regionName; - Nz::Color color; + Color color; }; struct CopyBufferData diff --git a/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.inl b/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.inl index 83613e960..d0f26f57e 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.inl +++ b/include/Nazara/OpenGLRenderer/OpenGLCommandBuffer.inl @@ -151,15 +151,15 @@ namespace Nz m_commands.emplace_back(std::move(setFramebuffer)); - m_currentStates.shouldFlipY = (framebuffer.GetType() == OpenGLFramebuffer::Type::Window); + m_currentStates.shouldFlipY = (framebuffer.GetType() == FramebufferType::Window); } - inline void OpenGLCommandBuffer::SetScissor(Nz::Recti scissorRegion) + inline void OpenGLCommandBuffer::SetScissor(const Recti& scissorRegion) { m_currentStates.scissorRegion = scissorRegion; } - inline void OpenGLCommandBuffer::SetViewport(Nz::Recti viewportRegion) + inline void OpenGLCommandBuffer::SetViewport(const Recti& viewportRegion) { m_currentStates.viewportRegion = viewportRegion; } diff --git a/include/Nazara/OpenGLRenderer/OpenGLCommandBufferBuilder.hpp b/include/Nazara/OpenGLRenderer/OpenGLCommandBufferBuilder.hpp index 697ee0397..858c66f3f 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLCommandBufferBuilder.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLCommandBufferBuilder.hpp @@ -24,7 +24,7 @@ namespace Nz ~OpenGLCommandBufferBuilder() = default; void BeginDebugRegion(const std::string_view& regionName, const Nz::Color& color) override; - void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti renderRect, const ClearValues* clearValues, std::size_t clearValueCount) override; + void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& renderRect, const ClearValues* clearValues, std::size_t clearValueCount) override; void BindIndexBuffer(AbstractBuffer* indexBuffer, UInt64 offset = 0) override; void BindPipeline(const RenderPipeline& pipeline) override; @@ -46,8 +46,8 @@ namespace Nz void PreTransferBarrier() override; void PostTransferBarrier() override; - void SetScissor(Nz::Recti scissorRegion) override; - void SetViewport(Nz::Recti viewportRegion) override; + void SetScissor(const Recti& scissorRegion) override; + void SetViewport(const Recti& viewportRegion) override; void TextureBarrier(PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, MemoryAccessFlags srcAccessMask, MemoryAccessFlags dstAccessMask, TextureLayout oldLayout, TextureLayout newLayout, const Texture& texture) override; diff --git a/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp b/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp index 01a62fd89..1c227358c 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp @@ -34,7 +34,8 @@ namespace Nz std::shared_ptr CreateCommandPool(QueueType queueType) override; inline GL::Context& GetContext(); - const OpenGLFramebuffer& GetFramebuffer() const override; + const OpenGLFramebuffer& GetFramebuffer(std::size_t i) const override; + std::size_t GetFramebufferCount() const override; const OpenGLRenderPass& GetRenderPass() const override; void Present(); diff --git a/include/Nazara/Renderer/CommandBufferBuilder.hpp b/include/Nazara/Renderer/CommandBufferBuilder.hpp index 0dc7615da..d719bc95a 100644 --- a/include/Nazara/Renderer/CommandBufferBuilder.hpp +++ b/include/Nazara/Renderer/CommandBufferBuilder.hpp @@ -35,16 +35,16 @@ namespace Nz CommandBufferBuilder(CommandBufferBuilder&&) = default; virtual ~CommandBufferBuilder(); - virtual void BeginDebugRegion(const std::string_view& regionName, const Nz::Color& color) = 0; - virtual void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti renderRect, const ClearValues* clearValues, std::size_t clearValueCount) = 0; - inline void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti renderRect); - inline void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti renderRect, std::initializer_list clearValues); + virtual void BeginDebugRegion(const std::string_view& regionName, const Color& color) = 0; + virtual void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& renderRect, const ClearValues* clearValues, std::size_t clearValueCount) = 0; + inline void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& renderRect); + inline void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& renderRect, std::initializer_list clearValues); - virtual void BindIndexBuffer(Nz::AbstractBuffer* indexBuffer, UInt64 offset = 0) = 0; + virtual void BindIndexBuffer(AbstractBuffer* indexBuffer, UInt64 offset = 0) = 0; virtual void BindPipeline(const RenderPipeline& pipeline) = 0; virtual void BindShaderBinding(UInt32 set, const ShaderBinding& binding) = 0; virtual void BindShaderBinding(const RenderPipelineLayout& pipelineLayout, UInt32 set, const ShaderBinding& binding) = 0; - virtual void BindVertexBuffer(UInt32 binding, Nz::AbstractBuffer* vertexBuffer, UInt64 offset = 0) = 0; + virtual void BindVertexBuffer(UInt32 binding, AbstractBuffer* vertexBuffer, UInt64 offset = 0) = 0; inline void CopyBuffer(const RenderBufferView& source, const RenderBufferView& target); virtual void CopyBuffer(const RenderBufferView& source, const RenderBufferView& target, UInt64 size, UInt64 fromOffset = 0, UInt64 toOffset = 0) = 0; @@ -62,8 +62,8 @@ namespace Nz virtual void PreTransferBarrier() = 0; virtual void PostTransferBarrier() = 0; - virtual void SetScissor(Nz::Recti scissorRegion) = 0; - virtual void SetViewport(Nz::Recti viewportRegion) = 0; + virtual void SetScissor(const Recti& scissorRegion) = 0; + virtual void SetViewport(const Recti& viewportRegion) = 0; virtual void TextureBarrier(PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, MemoryAccessFlags srcAccessMask, MemoryAccessFlags dstAccessMask, TextureLayout oldLayout, TextureLayout newLayout, const Texture& texture) = 0; @@ -72,7 +72,7 @@ namespace Nz struct ClearValues { - Nz::Color color = Nz::Color::Black; + Color color = Color::Black; float depth = 1.f; UInt32 stencil = 0; }; diff --git a/include/Nazara/Renderer/CommandBufferBuilder.inl b/include/Nazara/Renderer/CommandBufferBuilder.inl index ad156b4ce..28aff2817 100644 --- a/include/Nazara/Renderer/CommandBufferBuilder.inl +++ b/include/Nazara/Renderer/CommandBufferBuilder.inl @@ -7,12 +7,12 @@ namespace Nz { - inline void CommandBufferBuilder::BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti renderRect) + inline void CommandBufferBuilder::BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& renderRect) { return BeginRenderPass(framebuffer, renderPass, renderRect, nullptr, 0); } - inline void CommandBufferBuilder::BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti renderRect, std::initializer_list clearValues) + inline void CommandBufferBuilder::BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& renderRect, std::initializer_list clearValues) { return BeginRenderPass(framebuffer, renderPass, renderRect, clearValues.begin(), clearValues.size()); } diff --git a/include/Nazara/Renderer/RenderFrame.hpp b/include/Nazara/Renderer/RenderFrame.hpp index effc367ec..572fe0a7f 100644 --- a/include/Nazara/Renderer/RenderFrame.hpp +++ b/include/Nazara/Renderer/RenderFrame.hpp @@ -8,6 +8,7 @@ #define NAZARA_RENDERFRAME_HPP #include +#include #include #include #include @@ -23,13 +24,15 @@ namespace Nz { public: inline explicit RenderFrame(); - inline explicit RenderFrame(RenderImage* renderImage, bool framebufferInvalidation); + inline explicit RenderFrame(RenderImage* renderImage, bool framebufferInvalidation, const Vector2ui& size, std::size_t framebufferIndex); RenderFrame(const RenderFrame&) = delete; RenderFrame(RenderFrame&&) = delete; ~RenderFrame() = default; void Execute(const std::function& callback, QueueTypeFlags queueTypeFlags); + inline std::size_t GetFramebufferIndex() const; + const Vector2ui& GetSize() const; UploadPool& GetUploadPool(); inline bool IsFramebufferInvalidated() const; @@ -47,7 +50,9 @@ namespace Nz RenderFrame& operator=(RenderFrame&&) = delete; private: + std::size_t m_framebufferIndex; RenderImage* m_image; + Vector2ui m_size; bool m_framebufferInvalidation; }; } diff --git a/include/Nazara/Renderer/RenderFrame.inl b/include/Nazara/Renderer/RenderFrame.inl index 9a04e1981..e361a0277 100644 --- a/include/Nazara/Renderer/RenderFrame.inl +++ b/include/Nazara/Renderer/RenderFrame.inl @@ -8,16 +8,28 @@ namespace Nz { inline RenderFrame::RenderFrame() : - RenderFrame(nullptr, false) + RenderFrame(nullptr, false, Vector2ui::Zero(), 0) { } - inline RenderFrame::RenderFrame(RenderImage* renderImage, bool framebufferInvalidation) : + inline RenderFrame::RenderFrame(RenderImage* renderImage, bool framebufferInvalidation, const Vector2ui& size, std::size_t framebufferIndex) : + m_framebufferIndex(framebufferIndex), m_image(renderImage), + m_size(size), m_framebufferInvalidation(framebufferInvalidation) { } + inline std::size_t RenderFrame::GetFramebufferIndex() const + { + return m_framebufferIndex; + } + + inline const Vector2ui& RenderFrame::GetSize() const + { + return m_size; + } + inline bool RenderFrame::IsFramebufferInvalidated() const { return m_framebufferInvalidation; @@ -45,3 +57,4 @@ namespace Nz } #include +#include "RenderFrame.hpp" diff --git a/include/Nazara/Renderer/RenderTarget.hpp b/include/Nazara/Renderer/RenderTarget.hpp new file mode 100644 index 000000000..84bc68612 --- /dev/null +++ b/include/Nazara/Renderer/RenderTarget.hpp @@ -0,0 +1,32 @@ +// Copyright (C) 2020 Jérôme Leclercq +// This file is part of the "Nazara Engine - Renderer module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_RENDERTARGET_HPP +#define NAZARA_RENDERTARGET_HPP + +#include +#include + +namespace Nz +{ + class Framebuffer; + class RenderPass; + + class NAZARA_RENDERER_API RenderTarget + { + public: + RenderTarget() = default; + virtual ~RenderTarget(); + + virtual const Framebuffer& GetFramebuffer(std::size_t i) const = 0; + virtual std::size_t GetFramebufferCount() const = 0; + virtual const RenderPass& GetRenderPass() const = 0; + }; +} + +#include + +#endif diff --git a/include/Nazara/Renderer/RenderTarget.inl b/include/Nazara/Renderer/RenderTarget.inl new file mode 100644 index 000000000..e7e510245 --- /dev/null +++ b/include/Nazara/Renderer/RenderTarget.inl @@ -0,0 +1,12 @@ +// Copyright (C) 2020 Jérôme Leclercq +// This file is part of the "Nazara Engine - Renderer module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ +} + +#include diff --git a/include/Nazara/Renderer/RenderWindowImpl.hpp b/include/Nazara/Renderer/RenderWindowImpl.hpp index 2ef81f2f5..a1898ddc0 100644 --- a/include/Nazara/Renderer/RenderWindowImpl.hpp +++ b/include/Nazara/Renderer/RenderWindowImpl.hpp @@ -14,18 +14,18 @@ #include #include #include +#include #include #include namespace Nz { class CommandPool; - class Framebuffer; class RendererImpl; class RenderDevice; class RenderSurface; - class NAZARA_RENDERER_API RenderWindowImpl + class NAZARA_RENDERER_API RenderWindowImpl : public RenderTarget { public: RenderWindowImpl() = default; @@ -36,9 +36,6 @@ namespace Nz virtual bool Create(RendererImpl* renderer, RenderSurface* surface, const RenderWindowParameters& parameters) = 0; virtual std::shared_ptr CreateCommandPool(QueueType queueType) = 0; - virtual const Framebuffer& GetFramebuffer() const = 0; - virtual const RenderPass& GetRenderPass() const = 0; - protected: static void BuildRenderPass(PixelFormat colorFormat, PixelFormat depthFormat, std::vector& attachments, std::vector& subpassDescriptions, std::vector& subpassDependencies); }; diff --git a/include/Nazara/VulkanRenderer.hpp b/include/Nazara/VulkanRenderer.hpp index bc1bf2c0e..ff8c26be1 100644 --- a/include/Nazara/VulkanRenderer.hpp +++ b/include/Nazara/VulkanRenderer.hpp @@ -41,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -49,10 +48,11 @@ #include #include #include -#include #include #include +#include #include #include +#include #endif // NAZARA_GLOBAL_VULKANRENDERER_HPP diff --git a/include/Nazara/VulkanRenderer/VkRenderWindow.hpp b/include/Nazara/VulkanRenderer/VkRenderWindow.hpp index 72aa5dbc4..afd042404 100644 --- a/include/Nazara/VulkanRenderer/VkRenderWindow.hpp +++ b/include/Nazara/VulkanRenderer/VkRenderWindow.hpp @@ -48,7 +48,8 @@ namespace Nz std::shared_ptr CreateCommandPool(QueueType queueType) override; - inline const VulkanWindowFramebuffer& GetFramebuffer() const override; + const VulkanWindowFramebuffer& GetFramebuffer(std::size_t i) const override; + std::size_t GetFramebufferCount() const override; inline VulkanDevice& GetDevice(); inline const VulkanDevice& GetDevice() const; inline Vk::QueueHandle& GetGraphicsQueue(); @@ -67,10 +68,10 @@ namespace Nz bool SetupRenderPass(); bool SetupSwapchain(const Vk::PhysicalDevice& deviceInfo, Vk::Surface& surface, const Vector2ui& size); - std::optional m_framebuffer; std::optional m_renderPass; std::shared_ptr m_device; std::size_t m_currentFrame; + std::vector m_framebuffers; std::vector m_inflightFences; std::vector> m_concurrentImageData; Vk::DeviceMemory m_depthBufferMemory; diff --git a/include/Nazara/VulkanRenderer/VkRenderWindow.inl b/include/Nazara/VulkanRenderer/VkRenderWindow.inl index e77143cf0..90388c518 100644 --- a/include/Nazara/VulkanRenderer/VkRenderWindow.inl +++ b/include/Nazara/VulkanRenderer/VkRenderWindow.inl @@ -7,11 +7,6 @@ namespace Nz { - inline const VulkanWindowFramebuffer& VkRenderWindow::GetFramebuffer() const - { - return *m_framebuffer; - } - inline VulkanDevice& VkRenderWindow::GetDevice() { return *m_device; diff --git a/include/Nazara/VulkanRenderer/VulkanCommandBuffer.hpp b/include/Nazara/VulkanRenderer/VulkanCommandBuffer.hpp index dd01bbeb3..81f7b8377 100644 --- a/include/Nazara/VulkanRenderer/VulkanCommandBuffer.hpp +++ b/include/Nazara/VulkanRenderer/VulkanCommandBuffer.hpp @@ -21,13 +21,12 @@ namespace Nz { public: inline VulkanCommandBuffer(VulkanCommandPool& owner, std::size_t poolIndex, std::size_t bindingIndex, Vk::AutoCommandBuffer commandBuffer); - inline VulkanCommandBuffer(VulkanCommandPool& owner, std::size_t poolIndex, std::size_t bindingIndex, std::vector commandBuffers); VulkanCommandBuffer(const VulkanCommandBuffer&) = delete; VulkanCommandBuffer(VulkanCommandBuffer&&) = delete; ~VulkanCommandBuffer() = default; inline std::size_t GetBindingIndex() const; - inline Vk::CommandBuffer& GetCommandBuffer(std::size_t imageIndex = 0); + inline const Vk::CommandBuffer& GetCommandBuffer() const; inline std::size_t GetPoolIndex() const; inline const VulkanCommandPool& GetOwner() const; @@ -41,7 +40,7 @@ namespace Nz std::size_t m_bindingIndex; std::size_t m_poolIndex; - std::vector m_commandBuffers; + Vk::AutoCommandBuffer m_commandBuffer; VulkanCommandPool& m_owner; }; } diff --git a/include/Nazara/VulkanRenderer/VulkanCommandBuffer.inl b/include/Nazara/VulkanRenderer/VulkanCommandBuffer.inl index 16397ccc3..aecf402ba 100644 --- a/include/Nazara/VulkanRenderer/VulkanCommandBuffer.inl +++ b/include/Nazara/VulkanRenderer/VulkanCommandBuffer.inl @@ -8,15 +8,11 @@ namespace Nz { inline VulkanCommandBuffer::VulkanCommandBuffer(VulkanCommandPool& owner, std::size_t poolIndex, std::size_t bindingIndex, Vk::AutoCommandBuffer commandBuffer) : - VulkanCommandBuffer(owner, poolIndex, bindingIndex) + m_bindingIndex(bindingIndex), + m_poolIndex(poolIndex), + m_commandBuffer(std::move(commandBuffer)), + m_owner(owner) { - m_commandBuffers.push_back(std::move(commandBuffer)); - } - - inline VulkanCommandBuffer::VulkanCommandBuffer(VulkanCommandPool& owner, std::size_t poolIndex, std::size_t bindingIndex, std::vector commandBuffers) : - VulkanCommandBuffer(owner, poolIndex, bindingIndex) - { - m_commandBuffers = std::move(commandBuffers); } inline VulkanCommandBuffer::VulkanCommandBuffer(VulkanCommandPool& owner, std::size_t poolIndex, std::size_t bindingIndex) : @@ -31,13 +27,9 @@ namespace Nz return m_bindingIndex; } - inline Vk::CommandBuffer& VulkanCommandBuffer::GetCommandBuffer(std::size_t imageIndex) + inline const Vk::CommandBuffer& VulkanCommandBuffer::GetCommandBuffer() const { - if (m_commandBuffers.size() == 1) - return m_commandBuffers.front(); - - assert(imageIndex < m_commandBuffers.size()); - return m_commandBuffers[imageIndex].Get(); + return m_commandBuffer; } inline std::size_t VulkanCommandBuffer::GetPoolIndex() const diff --git a/include/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.hpp b/include/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.hpp index f395faf2c..5fc5da01d 100644 --- a/include/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.hpp +++ b/include/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.hpp @@ -19,19 +19,19 @@ namespace Nz class NAZARA_VULKANRENDERER_API VulkanCommandBufferBuilder final : public CommandBufferBuilder { public: - inline VulkanCommandBufferBuilder(Vk::CommandBuffer& commandBuffer, std::size_t imageIndex = 0); + inline VulkanCommandBufferBuilder(Vk::CommandBuffer& commandBuffer); VulkanCommandBufferBuilder(const VulkanCommandBufferBuilder&) = delete; VulkanCommandBufferBuilder(VulkanCommandBufferBuilder&&) noexcept = default; ~VulkanCommandBufferBuilder() = default; - void BeginDebugRegion(const std::string_view& regionName, const Nz::Color& color) override; - void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti renderRect, const ClearValues* clearValues, std::size_t clearValueCount) override; + void BeginDebugRegion(const std::string_view& regionName, const Color& color) override; + void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& renderRect, const ClearValues* clearValues, std::size_t clearValueCount) override; void BindIndexBuffer(AbstractBuffer* indexBuffer, UInt64 offset = 0) override; void BindPipeline(const RenderPipeline& pipeline) override; void BindShaderBinding(UInt32 set, const ShaderBinding& binding) override; void BindShaderBinding(const RenderPipelineLayout& pipelineLayout, UInt32 set, const ShaderBinding& binding) override; - void BindVertexBuffer(UInt32 binding, Nz::AbstractBuffer* vertexBuffer, UInt64 offset = 0) override; + void BindVertexBuffer(UInt32 binding, AbstractBuffer* vertexBuffer, UInt64 offset = 0) override; void CopyBuffer(const RenderBufferView& source, const RenderBufferView& target, UInt64 size, UInt64 sourceOffset = 0, UInt64 targetOffset = 0) override; void CopyBuffer(const UploadPool::Allocation& allocation, const RenderBufferView& target, UInt64 size, UInt64 sourceOffset = 0, UInt64 targetOffset = 0) override; @@ -43,15 +43,14 @@ namespace Nz void EndRenderPass() override; inline Vk::CommandBuffer& GetCommandBuffer(); - inline std::size_t GetMaxFramebufferCount() const; - + void NextSubpass() override; void PreTransferBarrier() override; void PostTransferBarrier() override; - void SetScissor(Nz::Recti scissorRegion) override; - void SetViewport(Nz::Recti viewportRegion) override; + void SetScissor(const Recti& scissorRegion) override; + void SetViewport(const Recti& viewportRegion) override; void TextureBarrier(PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, MemoryAccessFlags srcAccessMask, MemoryAccessFlags dstAccessMask, TextureLayout oldLayout, TextureLayout newLayout, const Texture& texture) override; @@ -62,8 +61,6 @@ namespace Nz Vk::CommandBuffer& m_commandBuffer; const VulkanRenderPass* m_currentRenderPass; std::size_t m_currentSubpassIndex; - std::size_t m_framebufferCount; - std::size_t m_imageIndex; }; } diff --git a/include/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.inl b/include/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.inl index fd5a16870..1d4b865cb 100644 --- a/include/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.inl +++ b/include/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.inl @@ -7,10 +7,8 @@ namespace Nz { - inline VulkanCommandBufferBuilder::VulkanCommandBufferBuilder(Vk::CommandBuffer& commandBuffer, std::size_t imageIndex) : - m_commandBuffer(commandBuffer), - m_framebufferCount(0), - m_imageIndex(imageIndex) + inline VulkanCommandBufferBuilder::VulkanCommandBufferBuilder(Vk::CommandBuffer& commandBuffer) : + m_commandBuffer(commandBuffer) { } @@ -18,11 +16,6 @@ namespace Nz { return m_commandBuffer; } - - inline std::size_t VulkanCommandBufferBuilder::GetMaxFramebufferCount() const - { - return m_framebufferCount; - } } #include diff --git a/include/Nazara/VulkanRenderer/VulkanFramebuffer.hpp b/include/Nazara/VulkanRenderer/VulkanFramebuffer.hpp index ed7d83ce0..ff1bb1ad7 100644 --- a/include/Nazara/VulkanRenderer/VulkanFramebuffer.hpp +++ b/include/Nazara/VulkanRenderer/VulkanFramebuffer.hpp @@ -22,6 +22,8 @@ namespace Nz VulkanFramebuffer(VulkanFramebuffer&&) noexcept = default; ~VulkanFramebuffer() = default; + virtual const Vk::Framebuffer& GetFramebuffer() const = 0; + VulkanFramebuffer& operator=(const VulkanFramebuffer&) = delete; VulkanFramebuffer& operator=(VulkanFramebuffer&&) noexcept = default; }; diff --git a/include/Nazara/VulkanRenderer/VulkanTextureFramebuffer.hpp b/include/Nazara/VulkanRenderer/VulkanTextureFramebuffer.hpp index 40f05d92a..9055f07ad 100644 --- a/include/Nazara/VulkanRenderer/VulkanTextureFramebuffer.hpp +++ b/include/Nazara/VulkanRenderer/VulkanTextureFramebuffer.hpp @@ -23,8 +23,7 @@ namespace Nz VulkanTextureFramebuffer(VulkanTextureFramebuffer&&) = delete; ~VulkanTextureFramebuffer() = default; - inline Vk::Framebuffer& GetFramebuffer(); - inline const Vk::Framebuffer& GetFramebuffer() const; + inline const Vk::Framebuffer& GetFramebuffer() const override; VulkanTextureFramebuffer& operator=(const VulkanTextureFramebuffer&) = delete; VulkanTextureFramebuffer& operator=(VulkanTextureFramebuffer&&) = delete; diff --git a/include/Nazara/VulkanRenderer/VulkanTextureFramebuffer.inl b/include/Nazara/VulkanRenderer/VulkanTextureFramebuffer.inl index f7440118a..43cd71ebe 100644 --- a/include/Nazara/VulkanRenderer/VulkanTextureFramebuffer.inl +++ b/include/Nazara/VulkanRenderer/VulkanTextureFramebuffer.inl @@ -7,11 +7,6 @@ namespace Nz { - inline Vk::Framebuffer& VulkanTextureFramebuffer::GetFramebuffer() - { - return m_framebuffer; - } - inline const Vk::Framebuffer& VulkanTextureFramebuffer::GetFramebuffer() const { return m_framebuffer; diff --git a/include/Nazara/VulkanRenderer/VulkanWindowFramebuffer.hpp b/include/Nazara/VulkanRenderer/VulkanWindowFramebuffer.hpp index 25bc0e9fa..233f3411e 100644 --- a/include/Nazara/VulkanRenderer/VulkanWindowFramebuffer.hpp +++ b/include/Nazara/VulkanRenderer/VulkanWindowFramebuffer.hpp @@ -15,19 +15,18 @@ namespace Nz class NAZARA_VULKANRENDERER_API VulkanWindowFramebuffer final : public VulkanFramebuffer { public: - inline VulkanWindowFramebuffer(Vk::Framebuffer* framebuffers, std::size_t count); + inline VulkanWindowFramebuffer(Vk::Framebuffer framebuffer); VulkanWindowFramebuffer(const VulkanWindowFramebuffer&) = delete; VulkanWindowFramebuffer(VulkanWindowFramebuffer&&) noexcept = default; ~VulkanWindowFramebuffer() = default; - inline const Vk::Framebuffer& GetFramebuffer(std::size_t index) const; - inline std::size_t GetFramebufferCount() const; + inline const Vk::Framebuffer& GetFramebuffer() const override; VulkanWindowFramebuffer& operator=(const VulkanWindowFramebuffer&) = delete; VulkanWindowFramebuffer& operator=(VulkanWindowFramebuffer&&) noexcept = default; private: - std::vector m_framebuffers; + Vk::Framebuffer m_framebuffer; }; } diff --git a/include/Nazara/VulkanRenderer/VulkanWindowFramebuffer.inl b/include/Nazara/VulkanRenderer/VulkanWindowFramebuffer.inl index 842741e7b..f1dafcecb 100644 --- a/include/Nazara/VulkanRenderer/VulkanWindowFramebuffer.inl +++ b/include/Nazara/VulkanRenderer/VulkanWindowFramebuffer.inl @@ -7,23 +7,15 @@ namespace Nz { - inline VulkanWindowFramebuffer::VulkanWindowFramebuffer(Vk::Framebuffer* framebuffers, std::size_t count) : - VulkanFramebuffer(FramebufferType::Window) + inline VulkanWindowFramebuffer::VulkanWindowFramebuffer(Vk::Framebuffer framebuffer) : + VulkanFramebuffer(FramebufferType::Window), + m_framebuffer(std::move(framebuffer)) { - m_framebuffers.reserve(count); - for (std::size_t i = 0; i < count; ++i) - m_framebuffers.push_back(std::move(framebuffers[i])); } - inline const Vk::Framebuffer& Nz::VulkanWindowFramebuffer::GetFramebuffer(std::size_t index) const + inline const Vk::Framebuffer& Nz::VulkanWindowFramebuffer::GetFramebuffer() const { - assert(index < m_framebuffers.size()); - return m_framebuffers[index]; - } - - inline std::size_t VulkanWindowFramebuffer::GetFramebufferCount() const - { - return m_framebuffers.size(); + return m_framebuffer; } } diff --git a/src/Nazara/OpenGLRenderer/OpenGLCommandBufferBuilder.cpp b/src/Nazara/OpenGLRenderer/OpenGLCommandBufferBuilder.cpp index 50efedf60..a50298d1d 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLCommandBufferBuilder.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLCommandBufferBuilder.cpp @@ -19,7 +19,7 @@ namespace Nz m_commandBuffer.BeginDebugRegion(regionName, color); } - void OpenGLCommandBufferBuilder::BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti /*renderRect*/, const ClearValues* clearValues, std::size_t clearValueCount) + void OpenGLCommandBufferBuilder::BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& /*renderRect*/, const ClearValues* clearValues, std::size_t clearValueCount) { m_commandBuffer.SetFramebuffer(static_cast(framebuffer), static_cast(renderPass), clearValues, clearValueCount); } @@ -110,12 +110,12 @@ namespace Nz /* nothing to do */ } - void OpenGLCommandBufferBuilder::SetScissor(Nz::Recti scissorRegion) + void OpenGLCommandBufferBuilder::SetScissor(const Recti& scissorRegion) { m_commandBuffer.SetScissor(scissorRegion); } - void OpenGLCommandBufferBuilder::SetViewport(Nz::Recti viewportRegion) + void OpenGLCommandBufferBuilder::SetViewport(const Recti& viewportRegion) { m_commandBuffer.SetViewport(viewportRegion); } diff --git a/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp b/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp index 01232a6be..1b82325ba 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp @@ -32,7 +32,7 @@ namespace Nz m_size = size; } - return RenderFrame(m_renderImage[m_currentFrame].get(), invalidateFramebuffer); + return RenderFrame(m_renderImage[m_currentFrame].get(), invalidateFramebuffer, m_size, 0); } bool OpenGLRenderWindow::Create(RendererImpl* renderer, RenderSurface* surface, const RenderWindowParameters& parameters) @@ -98,11 +98,18 @@ namespace Nz return std::make_unique(); } - const OpenGLFramebuffer& OpenGLRenderWindow::GetFramebuffer() const + const OpenGLFramebuffer& OpenGLRenderWindow::GetFramebuffer(std::size_t i) const { + assert(i == 0); + NazaraUnused(i); return m_framebuffer; } + std::size_t OpenGLRenderWindow::GetFramebufferCount() const + { + return 1; + } + const OpenGLRenderPass& OpenGLRenderWindow::GetRenderPass() const { return *m_renderPass; diff --git a/src/Nazara/Renderer/RenderTarget.cpp b/src/Nazara/Renderer/RenderTarget.cpp new file mode 100644 index 000000000..382d2f337 --- /dev/null +++ b/src/Nazara/Renderer/RenderTarget.cpp @@ -0,0 +1,11 @@ +// Copyright (C) 2020 Jérôme Leclercq +// This file is part of the "Nazara Engine - Renderer module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + RenderTarget::~RenderTarget() = default; +} diff --git a/src/Nazara/VulkanRenderer/VkRenderWindow.cpp b/src/Nazara/VulkanRenderer/VkRenderWindow.cpp index 9606bd7bb..6c3074a6c 100644 --- a/src/Nazara/VulkanRenderer/VkRenderWindow.cpp +++ b/src/Nazara/VulkanRenderer/VkRenderWindow.cpp @@ -33,7 +33,7 @@ namespace Nz m_concurrentImageData.clear(); m_renderPass.reset(); - m_framebuffer.reset(); + m_framebuffers.clear(); m_swapchain.Destroy(); } @@ -100,7 +100,7 @@ namespace Nz currentFrame.Reset(imageIndex); - return RenderFrame(¤tFrame, invalidateFramebuffer); + return RenderFrame(¤tFrame, invalidateFramebuffer, size, imageIndex); } bool VkRenderWindow::Create(RendererImpl* /*renderer*/, RenderSurface* surface, const RenderWindowParameters& parameters) @@ -301,6 +301,17 @@ namespace Nz return std::make_shared(*m_device, queueFamilyIndex); } + const VulkanWindowFramebuffer& VkRenderWindow::GetFramebuffer(std::size_t i) const + { + assert(i < m_framebuffers.size()); + return m_framebuffers[i]; + } + + std::size_t VkRenderWindow::GetFramebufferCount() const + { + return std::size_t(); + } + void VkRenderWindow::Present(UInt32 imageIndex, VkSemaphore waitSemaphore) { NazaraAssert(imageIndex < m_inflightFences.size(), "Invalid image index"); @@ -439,7 +450,8 @@ namespace Nz { UInt32 imageCount = m_swapchain.GetImageCount(); - Nz::StackArray framebuffers = NazaraStackArray(Vk::Framebuffer, imageCount); + m_framebuffers.clear(); + m_framebuffers.reserve(imageCount); for (UInt32 i = 0; i < imageCount; ++i) { std::array attachments = { m_swapchain.GetImage(i).view, m_depthBufferView }; @@ -456,14 +468,17 @@ namespace Nz 1U }; - if (!framebuffers[i].Create(*m_device, frameBufferCreate)) + Vk::Framebuffer framebuffer; + + if (!framebuffer.Create(*m_device, frameBufferCreate)) { - NazaraError("Failed to create framebuffer for image #" + NumberToString(i) + ": " + TranslateVulkanError(framebuffers[i].GetLastErrorCode())); + NazaraError("Failed to create framebuffer for image #" + NumberToString(i) + ": " + TranslateVulkanError(framebuffer.GetLastErrorCode())); return false; } + + m_framebuffers.emplace_back(std::move(framebuffer)); } - m_framebuffer.emplace(framebuffers.data(), framebuffers.size()); return true; } diff --git a/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp b/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp index e973b7003..3bcec695a 100644 --- a/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp +++ b/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp @@ -17,7 +17,7 @@ namespace Nz { - void VulkanCommandBufferBuilder::BeginDebugRegion(const std::string_view& regionName, const Nz::Color& color) + void VulkanCommandBufferBuilder::BeginDebugRegion(const std::string_view& regionName, const Color& color) { // Ensure \0 at the end of string StackArray regionNameEOS = NazaraStackArrayNoInit(char, regionName.size() + 1); @@ -27,27 +27,10 @@ namespace Nz m_commandBuffer.BeginDebugRegion(regionNameEOS.data(), color); } - void VulkanCommandBufferBuilder::BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti renderRect, const ClearValues* clearValues, std::size_t clearValueCount) + void VulkanCommandBufferBuilder::BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& renderRect, const ClearValues* clearValues, std::size_t clearValueCount) { const VulkanRenderPass& vkRenderPass = static_cast(renderPass); - - const Vk::Framebuffer& vkFramebuffer = [&] () -> const Vk::Framebuffer& - { - switch (framebuffer.GetType()) - { - case FramebufferType::Texture: - return static_cast(framebuffer).GetFramebuffer(); - - case FramebufferType::Window: - { - const VulkanWindowFramebuffer& vkMultipleFramebuffer = static_cast(framebuffer); - m_framebufferCount = std::max(m_framebufferCount, vkMultipleFramebuffer.GetFramebufferCount()); - return vkMultipleFramebuffer.GetFramebuffer(m_imageIndex); - } - } - - throw std::runtime_error("Unhandled framebuffer type " + std::to_string(UnderlyingCast(framebuffer.GetType()))); - }(); + const VulkanFramebuffer& vkFramebuffer = static_cast(framebuffer); std::size_t attachmentCount = vkRenderPass.GetAttachmentCount(); @@ -73,7 +56,7 @@ namespace Nz VkRenderPassBeginInfo beginInfo = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO }; beginInfo.renderPass = vkRenderPass.GetRenderPass(); - beginInfo.framebuffer = vkFramebuffer; + beginInfo.framebuffer = vkFramebuffer.GetFramebuffer(); beginInfo.renderArea.offset.x = renderRect.x; beginInfo.renderArea.offset.y = renderRect.y; beginInfo.renderArea.extent.width = renderRect.width; @@ -87,7 +70,7 @@ namespace Nz m_currentSubpassIndex = 0; } - void VulkanCommandBufferBuilder::BindIndexBuffer(Nz::AbstractBuffer* indexBuffer, UInt64 offset) + void VulkanCommandBufferBuilder::BindIndexBuffer(AbstractBuffer* indexBuffer, UInt64 offset) { VulkanBuffer& vkBuffer = *static_cast(indexBuffer); @@ -120,7 +103,7 @@ namespace Nz m_commandBuffer.BindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, vkPipelineLayout.GetPipelineLayout(), set, vkBinding.GetDescriptorSet()); } - void VulkanCommandBufferBuilder::BindVertexBuffer(UInt32 binding, Nz::AbstractBuffer* vertexBuffer, UInt64 offset) + void VulkanCommandBufferBuilder::BindVertexBuffer(UInt32 binding, AbstractBuffer* vertexBuffer, UInt64 offset) { VulkanBuffer& vkBuffer = *static_cast(vertexBuffer); @@ -180,14 +163,14 @@ namespace Nz m_commandBuffer.MemoryBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_UNIFORM_READ_BIT); } - void VulkanCommandBufferBuilder::SetScissor(Nz::Recti scissorRegion) + void VulkanCommandBufferBuilder::SetScissor(const Recti& scissorRegion) { m_commandBuffer.SetScissor(scissorRegion); } - void VulkanCommandBufferBuilder::SetViewport(Nz::Recti viewportRegion) + void VulkanCommandBufferBuilder::SetViewport(const Recti& viewportRegion) { - m_commandBuffer.SetViewport(Nz::Rectf(viewportRegion), 0.f, 1.f); + m_commandBuffer.SetViewport(Rectf(viewportRegion), 0.f, 1.f); } void VulkanCommandBufferBuilder::TextureBarrier(PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, MemoryAccessFlags srcAccessMask, MemoryAccessFlags dstAccessMask, TextureLayout oldLayout, TextureLayout newLayout, const Texture& texture) diff --git a/src/Nazara/VulkanRenderer/VulkanCommandPool.cpp b/src/Nazara/VulkanRenderer/VulkanCommandPool.cpp index 5076946b4..956a0aab1 100644 --- a/src/Nazara/VulkanRenderer/VulkanCommandPool.cpp +++ b/src/Nazara/VulkanRenderer/VulkanCommandPool.cpp @@ -13,40 +13,30 @@ namespace Nz { CommandBufferPtr VulkanCommandPool::BuildCommandBuffer(const std::function& callback) { - std::vector commandBuffers; - auto BuildCommandBuffer = [&](std::size_t imageIndex) - { - Vk::AutoCommandBuffer& commandBuffer = commandBuffers.emplace_back(m_commandPool.AllocateCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY)); + Vk::AutoCommandBuffer commandBuffer = m_commandPool.AllocateCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY); - if (!commandBuffer->Begin(VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT)) - throw std::runtime_error("failed to begin command buffer: " + TranslateVulkanError(commandBuffer->GetLastErrorCode())); + if (!commandBuffer->Begin(VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT)) + throw std::runtime_error("failed to begin command buffer: " + TranslateVulkanError(commandBuffer->GetLastErrorCode())); - VulkanCommandBufferBuilder builder(commandBuffer.Get(), imageIndex); - callback(builder); + VulkanCommandBufferBuilder builder(commandBuffer.Get()); + callback(builder); - if (!commandBuffer->End()) - throw std::runtime_error("failed to build command buffer: " + TranslateVulkanError(commandBuffer->GetLastErrorCode())); - - return builder.GetMaxFramebufferCount(); - }; - - std::size_t maxFramebufferCount = BuildCommandBuffer(0); - for (std::size_t i = 1; i < maxFramebufferCount; ++i) - BuildCommandBuffer(i); + if (!commandBuffer->End()) + throw std::runtime_error("failed to build command buffer: " + TranslateVulkanError(commandBuffer->GetLastErrorCode())); for (std::size_t i = 0; i < m_commandPools.size(); ++i) { if (m_commandPools[i].freeCommands.TestNone()) continue; - return AllocateFromPool(i, std::move(commandBuffers)); + return AllocateFromPool(i, std::move(commandBuffer)); } // No allocation could be made, time to allocate a new pool std::size_t newPoolIndex = m_commandPools.size(); AllocatePool(); - return AllocateFromPool(newPoolIndex, std::move(commandBuffers)); + return AllocateFromPool(newPoolIndex, std::move(commandBuffer)); } auto VulkanCommandPool::AllocatePool() -> CommandPool& diff --git a/src/Nazara/VulkanRenderer/VulkanRenderImage.cpp b/src/Nazara/VulkanRenderer/VulkanRenderImage.cpp index 2c01d4b1a..f16a7ab8e 100644 --- a/src/Nazara/VulkanRenderer/VulkanRenderImage.cpp +++ b/src/Nazara/VulkanRenderer/VulkanRenderImage.cpp @@ -49,7 +49,7 @@ namespace Nz if (!commandBuffer->Begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT)) throw std::runtime_error("failed to begin command buffer: " + TranslateVulkanError(commandBuffer->GetLastErrorCode())); - VulkanCommandBufferBuilder builder(*commandBuffer, m_imageIndex); + VulkanCommandBufferBuilder builder(*commandBuffer); callback(builder); if (!commandBuffer->End()) @@ -76,7 +76,7 @@ namespace Nz { VulkanCommandBuffer& vkCommandBuffer = *static_cast(commandBuffer); - return SubmitCommandBuffer(vkCommandBuffer.GetCommandBuffer(m_imageIndex), queueTypeFlags); + return SubmitCommandBuffer(vkCommandBuffer.GetCommandBuffer(), queueTypeFlags); } void VulkanRenderImage::SubmitCommandBuffer(VkCommandBuffer commandBuffer, QueueTypeFlags queueTypeFlags)