Renderer: Expose RenderTarget and framebuffers indices

This commit is contained in:
Jérôme Leclercq 2021-07-03 13:52:29 +02:00
parent 930142b7a7
commit f14db3f5e9
33 changed files with 300 additions and 312 deletions

View File

@ -234,7 +234,6 @@ int main()
Nz::WorldInstance planeInstance; Nz::WorldInstance planeInstance;
Nz::RenderWindowImpl* windowImpl = window.GetImpl(); Nz::RenderWindowImpl* windowImpl = window.GetImpl();
std::shared_ptr<Nz::CommandPool> commandPool = windowImpl->CreateCommandPool(Nz::QueueType::Graphics);
Nz::RenderPipelineLayoutInfo lightingPipelineLayoutInfo; Nz::RenderPipelineLayoutInfo lightingPipelineLayoutInfo;
@ -629,18 +628,22 @@ int main()
return (matUpdate) ? Nz::FramePassExecution::UpdateAndExecute : Nz::FramePassExecution::Execute; 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.SetScissor(renderArea);
builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); builder.SetViewport(renderArea);
builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(Nz::Graphics::ViewerBindingSet, viewerInstance.GetShaderBinding());
spaceshipModel.Draw(builder, modelInstance1); builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, modelInstance1.GetShaderBinding());
spaceshipModel.Draw(builder, modelInstance2); spaceshipModel.Draw(builder);
builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, modelInstance2.GetShaderBinding());
spaceshipModel.Draw(builder);
// Plane // Plane
planeModel.Draw(builder, planeInstance); builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, planeInstance.GetShaderBinding());
planeModel.Draw(builder);
}); });
Nz::FramePass& lightingPass = graph.AddPass("Lighting pass"); Nz::FramePass& lightingPass = graph.AddPass("Lighting pass");
@ -649,10 +652,10 @@ int main()
return (lightUpdate) ? Nz::FramePassExecution::UpdateAndExecute : Nz::FramePassExecution::Execute; 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.SetScissor(renderArea);
builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); builder.SetViewport(renderArea);
//builder.BindVertexBuffer(0, vertexBuffer.get()); //builder.BindVertexBuffer(0, vertexBuffer.get());
builder.BindIndexBuffer(coneMeshGfx->GetIndexBuffer(0).get()); builder.BindIndexBuffer(coneMeshGfx->GetIndexBuffer(0).get());
@ -682,10 +685,10 @@ int main()
lightingPass.SetDepthStencilOutput(depthBuffer); lightingPass.SetDepthStencilOutput(depthBuffer);
Nz::FramePass& forwardPass = graph.AddPass("Forward pass"); 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.SetScissor(renderArea);
builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); builder.SetViewport(renderArea);
builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(0, viewerInstance.GetShaderBinding());
builder.BindShaderBinding(1, *skyboxShaderBinding); builder.BindShaderBinding(1, *skyboxShaderBinding);
@ -707,10 +710,10 @@ int main()
forwardPass.SetDepthStencilOutput(depthBuffer); forwardPass.SetDepthStencilOutput(depthBuffer);
Nz::FramePass& bloomBrightPass = graph.AddPass("Bloom pass - extract bright pixels"); 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.SetScissor(renderArea);
builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth) / 10, int(offscreenHeight) / 10 }); builder.SetViewport(renderArea);
builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(0, viewerInstance.GetShaderBinding());
builder.BindShaderBinding(1, *bloomBrightShaderBinding); builder.BindShaderBinding(1, *bloomBrightShaderBinding);
@ -729,10 +732,10 @@ int main()
bloomBrightPass.AddOutput(bloomTextureA); bloomBrightPass.AddOutput(bloomTextureA);
Nz::FramePass& bloomBlurPass = graph.AddPass("Bloom pass - gaussian blur"); 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.SetScissor(renderArea);
builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth) / 10, int(offscreenHeight) / 10 }); builder.SetViewport(renderArea);
builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(0, viewerInstance.GetShaderBinding());
builder.BindShaderBinding(1, *gaussianBlurShaderBinding); builder.BindShaderBinding(1, *gaussianBlurShaderBinding);
@ -750,10 +753,10 @@ int main()
bloomBlurPass.AddOutput(bloomTextureB); bloomBlurPass.AddOutput(bloomTextureB);
Nz::FramePass& bloomBlendPass = graph.AddPass("Bloom pass - blend"); 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.SetScissor(renderArea);
builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); builder.SetViewport(renderArea);
builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(0, viewerInstance.GetShaderBinding());
builder.BindShaderBinding(1, *bloomBlendShaderBinding); 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::Vector3f viewerPos = Nz::Vector3f::Backward() * 10.f + Nz::Vector3f::Up() * 3.f;
Nz::EulerAnglesf camAngles(-30.f, 0.f, 0.f); Nz::EulerAnglesf camAngles(-30.f, 0.f, 0.f);
@ -1049,12 +1021,6 @@ int main()
if (!frame) if (!frame)
continue; continue;
if (frame.IsFramebufferInvalidated())
{
frame.PushForRelease(std::move(drawCommandBuffer));
RebuildCommandBuffer();
}
Nz::UploadPool& uploadPool = frame.GetUploadPool(); Nz::UploadPool& uploadPool = frame.GetUploadPool();
frame.Execute([&](Nz::CommandBufferBuilder& builder) frame.Execute([&](Nz::CommandBufferBuilder& builder)
@ -1108,7 +1074,29 @@ int main()
}, Nz::QueueType::Transfer); }, Nz::QueueType::Transfer);
bakedGraph.Execute(frame); 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(); frame.Present();

View File

@ -30,7 +30,7 @@ int main()
meshParams.center = true; meshParams.center = true;
meshParams.storage = Nz::DataStorage::Software; 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.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<Nz::RenderDevice> device = Nz::Graphics::Instance()->GetRenderDevice(); std::shared_ptr<Nz::RenderDevice> device = Nz::Graphics::Instance()->GetRenderDevice();
@ -88,50 +88,6 @@ int main()
modelInstance2.UpdateWorldMatrix(Nz::Matrix4f::Translate(Nz::Vector3f::Forward() * 2 + Nz::Vector3f::Right())); modelInstance2.UpdateWorldMatrix(Nz::Matrix4f::Translate(Nz::Vector3f::Forward() * 2 + Nz::Vector3f::Right()));
Nz::RenderWindowImpl* windowImpl = window.GetImpl(); Nz::RenderWindowImpl* windowImpl = window.GetImpl();
std::shared_ptr<Nz::CommandPool> 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(); Nz::Vector3f viewerPos = Nz::Vector3f::Zero();
@ -250,13 +206,42 @@ int main()
builder.EndDebugRegion(); builder.EndDebugRegion();
}, Nz::QueueType::Transfer); }, Nz::QueueType::Transfer);
if (updateMat || frame.IsFramebufferInvalidated()) frame.Execute([&](Nz::CommandBufferBuilder& builder)
{ {
frame.PushForRelease(std::move(drawCommandBuffer)); Nz::Recti renderRect(0, 0, window.GetSize().x, window.GetSize().y);
RebuildCommandBuffer();
}
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(); frame.Present();

View File

@ -240,43 +240,6 @@ int main()
Nz::AbstractBuffer* indexBufferImpl = renderBufferIB->GetHardwareBuffer(renderDevice); Nz::AbstractBuffer* indexBufferImpl = renderBufferIB->GetHardwareBuffer(renderDevice);
Nz::AbstractBuffer* vertexBufferImpl = renderBufferVB->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::Vector3f viewerPos = Nz::Vector3f::Zero();
Nz::EulerAnglesf camAngles(0.f, 0.f, 0.f); Nz::EulerAnglesf camAngles(0.f, 0.f, 0.f);
@ -368,12 +331,6 @@ int main()
if (!frame) if (!frame)
continue; continue;
if (frame.IsFramebufferInvalidated())
{
frame.PushForRelease(std::move(drawCommandBuffer));
RebuildCommandBuffer();
}
ubo.viewMatrix = Nz::Matrix4f::ViewMatrix(viewerPos, camAngles); ubo.viewMatrix = Nz::Matrix4f::ViewMatrix(viewerPos, camAngles);
if (uboUpdate) if (uboUpdate)
@ -396,7 +353,35 @@ int main()
uboUpdate = false; 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(); frame.Present();

View File

@ -35,7 +35,7 @@ namespace Nz
OpenGLCommandBuffer(OpenGLCommandBuffer&&) = delete; OpenGLCommandBuffer(OpenGLCommandBuffer&&) = delete;
~OpenGLCommandBuffer() = default; ~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 BindIndexBuffer(GLuint indexBuffer, UInt64 offset = 0);
inline void BindPipeline(const OpenGLRenderPipeline* pipeline); inline void BindPipeline(const OpenGLRenderPipeline* pipeline);
@ -57,8 +57,8 @@ namespace Nz
inline const OpenGLCommandPool& GetOwner() const; inline const OpenGLCommandPool& GetOwner() const;
inline void SetFramebuffer(const OpenGLFramebuffer& framebuffer, const OpenGLRenderPass& renderPass, const CommandBufferBuilder::ClearValues* clearValues, std::size_t clearValueCount); 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 SetScissor(const Recti& scissorRegion);
inline void SetViewport(Nz::Recti viewportRegion); inline void SetViewport(const Recti& viewportRegion);
OpenGLCommandBuffer& operator=(const OpenGLCommandBuffer&) = delete; OpenGLCommandBuffer& operator=(const OpenGLCommandBuffer&) = delete;
OpenGLCommandBuffer& operator=(OpenGLCommandBuffer&&) = delete; OpenGLCommandBuffer& operator=(OpenGLCommandBuffer&&) = delete;
@ -72,7 +72,7 @@ namespace Nz
struct BeginDebugRegionData struct BeginDebugRegionData
{ {
std::string regionName; std::string regionName;
Nz::Color color; Color color;
}; };
struct CopyBufferData struct CopyBufferData

View File

@ -151,15 +151,15 @@ namespace Nz
m_commands.emplace_back(std::move(setFramebuffer)); 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; m_currentStates.scissorRegion = scissorRegion;
} }
inline void OpenGLCommandBuffer::SetViewport(Nz::Recti viewportRegion) inline void OpenGLCommandBuffer::SetViewport(const Recti& viewportRegion)
{ {
m_currentStates.viewportRegion = viewportRegion; m_currentStates.viewportRegion = viewportRegion;
} }

View File

@ -24,7 +24,7 @@ namespace Nz
~OpenGLCommandBufferBuilder() = default; ~OpenGLCommandBufferBuilder() = default;
void BeginDebugRegion(const std::string_view& regionName, const Nz::Color& color) override; 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 BindIndexBuffer(AbstractBuffer* indexBuffer, UInt64 offset = 0) override;
void BindPipeline(const RenderPipeline& pipeline) override; void BindPipeline(const RenderPipeline& pipeline) override;
@ -46,8 +46,8 @@ namespace Nz
void PreTransferBarrier() override; void PreTransferBarrier() override;
void PostTransferBarrier() override; void PostTransferBarrier() override;
void SetScissor(Nz::Recti scissorRegion) override; void SetScissor(const Recti& scissorRegion) override;
void SetViewport(Nz::Recti viewportRegion) 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; void TextureBarrier(PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, MemoryAccessFlags srcAccessMask, MemoryAccessFlags dstAccessMask, TextureLayout oldLayout, TextureLayout newLayout, const Texture& texture) override;

View File

@ -34,7 +34,8 @@ namespace Nz
std::shared_ptr<CommandPool> CreateCommandPool(QueueType queueType) override; std::shared_ptr<CommandPool> CreateCommandPool(QueueType queueType) override;
inline GL::Context& GetContext(); 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; const OpenGLRenderPass& GetRenderPass() const override;
void Present(); void Present();

View File

@ -35,16 +35,16 @@ namespace Nz
CommandBufferBuilder(CommandBufferBuilder&&) = default; CommandBufferBuilder(CommandBufferBuilder&&) = default;
virtual ~CommandBufferBuilder(); virtual ~CommandBufferBuilder();
virtual void BeginDebugRegion(const std::string_view& regionName, const Nz::Color& color) = 0; virtual void BeginDebugRegion(const std::string_view& regionName, const Color& color) = 0;
virtual void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti renderRect, const ClearValues* clearValues, std::size_t clearValueCount) = 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, Nz::Recti renderRect); inline void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& renderRect);
inline void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti renderRect, std::initializer_list<ClearValues> clearValues); inline void BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& renderRect, std::initializer_list<ClearValues> 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 BindPipeline(const RenderPipeline& pipeline) = 0;
virtual void BindShaderBinding(UInt32 set, const ShaderBinding& binding) = 0; virtual void BindShaderBinding(UInt32 set, const ShaderBinding& binding) = 0;
virtual void BindShaderBinding(const RenderPipelineLayout& pipelineLayout, 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); 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; 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 PreTransferBarrier() = 0;
virtual void PostTransferBarrier() = 0; virtual void PostTransferBarrier() = 0;
virtual void SetScissor(Nz::Recti scissorRegion) = 0; virtual void SetScissor(const Recti& scissorRegion) = 0;
virtual void SetViewport(Nz::Recti viewportRegion) = 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; 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 struct ClearValues
{ {
Nz::Color color = Nz::Color::Black; Color color = Color::Black;
float depth = 1.f; float depth = 1.f;
UInt32 stencil = 0; UInt32 stencil = 0;
}; };

View File

@ -7,12 +7,12 @@
namespace Nz 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); return BeginRenderPass(framebuffer, renderPass, renderRect, nullptr, 0);
} }
inline void CommandBufferBuilder::BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, Nz::Recti renderRect, std::initializer_list<ClearValues> clearValues) inline void CommandBufferBuilder::BeginRenderPass(const Framebuffer& framebuffer, const RenderPass& renderPass, const Recti& renderRect, std::initializer_list<ClearValues> clearValues)
{ {
return BeginRenderPass(framebuffer, renderPass, renderRect, clearValues.begin(), clearValues.size()); return BeginRenderPass(framebuffer, renderPass, renderRect, clearValues.begin(), clearValues.size());
} }

View File

@ -8,6 +8,7 @@
#define NAZARA_RENDERFRAME_HPP #define NAZARA_RENDERFRAME_HPP
#include <Nazara/Prerequisites.hpp> #include <Nazara/Prerequisites.hpp>
#include <Nazara/Math/Vector2.hpp>
#include <Nazara/Renderer/Config.hpp> #include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/Enums.hpp> #include <Nazara/Renderer/Enums.hpp>
#include <Nazara/Renderer/RenderImage.hpp> #include <Nazara/Renderer/RenderImage.hpp>
@ -23,13 +24,15 @@ namespace Nz
{ {
public: public:
inline explicit RenderFrame(); 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(const RenderFrame&) = delete;
RenderFrame(RenderFrame&&) = delete; RenderFrame(RenderFrame&&) = delete;
~RenderFrame() = default; ~RenderFrame() = default;
void Execute(const std::function<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags); void Execute(const std::function<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags);
inline std::size_t GetFramebufferIndex() const;
const Vector2ui& GetSize() const;
UploadPool& GetUploadPool(); UploadPool& GetUploadPool();
inline bool IsFramebufferInvalidated() const; inline bool IsFramebufferInvalidated() const;
@ -47,7 +50,9 @@ namespace Nz
RenderFrame& operator=(RenderFrame&&) = delete; RenderFrame& operator=(RenderFrame&&) = delete;
private: private:
std::size_t m_framebufferIndex;
RenderImage* m_image; RenderImage* m_image;
Vector2ui m_size;
bool m_framebufferInvalidation; bool m_framebufferInvalidation;
}; };
} }

View File

@ -8,16 +8,28 @@
namespace Nz namespace Nz
{ {
inline RenderFrame::RenderFrame() : 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_image(renderImage),
m_size(size),
m_framebufferInvalidation(framebufferInvalidation) 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 inline bool RenderFrame::IsFramebufferInvalidated() const
{ {
return m_framebufferInvalidation; return m_framebufferInvalidation;
@ -45,3 +57,4 @@ namespace Nz
} }
#include <Nazara/Renderer/DebugOff.hpp> #include <Nazara/Renderer/DebugOff.hpp>
#include "RenderFrame.hpp"

View File

@ -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 <Nazara/Prerequisites.hpp>
#include <Nazara/Renderer/Config.hpp>
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 <Nazara/Renderer/RenderTarget.inl>
#endif

View File

@ -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 <Nazara/Renderer/RenderTarget.hpp>
#include <Nazara/Renderer/Debug.hpp>
namespace Nz
{
}
#include <Nazara/Renderer/DebugOff.hpp>

View File

@ -14,18 +14,18 @@
#include <Nazara/Renderer/RenderDevice.hpp> #include <Nazara/Renderer/RenderDevice.hpp>
#include <Nazara/Renderer/RenderFrame.hpp> #include <Nazara/Renderer/RenderFrame.hpp>
#include <Nazara/Renderer/RenderPass.hpp> #include <Nazara/Renderer/RenderPass.hpp>
#include <Nazara/Renderer/RenderTarget.hpp>
#include <Nazara/Renderer/RenderWindowParameters.hpp> #include <Nazara/Renderer/RenderWindowParameters.hpp>
#include <vector> #include <vector>
namespace Nz namespace Nz
{ {
class CommandPool; class CommandPool;
class Framebuffer;
class RendererImpl; class RendererImpl;
class RenderDevice; class RenderDevice;
class RenderSurface; class RenderSurface;
class NAZARA_RENDERER_API RenderWindowImpl class NAZARA_RENDERER_API RenderWindowImpl : public RenderTarget
{ {
public: public:
RenderWindowImpl() = default; RenderWindowImpl() = default;
@ -36,9 +36,6 @@ namespace Nz
virtual bool Create(RendererImpl* renderer, RenderSurface* surface, const RenderWindowParameters& parameters) = 0; virtual bool Create(RendererImpl* renderer, RenderSurface* surface, const RenderWindowParameters& parameters) = 0;
virtual std::shared_ptr<CommandPool> CreateCommandPool(QueueType queueType) = 0; virtual std::shared_ptr<CommandPool> CreateCommandPool(QueueType queueType) = 0;
virtual const Framebuffer& GetFramebuffer() const = 0;
virtual const RenderPass& GetRenderPass() const = 0;
protected: protected:
static void BuildRenderPass(PixelFormat colorFormat, PixelFormat depthFormat, std::vector<RenderPass::Attachment>& attachments, std::vector<RenderPass::SubpassDescription>& subpassDescriptions, std::vector<RenderPass::SubpassDependency>& subpassDependencies); static void BuildRenderPass(PixelFormat colorFormat, PixelFormat depthFormat, std::vector<RenderPass::Attachment>& attachments, std::vector<RenderPass::SubpassDescription>& subpassDescriptions, std::vector<RenderPass::SubpassDependency>& subpassDependencies);
}; };

View File

@ -41,7 +41,6 @@
#include <Nazara/VulkanRenderer/VulkanDescriptorSetLayoutCache.hpp> #include <Nazara/VulkanRenderer/VulkanDescriptorSetLayoutCache.hpp>
#include <Nazara/VulkanRenderer/VulkanDevice.hpp> #include <Nazara/VulkanRenderer/VulkanDevice.hpp>
#include <Nazara/VulkanRenderer/VulkanFramebuffer.hpp> #include <Nazara/VulkanRenderer/VulkanFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanMultipleFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanRenderer.hpp> #include <Nazara/VulkanRenderer/VulkanRenderer.hpp>
#include <Nazara/VulkanRenderer/VulkanRenderImage.hpp> #include <Nazara/VulkanRenderer/VulkanRenderImage.hpp>
#include <Nazara/VulkanRenderer/VulkanRenderPass.hpp> #include <Nazara/VulkanRenderer/VulkanRenderPass.hpp>
@ -49,10 +48,11 @@
#include <Nazara/VulkanRenderer/VulkanRenderPipelineLayout.hpp> #include <Nazara/VulkanRenderer/VulkanRenderPipelineLayout.hpp>
#include <Nazara/VulkanRenderer/VulkanShaderBinding.hpp> #include <Nazara/VulkanRenderer/VulkanShaderBinding.hpp>
#include <Nazara/VulkanRenderer/VulkanShaderModule.hpp> #include <Nazara/VulkanRenderer/VulkanShaderModule.hpp>
#include <Nazara/VulkanRenderer/VulkanSingleFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanSurface.hpp> #include <Nazara/VulkanRenderer/VulkanSurface.hpp>
#include <Nazara/VulkanRenderer/VulkanTexture.hpp> #include <Nazara/VulkanRenderer/VulkanTexture.hpp>
#include <Nazara/VulkanRenderer/VulkanTextureFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanTextureSampler.hpp> #include <Nazara/VulkanRenderer/VulkanTextureSampler.hpp>
#include <Nazara/VulkanRenderer/VulkanUploadPool.hpp> #include <Nazara/VulkanRenderer/VulkanUploadPool.hpp>
#include <Nazara/VulkanRenderer/VulkanWindowFramebuffer.hpp>
#endif // NAZARA_GLOBAL_VULKANRENDERER_HPP #endif // NAZARA_GLOBAL_VULKANRENDERER_HPP

View File

@ -48,7 +48,8 @@ namespace Nz
std::shared_ptr<CommandPool> CreateCommandPool(QueueType queueType) override; std::shared_ptr<CommandPool> 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 VulkanDevice& GetDevice();
inline const VulkanDevice& GetDevice() const; inline const VulkanDevice& GetDevice() const;
inline Vk::QueueHandle& GetGraphicsQueue(); inline Vk::QueueHandle& GetGraphicsQueue();
@ -67,10 +68,10 @@ namespace Nz
bool SetupRenderPass(); bool SetupRenderPass();
bool SetupSwapchain(const Vk::PhysicalDevice& deviceInfo, Vk::Surface& surface, const Vector2ui& size); bool SetupSwapchain(const Vk::PhysicalDevice& deviceInfo, Vk::Surface& surface, const Vector2ui& size);
std::optional<VulkanWindowFramebuffer> m_framebuffer;
std::optional<VulkanRenderPass> m_renderPass; std::optional<VulkanRenderPass> m_renderPass;
std::shared_ptr<VulkanDevice> m_device; std::shared_ptr<VulkanDevice> m_device;
std::size_t m_currentFrame; std::size_t m_currentFrame;
std::vector<VulkanWindowFramebuffer> m_framebuffers;
std::vector<Vk::Fence*> m_inflightFences; std::vector<Vk::Fence*> m_inflightFences;
std::vector<std::unique_ptr<VulkanRenderImage>> m_concurrentImageData; std::vector<std::unique_ptr<VulkanRenderImage>> m_concurrentImageData;
Vk::DeviceMemory m_depthBufferMemory; Vk::DeviceMemory m_depthBufferMemory;

View File

@ -7,11 +7,6 @@
namespace Nz namespace Nz
{ {
inline const VulkanWindowFramebuffer& VkRenderWindow::GetFramebuffer() const
{
return *m_framebuffer;
}
inline VulkanDevice& VkRenderWindow::GetDevice() inline VulkanDevice& VkRenderWindow::GetDevice()
{ {
return *m_device; return *m_device;

View File

@ -21,13 +21,12 @@ namespace Nz
{ {
public: 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, Vk::AutoCommandBuffer commandBuffer);
inline VulkanCommandBuffer(VulkanCommandPool& owner, std::size_t poolIndex, std::size_t bindingIndex, std::vector<Vk::AutoCommandBuffer> commandBuffers);
VulkanCommandBuffer(const VulkanCommandBuffer&) = delete; VulkanCommandBuffer(const VulkanCommandBuffer&) = delete;
VulkanCommandBuffer(VulkanCommandBuffer&&) = delete; VulkanCommandBuffer(VulkanCommandBuffer&&) = delete;
~VulkanCommandBuffer() = default; ~VulkanCommandBuffer() = default;
inline std::size_t GetBindingIndex() const; 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 std::size_t GetPoolIndex() const;
inline const VulkanCommandPool& GetOwner() const; inline const VulkanCommandPool& GetOwner() const;
@ -41,7 +40,7 @@ namespace Nz
std::size_t m_bindingIndex; std::size_t m_bindingIndex;
std::size_t m_poolIndex; std::size_t m_poolIndex;
std::vector<Vk::AutoCommandBuffer> m_commandBuffers; Vk::AutoCommandBuffer m_commandBuffer;
VulkanCommandPool& m_owner; VulkanCommandPool& m_owner;
}; };
} }

View File

@ -8,15 +8,11 @@
namespace Nz namespace Nz
{ {
inline VulkanCommandBuffer::VulkanCommandBuffer(VulkanCommandPool& owner, std::size_t poolIndex, std::size_t bindingIndex, Vk::AutoCommandBuffer commandBuffer) : 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<Vk::AutoCommandBuffer> commandBuffers) :
VulkanCommandBuffer(owner, poolIndex, bindingIndex)
{
m_commandBuffers = std::move(commandBuffers);
} }
inline VulkanCommandBuffer::VulkanCommandBuffer(VulkanCommandPool& owner, std::size_t poolIndex, std::size_t bindingIndex) : inline VulkanCommandBuffer::VulkanCommandBuffer(VulkanCommandPool& owner, std::size_t poolIndex, std::size_t bindingIndex) :
@ -31,13 +27,9 @@ namespace Nz
return m_bindingIndex; 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_commandBuffer;
return m_commandBuffers.front();
assert(imageIndex < m_commandBuffers.size());
return m_commandBuffers[imageIndex].Get();
} }
inline std::size_t VulkanCommandBuffer::GetPoolIndex() const inline std::size_t VulkanCommandBuffer::GetPoolIndex() const

View File

@ -19,19 +19,19 @@ namespace Nz
class NAZARA_VULKANRENDERER_API VulkanCommandBufferBuilder final : public CommandBufferBuilder class NAZARA_VULKANRENDERER_API VulkanCommandBufferBuilder final : public CommandBufferBuilder
{ {
public: public:
inline VulkanCommandBufferBuilder(Vk::CommandBuffer& commandBuffer, std::size_t imageIndex = 0); inline VulkanCommandBufferBuilder(Vk::CommandBuffer& commandBuffer);
VulkanCommandBufferBuilder(const VulkanCommandBufferBuilder&) = delete; VulkanCommandBufferBuilder(const VulkanCommandBufferBuilder&) = delete;
VulkanCommandBufferBuilder(VulkanCommandBufferBuilder&&) noexcept = default; VulkanCommandBufferBuilder(VulkanCommandBufferBuilder&&) noexcept = default;
~VulkanCommandBufferBuilder() = default; ~VulkanCommandBufferBuilder() = default;
void BeginDebugRegion(const std::string_view& regionName, const Nz::Color& color) override; void BeginDebugRegion(const std::string_view& regionName, const 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 BindIndexBuffer(AbstractBuffer* indexBuffer, UInt64 offset = 0) override;
void BindPipeline(const RenderPipeline& pipeline) override; void BindPipeline(const RenderPipeline& pipeline) override;
void BindShaderBinding(UInt32 set, const ShaderBinding& binding) override; void BindShaderBinding(UInt32 set, const ShaderBinding& binding) override;
void BindShaderBinding(const RenderPipelineLayout& pipelineLayout, 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 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; 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; void EndRenderPass() override;
inline Vk::CommandBuffer& GetCommandBuffer(); inline Vk::CommandBuffer& GetCommandBuffer();
inline std::size_t GetMaxFramebufferCount() const;
void NextSubpass() override; void NextSubpass() override;
void PreTransferBarrier() override; void PreTransferBarrier() override;
void PostTransferBarrier() override; void PostTransferBarrier() override;
void SetScissor(Nz::Recti scissorRegion) override; void SetScissor(const Recti& scissorRegion) override;
void SetViewport(Nz::Recti viewportRegion) 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; 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; Vk::CommandBuffer& m_commandBuffer;
const VulkanRenderPass* m_currentRenderPass; const VulkanRenderPass* m_currentRenderPass;
std::size_t m_currentSubpassIndex; std::size_t m_currentSubpassIndex;
std::size_t m_framebufferCount;
std::size_t m_imageIndex;
}; };
} }

View File

@ -7,10 +7,8 @@
namespace Nz namespace Nz
{ {
inline VulkanCommandBufferBuilder::VulkanCommandBufferBuilder(Vk::CommandBuffer& commandBuffer, std::size_t imageIndex) : inline VulkanCommandBufferBuilder::VulkanCommandBufferBuilder(Vk::CommandBuffer& commandBuffer) :
m_commandBuffer(commandBuffer), m_commandBuffer(commandBuffer)
m_framebufferCount(0),
m_imageIndex(imageIndex)
{ {
} }
@ -18,11 +16,6 @@ namespace Nz
{ {
return m_commandBuffer; return m_commandBuffer;
} }
inline std::size_t VulkanCommandBufferBuilder::GetMaxFramebufferCount() const
{
return m_framebufferCount;
}
} }
#include <Nazara/VulkanRenderer/DebugOff.hpp> #include <Nazara/VulkanRenderer/DebugOff.hpp>

View File

@ -22,6 +22,8 @@ namespace Nz
VulkanFramebuffer(VulkanFramebuffer&&) noexcept = default; VulkanFramebuffer(VulkanFramebuffer&&) noexcept = default;
~VulkanFramebuffer() = default; ~VulkanFramebuffer() = default;
virtual const Vk::Framebuffer& GetFramebuffer() const = 0;
VulkanFramebuffer& operator=(const VulkanFramebuffer&) = delete; VulkanFramebuffer& operator=(const VulkanFramebuffer&) = delete;
VulkanFramebuffer& operator=(VulkanFramebuffer&&) noexcept = default; VulkanFramebuffer& operator=(VulkanFramebuffer&&) noexcept = default;
}; };

View File

@ -23,8 +23,7 @@ namespace Nz
VulkanTextureFramebuffer(VulkanTextureFramebuffer&&) = delete; VulkanTextureFramebuffer(VulkanTextureFramebuffer&&) = delete;
~VulkanTextureFramebuffer() = default; ~VulkanTextureFramebuffer() = default;
inline Vk::Framebuffer& GetFramebuffer(); inline const Vk::Framebuffer& GetFramebuffer() const override;
inline const Vk::Framebuffer& GetFramebuffer() const;
VulkanTextureFramebuffer& operator=(const VulkanTextureFramebuffer&) = delete; VulkanTextureFramebuffer& operator=(const VulkanTextureFramebuffer&) = delete;
VulkanTextureFramebuffer& operator=(VulkanTextureFramebuffer&&) = delete; VulkanTextureFramebuffer& operator=(VulkanTextureFramebuffer&&) = delete;

View File

@ -7,11 +7,6 @@
namespace Nz namespace Nz
{ {
inline Vk::Framebuffer& VulkanTextureFramebuffer::GetFramebuffer()
{
return m_framebuffer;
}
inline const Vk::Framebuffer& VulkanTextureFramebuffer::GetFramebuffer() const inline const Vk::Framebuffer& VulkanTextureFramebuffer::GetFramebuffer() const
{ {
return m_framebuffer; return m_framebuffer;

View File

@ -15,19 +15,18 @@ namespace Nz
class NAZARA_VULKANRENDERER_API VulkanWindowFramebuffer final : public VulkanFramebuffer class NAZARA_VULKANRENDERER_API VulkanWindowFramebuffer final : public VulkanFramebuffer
{ {
public: public:
inline VulkanWindowFramebuffer(Vk::Framebuffer* framebuffers, std::size_t count); inline VulkanWindowFramebuffer(Vk::Framebuffer framebuffer);
VulkanWindowFramebuffer(const VulkanWindowFramebuffer&) = delete; VulkanWindowFramebuffer(const VulkanWindowFramebuffer&) = delete;
VulkanWindowFramebuffer(VulkanWindowFramebuffer&&) noexcept = default; VulkanWindowFramebuffer(VulkanWindowFramebuffer&&) noexcept = default;
~VulkanWindowFramebuffer() = default; ~VulkanWindowFramebuffer() = default;
inline const Vk::Framebuffer& GetFramebuffer(std::size_t index) const; inline const Vk::Framebuffer& GetFramebuffer() const override;
inline std::size_t GetFramebufferCount() const;
VulkanWindowFramebuffer& operator=(const VulkanWindowFramebuffer&) = delete; VulkanWindowFramebuffer& operator=(const VulkanWindowFramebuffer&) = delete;
VulkanWindowFramebuffer& operator=(VulkanWindowFramebuffer&&) noexcept = default; VulkanWindowFramebuffer& operator=(VulkanWindowFramebuffer&&) noexcept = default;
private: private:
std::vector<Vk::Framebuffer> m_framebuffers; Vk::Framebuffer m_framebuffer;
}; };
} }

View File

@ -7,23 +7,15 @@
namespace Nz namespace Nz
{ {
inline VulkanWindowFramebuffer::VulkanWindowFramebuffer(Vk::Framebuffer* framebuffers, std::size_t count) : inline VulkanWindowFramebuffer::VulkanWindowFramebuffer(Vk::Framebuffer framebuffer) :
VulkanFramebuffer(FramebufferType::Window) 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_framebuffer;
return m_framebuffers[index];
}
inline std::size_t VulkanWindowFramebuffer::GetFramebufferCount() const
{
return m_framebuffers.size();
} }
} }

View File

@ -19,7 +19,7 @@ namespace Nz
m_commandBuffer.BeginDebugRegion(regionName, color); 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<const OpenGLFramebuffer&>(framebuffer), static_cast<const OpenGLRenderPass&>(renderPass), clearValues, clearValueCount); m_commandBuffer.SetFramebuffer(static_cast<const OpenGLFramebuffer&>(framebuffer), static_cast<const OpenGLRenderPass&>(renderPass), clearValues, clearValueCount);
} }
@ -110,12 +110,12 @@ namespace Nz
/* nothing to do */ /* nothing to do */
} }
void OpenGLCommandBufferBuilder::SetScissor(Nz::Recti scissorRegion) void OpenGLCommandBufferBuilder::SetScissor(const Recti& scissorRegion)
{ {
m_commandBuffer.SetScissor(scissorRegion); m_commandBuffer.SetScissor(scissorRegion);
} }
void OpenGLCommandBufferBuilder::SetViewport(Nz::Recti viewportRegion) void OpenGLCommandBufferBuilder::SetViewport(const Recti& viewportRegion)
{ {
m_commandBuffer.SetViewport(viewportRegion); m_commandBuffer.SetViewport(viewportRegion);
} }

View File

@ -32,7 +32,7 @@ namespace Nz
m_size = size; 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) bool OpenGLRenderWindow::Create(RendererImpl* renderer, RenderSurface* surface, const RenderWindowParameters& parameters)
@ -98,11 +98,18 @@ namespace Nz
return std::make_unique<OpenGLCommandPool>(); return std::make_unique<OpenGLCommandPool>();
} }
const OpenGLFramebuffer& OpenGLRenderWindow::GetFramebuffer() const const OpenGLFramebuffer& OpenGLRenderWindow::GetFramebuffer(std::size_t i) const
{ {
assert(i == 0);
NazaraUnused(i);
return m_framebuffer; return m_framebuffer;
} }
std::size_t OpenGLRenderWindow::GetFramebufferCount() const
{
return 1;
}
const OpenGLRenderPass& OpenGLRenderWindow::GetRenderPass() const const OpenGLRenderPass& OpenGLRenderWindow::GetRenderPass() const
{ {
return *m_renderPass; return *m_renderPass;

View File

@ -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 <Nazara/Renderer/RenderTarget.hpp>
#include <Nazara/Renderer/Debug.hpp>
namespace Nz
{
RenderTarget::~RenderTarget() = default;
}

View File

@ -33,7 +33,7 @@ namespace Nz
m_concurrentImageData.clear(); m_concurrentImageData.clear();
m_renderPass.reset(); m_renderPass.reset();
m_framebuffer.reset(); m_framebuffers.clear();
m_swapchain.Destroy(); m_swapchain.Destroy();
} }
@ -100,7 +100,7 @@ namespace Nz
currentFrame.Reset(imageIndex); currentFrame.Reset(imageIndex);
return RenderFrame(&currentFrame, invalidateFramebuffer); return RenderFrame(&currentFrame, invalidateFramebuffer, size, imageIndex);
} }
bool VkRenderWindow::Create(RendererImpl* /*renderer*/, RenderSurface* surface, const RenderWindowParameters& parameters) bool VkRenderWindow::Create(RendererImpl* /*renderer*/, RenderSurface* surface, const RenderWindowParameters& parameters)
@ -301,6 +301,17 @@ namespace Nz
return std::make_shared<VulkanCommandPool>(*m_device, queueFamilyIndex); return std::make_shared<VulkanCommandPool>(*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) void VkRenderWindow::Present(UInt32 imageIndex, VkSemaphore waitSemaphore)
{ {
NazaraAssert(imageIndex < m_inflightFences.size(), "Invalid image index"); NazaraAssert(imageIndex < m_inflightFences.size(), "Invalid image index");
@ -439,7 +450,8 @@ namespace Nz
{ {
UInt32 imageCount = m_swapchain.GetImageCount(); UInt32 imageCount = m_swapchain.GetImageCount();
Nz::StackArray<Vk::Framebuffer> framebuffers = NazaraStackArray(Vk::Framebuffer, imageCount); m_framebuffers.clear();
m_framebuffers.reserve(imageCount);
for (UInt32 i = 0; i < imageCount; ++i) for (UInt32 i = 0; i < imageCount; ++i)
{ {
std::array<VkImageView, 2> attachments = { m_swapchain.GetImage(i).view, m_depthBufferView }; std::array<VkImageView, 2> attachments = { m_swapchain.GetImage(i).view, m_depthBufferView };
@ -456,14 +468,17 @@ namespace Nz
1U 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; return false;
} }
m_framebuffers.emplace_back(std::move(framebuffer));
} }
m_framebuffer.emplace(framebuffers.data(), framebuffers.size());
return true; return true;
} }

View File

@ -17,7 +17,7 @@
namespace Nz 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 // Ensure \0 at the end of string
StackArray<char> regionNameEOS = NazaraStackArrayNoInit(char, regionName.size() + 1); StackArray<char> regionNameEOS = NazaraStackArrayNoInit(char, regionName.size() + 1);
@ -27,27 +27,10 @@ namespace Nz
m_commandBuffer.BeginDebugRegion(regionNameEOS.data(), color); 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<const VulkanRenderPass&>(renderPass); const VulkanRenderPass& vkRenderPass = static_cast<const VulkanRenderPass&>(renderPass);
const VulkanFramebuffer& vkFramebuffer = static_cast<const VulkanFramebuffer&>(framebuffer);
const Vk::Framebuffer& vkFramebuffer = [&] () -> const Vk::Framebuffer&
{
switch (framebuffer.GetType())
{
case FramebufferType::Texture:
return static_cast<const VulkanTextureFramebuffer&>(framebuffer).GetFramebuffer();
case FramebufferType::Window:
{
const VulkanWindowFramebuffer& vkMultipleFramebuffer = static_cast<const VulkanWindowFramebuffer&>(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())));
}();
std::size_t attachmentCount = vkRenderPass.GetAttachmentCount(); std::size_t attachmentCount = vkRenderPass.GetAttachmentCount();
@ -73,7 +56,7 @@ namespace Nz
VkRenderPassBeginInfo beginInfo = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO }; VkRenderPassBeginInfo beginInfo = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO };
beginInfo.renderPass = vkRenderPass.GetRenderPass(); beginInfo.renderPass = vkRenderPass.GetRenderPass();
beginInfo.framebuffer = vkFramebuffer; beginInfo.framebuffer = vkFramebuffer.GetFramebuffer();
beginInfo.renderArea.offset.x = renderRect.x; beginInfo.renderArea.offset.x = renderRect.x;
beginInfo.renderArea.offset.y = renderRect.y; beginInfo.renderArea.offset.y = renderRect.y;
beginInfo.renderArea.extent.width = renderRect.width; beginInfo.renderArea.extent.width = renderRect.width;
@ -87,7 +70,7 @@ namespace Nz
m_currentSubpassIndex = 0; m_currentSubpassIndex = 0;
} }
void VulkanCommandBufferBuilder::BindIndexBuffer(Nz::AbstractBuffer* indexBuffer, UInt64 offset) void VulkanCommandBufferBuilder::BindIndexBuffer(AbstractBuffer* indexBuffer, UInt64 offset)
{ {
VulkanBuffer& vkBuffer = *static_cast<VulkanBuffer*>(indexBuffer); VulkanBuffer& vkBuffer = *static_cast<VulkanBuffer*>(indexBuffer);
@ -120,7 +103,7 @@ namespace Nz
m_commandBuffer.BindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, vkPipelineLayout.GetPipelineLayout(), set, vkBinding.GetDescriptorSet()); 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<VulkanBuffer*>(vertexBuffer); VulkanBuffer& vkBuffer = *static_cast<VulkanBuffer*>(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); 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); 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) void VulkanCommandBufferBuilder::TextureBarrier(PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, MemoryAccessFlags srcAccessMask, MemoryAccessFlags dstAccessMask, TextureLayout oldLayout, TextureLayout newLayout, const Texture& texture)

View File

@ -13,40 +13,30 @@ namespace Nz
{ {
CommandBufferPtr VulkanCommandPool::BuildCommandBuffer(const std::function<void(CommandBufferBuilder& builder)>& callback) CommandBufferPtr VulkanCommandPool::BuildCommandBuffer(const std::function<void(CommandBufferBuilder& builder)>& callback)
{ {
std::vector<Vk::AutoCommandBuffer> commandBuffers; Vk::AutoCommandBuffer commandBuffer = m_commandPool.AllocateCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY);
auto BuildCommandBuffer = [&](std::size_t imageIndex)
{
Vk::AutoCommandBuffer& commandBuffer = commandBuffers.emplace_back(m_commandPool.AllocateCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY));
if (!commandBuffer->Begin(VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT)) if (!commandBuffer->Begin(VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT))
throw std::runtime_error("failed to begin command buffer: " + TranslateVulkanError(commandBuffer->GetLastErrorCode())); throw std::runtime_error("failed to begin command buffer: " + TranslateVulkanError(commandBuffer->GetLastErrorCode()));
VulkanCommandBufferBuilder builder(commandBuffer.Get(), imageIndex); VulkanCommandBufferBuilder builder(commandBuffer.Get());
callback(builder); callback(builder);
if (!commandBuffer->End()) if (!commandBuffer->End())
throw std::runtime_error("failed to build command buffer: " + TranslateVulkanError(commandBuffer->GetLastErrorCode())); 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);
for (std::size_t i = 0; i < m_commandPools.size(); ++i) for (std::size_t i = 0; i < m_commandPools.size(); ++i)
{ {
if (m_commandPools[i].freeCommands.TestNone()) if (m_commandPools[i].freeCommands.TestNone())
continue; continue;
return AllocateFromPool(i, std::move(commandBuffers)); return AllocateFromPool(i, std::move(commandBuffer));
} }
// No allocation could be made, time to allocate a new pool // No allocation could be made, time to allocate a new pool
std::size_t newPoolIndex = m_commandPools.size(); std::size_t newPoolIndex = m_commandPools.size();
AllocatePool(); AllocatePool();
return AllocateFromPool(newPoolIndex, std::move(commandBuffers)); return AllocateFromPool(newPoolIndex, std::move(commandBuffer));
} }
auto VulkanCommandPool::AllocatePool() -> CommandPool& auto VulkanCommandPool::AllocatePool() -> CommandPool&

View File

@ -49,7 +49,7 @@ namespace Nz
if (!commandBuffer->Begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT)) if (!commandBuffer->Begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT))
throw std::runtime_error("failed to begin command buffer: " + TranslateVulkanError(commandBuffer->GetLastErrorCode())); throw std::runtime_error("failed to begin command buffer: " + TranslateVulkanError(commandBuffer->GetLastErrorCode()));
VulkanCommandBufferBuilder builder(*commandBuffer, m_imageIndex); VulkanCommandBufferBuilder builder(*commandBuffer);
callback(builder); callback(builder);
if (!commandBuffer->End()) if (!commandBuffer->End())
@ -76,7 +76,7 @@ namespace Nz
{ {
VulkanCommandBuffer& vkCommandBuffer = *static_cast<VulkanCommandBuffer*>(commandBuffer); VulkanCommandBuffer& vkCommandBuffer = *static_cast<VulkanCommandBuffer*>(commandBuffer);
return SubmitCommandBuffer(vkCommandBuffer.GetCommandBuffer(m_imageIndex), queueTypeFlags); return SubmitCommandBuffer(vkCommandBuffer.GetCommandBuffer(), queueTypeFlags);
} }
void VulkanRenderImage::SubmitCommandBuffer(VkCommandBuffer commandBuffer, QueueTypeFlags queueTypeFlags) void VulkanRenderImage::SubmitCommandBuffer(VkCommandBuffer commandBuffer, QueueTypeFlags queueTypeFlags)