Renderer: Expose RenderTarget and framebuffers indices
This commit is contained in:
parent
930142b7a7
commit
f14db3f5e9
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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(¤tFrame, invalidateFramebuffer);
|
return RenderFrame(¤tFrame, 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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&
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue