Skip to content

Commit e8724a1

Browse files
improved swapchain resizing logic
1 parent f4770b4 commit e8724a1

File tree

13 files changed

+412
-423
lines changed

13 files changed

+412
-423
lines changed

ZEngine/ZEngine/Applications/AppRenderPipeline.cpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,19 @@ namespace ZEngine::Applications
3737

3838
void AppRenderPipeline::BeginFrame()
3939
{
40-
Device->AcquireNextImage();
40+
Device->SwapchainPtr->AcquireNextImage();
4141

4242
for (uint8_t thread_idx = 0; thread_idx < Device->CommandBufferMgr->TotalThreadCount; ++thread_idx)
4343
{
44-
Device->CommandBufferMgr->ResetPool(Device->CurrentFrameIndex, thread_idx);
44+
Device->CommandBufferMgr->ResetPool(Device->SwapchainPtr->CurrentFrameIndex, thread_idx);
4545
}
4646

4747
// uint8_t render_worker_thread_idx = RenderThreadIndex + 1;
4848
// for (uint8_t worker_thread_idx = 0; worker_thread_idx < RenderWorkerThreadCount; ++worker_thread_idx)
4949
// {
5050
// auto thread_idx = render_worker_thread_idx + worker_thread_idx;
51-
52-
// ExecutableCommandBuffers[worker_thread_idx] = Device->CommandBufferMgr->GetCommandBuffer(Device->CurrentFrameIndex, thread_idx, 0, false);
5351
// }
54-
CurrentCmdBuf = Device->CommandBufferMgr->GetCommandBuffer(Device->CurrentFrameIndex, RenderMainThreadIndex, 0, true);
52+
CurrentCmdBuf = Device->CommandBufferMgr->GetCommandBuffer(Device->SwapchainPtr->CurrentFrameIndex, RenderMainThreadIndex, 0, true);
5553
}
5654

5755
void AppRenderPipeline::EndFrame()
@@ -62,7 +60,7 @@ namespace ZEngine::Applications
6260

6361
void AppRenderPipeline::RenderScene(Rendering::Cameras::CameraPtr camera, Rendering::Scenes::RenderScenePtr scene)
6462
{
65-
if (scene->TransformBufferDirty[Device->CurrentFrameIndex].load(std::memory_order_acquire) || scene->MeshAllocationDirty[Device->CurrentFrameIndex].load(std::memory_order_acquire))
63+
if (scene->TransformBufferDirty[Device->SwapchainPtr->CurrentFrameIndex].load(std::memory_order_acquire) || scene->MeshAllocationDirty[Device->SwapchainPtr->CurrentFrameIndex].load(std::memory_order_acquire))
6664
{
6765
auto gpu_scene_data = SceneRenderer->RenderSceneData;
6866

@@ -73,21 +71,21 @@ namespace ZEngine::Applications
7371

7472
auto indirect_buffer_set = Device->IndirectBufferSetManager.Access(gpu_scene_data->IndirectBufferHandle);
7573

76-
auto vtx_buffer = vtx_buffer_set->At(Device->CurrentFrameIndex);
77-
auto idx_buffer = idx_buffer_set->At(Device->CurrentFrameIndex);
78-
auto transform_buffer = transform_buffer_set->At(Device->CurrentFrameIndex);
79-
auto rd_buffer = rd_buffer_set->At(Device->CurrentFrameIndex);
80-
auto indirect_buffer = indirect_buffer_set->At(Device->CurrentFrameIndex);
74+
auto vtx_buffer = vtx_buffer_set->At(Device->SwapchainPtr->CurrentFrameIndex);
75+
auto idx_buffer = idx_buffer_set->At(Device->SwapchainPtr->CurrentFrameIndex);
76+
auto transform_buffer = transform_buffer_set->At(Device->SwapchainPtr->CurrentFrameIndex);
77+
auto rd_buffer = rd_buffer_set->At(Device->SwapchainPtr->CurrentFrameIndex);
78+
auto indirect_buffer = indirect_buffer_set->At(Device->SwapchainPtr->CurrentFrameIndex);
8179

8280
auto& suballocs = scene->NodeSubMeshesAllocations;
8381

84-
if (scene->TransformBufferDirty[Device->CurrentFrameIndex].exchange(false, std::memory_order_acquire))
82+
if (scene->TransformBufferDirty[Device->SwapchainPtr->CurrentFrameIndex].exchange(false, std::memory_order_acquire))
8583
{
8684
auto transform_data_view = ArrayView{scene->GlobalTransforms};
8785
transform_buffer->Write(transform_data_view);
8886
}
8987

90-
if (scene->MeshAllocationDirty[Device->CurrentFrameIndex].exchange(false, std::memory_order_acquire))
88+
if (scene->MeshAllocationDirty[Device->SwapchainPtr->CurrentFrameIndex].exchange(false, std::memory_order_acquire))
9189
{
9290
auto scratch = ZGetScratch(&LocalArena);
9391

@@ -150,7 +148,7 @@ namespace ZEngine::Applications
150148
return;
151149
}
152150

153-
auto current_framebuffer = Device->SwapchainFramebuffers[Device->SwapchainImageIndex];
151+
auto current_framebuffer = Device->SwapchainPtr->SwapchainFramebuffers[Device->SwapchainPtr->SwapchainImageIndex];
154152

155153
CurrentCmdBuf->BeginRenderPass(ImguiRenderer->UIPass, current_framebuffer, true);
156154
{
@@ -160,13 +158,13 @@ namespace ZEngine::Applications
160158
auto vertex_buffer_set = Device->VertexBufferSetManager.Access(payload.VBHandle);
161159
auto index_buffer_set = Device->IndexBufferSetManager.Access(payload.IdxBHandle);
162160

163-
auto vertex_buffer = vertex_buffer_set->At(Device->CurrentFrameIndex);
164-
auto index_buffer = index_buffer_set->At(Device->CurrentFrameIndex);
161+
auto vertex_buffer = vertex_buffer_set->At(Device->SwapchainPtr->CurrentFrameIndex);
162+
auto index_buffer = index_buffer_set->At(Device->SwapchainPtr->CurrentFrameIndex);
165163

166164
vertex_buffer->Write(vtx_data_view);
167165
index_buffer->Write(idx_data_view);
168166

169-
auto ui_second_cb = Device->CommandBufferMgr->GetCommandBuffer(Device->CurrentFrameIndex, RenderMainThreadIndex, UICommandBufferIndex, false);
167+
auto ui_second_cb = Device->CommandBufferMgr->GetCommandBuffer(Device->SwapchainPtr->CurrentFrameIndex, RenderMainThreadIndex, UICommandBufferIndex, false);
170168
ui_second_cb->ResetState();
171169
ui_second_cb->BeginSecondary(ImguiRenderer->UIPass, current_framebuffer);
172170
ui_second_cb->SetViewport(ImguiRenderer->UIPass->GetRenderAreaWidth(), ImguiRenderer->UIPass->GetRenderAreaHeight());
@@ -191,7 +189,7 @@ namespace ZEngine::Applications
191189
ui_second_cb->SetScissor(scissor_cmd.w, scissor_cmd.h, scissor_cmd.x, scissor_cmd.y);
192190
pc_data.TextureId = payload.TextureIds[i];
193191
ui_second_cb->PushConstants(VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(Rendering::Renderers::PushConstantData), &pc_data);
194-
ui_second_cb->BindDescriptorSets(Device->CurrentFrameIndex);
192+
ui_second_cb->BindDescriptorSets(Device->SwapchainPtr->CurrentFrameIndex);
195193
ui_second_cb->DrawIndexed(indexed_cmd.IdxCount, indexed_cmd.InstanceCount, indexed_cmd.FirstIndex, indexed_cmd.VertexOffset, indexed_cmd.FirstInstance);
196194
}
197195

ZEngine/ZEngine/Applications/AppRenderPipeline.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ namespace ZEngine::Applications
2525
Rendering::Renderers::GraphicRendererPtr SceneRenderer = nullptr;
2626
Rendering::Renderers::ImGUIRendererPtr ImguiRenderer = nullptr;
2727
Hardwares::CommandBufferPtr CurrentCmdBuf = nullptr;
28-
Helpers::ThreadSafeQueue<RenderPayload> Payloads = {};
2928

3029
ZEngine::Core::Memory::ArenaAllocator LocalArena = {};
3130

ZEngine/ZEngine/Engine.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -100,19 +100,6 @@ namespace ZEngine
100100
break;
101101
}
102102

103-
auto device = g_engine_ctx->Device;
104-
105-
if (device->SwapchainResizeRequested)
106-
{
107-
{
108-
std::unique_lock l(g_engine_ctx->Device->SwapchainMutex);
109-
device->ResizeSwapchain();
110-
device->SwapchainResizeHandled = true;
111-
device->SwapchainResizeRequested = false;
112-
}
113-
device->SwapchainCond.notify_all();
114-
}
115-
116103
auto window = g_engine_ctx->Window;
117104

118105
float dt = window->GetDeltaTime();

ZEngine/ZEngine/Hardwares/AsyncResourceLoader.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace ZEngine::Hardwares
2525
Device = device;
2626
BufferManager = ZPushStructCtor(Device->Arena, CommandBufferManager);
2727

28-
BufferManager->Initialize(Device, 1);
28+
BufferManager->Initialize(Device, Device->SwapchainPtr->SwapchainImageCount, 1);
2929
Helpers::ThreadPoolHelper::Submit([this] { Run(); });
3030
}
3131

@@ -109,7 +109,7 @@ namespace ZEngine::Hardwares
109109
barrier_spec_0.SourceQueueFamily = Device->TransferFamilyIndex;
110110
barrier_spec_0.DestinationQueueFamily = Device->GraphicFamilyIndex;
111111
Primitives::ImageMemoryBarrier barrier_0{barrier_spec_0};
112-
auto command_buffer_0 = BufferManager->GetInstantCommandBuffer(QueueType::TRANSFER_QUEUE, Device->CurrentFrameIndex, 0, 2, true);
112+
auto command_buffer_0 = BufferManager->GetInstantCommandBuffer(QueueType::TRANSFER_QUEUE, Device->SwapchainPtr->CurrentFrameIndex, 0, 2, true);
113113
{
114114
command_buffer_0.Buffer->TransitionImageLayout(barrier_0);
115115
img_buf->Layout = barrier_spec_0.NewLayout;
@@ -134,7 +134,7 @@ namespace ZEngine::Hardwares
134134
barrier_spec.DestinationQueueFamily = Device->GraphicFamilyIndex;
135135
Primitives::ImageMemoryBarrier barrier{barrier_spec};
136136

137-
auto command_buffer = BufferManager->GetInstantCommandBuffer(QueueType::GRAPHIC_QUEUE, Device->CurrentFrameIndex, 0, 2, true);
137+
auto command_buffer = BufferManager->GetInstantCommandBuffer(QueueType::GRAPHIC_QUEUE, Device->SwapchainPtr->CurrentFrameIndex, 0, 2, true);
138138
{
139139
command_buffer.Buffer->TransitionImageLayout(barrier);
140140
img_buf->Layout = barrier_spec.NewLayout;
@@ -155,7 +155,7 @@ namespace ZEngine::Hardwares
155155
auto img_buf = Device->Image2DBufferManager.Access(texture->BufferHandle);
156156
uint32_t image_aspect = (texture->Specification.Format == Specifications::ImageFormat::DEPTH_STENCIL_FROM_DEVICE) ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
157157

158-
auto command_buffer = BufferManager->GetInstantCommandBuffer(QueueType::TRANSFER_QUEUE, Device->CurrentFrameIndex, 0, 2, true);
158+
auto command_buffer = BufferManager->GetInstantCommandBuffer(QueueType::TRANSFER_QUEUE, Device->SwapchainPtr->CurrentFrameIndex, 0, 2, true);
159159
{
160160
auto image_handle = img_buf->GetHandle();
161161
auto& image_buffer = img_buf->GetBuffer();

0 commit comments

Comments
 (0)