Skip to content

Commit 825a9b4

Browse files
fixed resizing issue on macos
1 parent e8724a1 commit 825a9b4

File tree

14 files changed

+368
-353
lines changed

14 files changed

+368
-353
lines changed

ZEngine/ZEngine/Applications/AppRenderPipeline.cpp

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ namespace ZEngine::Applications
1818

1919
SceneRenderer->Initialize(Device);
2020
ImguiRenderer->Initialize(Device);
21+
22+
for (size_t i = 0; i < MaxMailBoxBufferCount; ++i)
23+
{
24+
RenderPayloads[i].UIOverlay.IndexedCmds.resize(100);
25+
RenderPayloads[i].UIOverlay.ScissorCmds.resize(100);
26+
RenderPayloads[i].UIOverlay.TextureIds.resize(100);
27+
}
2128
}
2229

2330
void AppRenderPipeline::Shutdown()
@@ -37,30 +44,32 @@ namespace ZEngine::Applications
3744

3845
void AppRenderPipeline::BeginFrame()
3946
{
40-
Device->SwapchainPtr->AcquireNextImage();
47+
auto swpachain = Device->SwapchainPtr;
48+
49+
swpachain->AcquireNextImage(CurrentMailBoxBufferHead);
4150

4251
for (uint8_t thread_idx = 0; thread_idx < Device->CommandBufferMgr->TotalThreadCount; ++thread_idx)
4352
{
44-
Device->CommandBufferMgr->ResetPool(Device->SwapchainPtr->CurrentFrameIndex, thread_idx);
53+
Device->CommandBufferMgr->ResetPool(swpachain->CurrentFrame->Index, thread_idx);
4554
}
4655

4756
// uint8_t render_worker_thread_idx = RenderThreadIndex + 1;
4857
// for (uint8_t worker_thread_idx = 0; worker_thread_idx < RenderWorkerThreadCount; ++worker_thread_idx)
4958
// {
5059
// auto thread_idx = render_worker_thread_idx + worker_thread_idx;
5160
// }
52-
CurrentCmdBuf = Device->CommandBufferMgr->GetCommandBuffer(Device->SwapchainPtr->CurrentFrameIndex, RenderMainThreadIndex, 0, true);
61+
CurrentCmdBuf = Device->CommandBufferMgr->GetCommandBuffer(swpachain->CurrentFrame->Index, RenderMainThreadIndex, 0, true);
5362
}
5463

5564
void AppRenderPipeline::EndFrame()
5665
{
5766
Device->CommandBufferMgr->EnqueueBuffer(CurrentCmdBuf);
58-
Device->Present();
67+
Device->SwapchainPtr->Present();
5968
}
6069

6170
void AppRenderPipeline::RenderScene(Rendering::Cameras::CameraPtr camera, Rendering::Scenes::RenderScenePtr scene)
6271
{
63-
if (scene->TransformBufferDirty[Device->SwapchainPtr->CurrentFrameIndex].load(std::memory_order_acquire) || scene->MeshAllocationDirty[Device->SwapchainPtr->CurrentFrameIndex].load(std::memory_order_acquire))
72+
if (scene->TransformBufferDirty[Device->SwapchainPtr->CurrentFrame->Index].load(std::memory_order_acquire) || scene->MeshAllocationDirty[Device->SwapchainPtr->CurrentFrame->Index].load(std::memory_order_acquire))
6473
{
6574
auto gpu_scene_data = SceneRenderer->RenderSceneData;
6675

@@ -71,21 +80,21 @@ namespace ZEngine::Applications
7180

7281
auto indirect_buffer_set = Device->IndirectBufferSetManager.Access(gpu_scene_data->IndirectBufferHandle);
7382

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);
83+
auto vtx_buffer = vtx_buffer_set->At(Device->SwapchainPtr->CurrentFrame->Index);
84+
auto idx_buffer = idx_buffer_set->At(Device->SwapchainPtr->CurrentFrame->Index);
85+
auto transform_buffer = transform_buffer_set->At(Device->SwapchainPtr->CurrentFrame->Index);
86+
auto rd_buffer = rd_buffer_set->At(Device->SwapchainPtr->CurrentFrame->Index);
87+
auto indirect_buffer = indirect_buffer_set->At(Device->SwapchainPtr->CurrentFrame->Index);
7988

8089
auto& suballocs = scene->NodeSubMeshesAllocations;
8190

82-
if (scene->TransformBufferDirty[Device->SwapchainPtr->CurrentFrameIndex].exchange(false, std::memory_order_acquire))
91+
if (scene->TransformBufferDirty[Device->SwapchainPtr->CurrentFrame->Index].exchange(false, std::memory_order_acquire))
8392
{
8493
auto transform_data_view = ArrayView{scene->GlobalTransforms};
8594
transform_buffer->Write(transform_data_view);
8695
}
8796

88-
if (scene->MeshAllocationDirty[Device->SwapchainPtr->CurrentFrameIndex].exchange(false, std::memory_order_acquire))
97+
if (scene->MeshAllocationDirty[Device->SwapchainPtr->CurrentFrame->Index].exchange(false, std::memory_order_acquire))
8998
{
9099
auto scratch = ZGetScratch(&LocalArena);
91100

@@ -148,7 +157,7 @@ namespace ZEngine::Applications
148157
return;
149158
}
150159

151-
auto current_framebuffer = Device->SwapchainPtr->SwapchainFramebuffers[Device->SwapchainPtr->SwapchainImageIndex];
160+
auto current_framebuffer = Device->SwapchainPtr->SwapchainFramebuffers[Device->SwapchainPtr->CurrentFrame->ImageIndex];
152161

153162
CurrentCmdBuf->BeginRenderPass(ImguiRenderer->UIPass, current_framebuffer, true);
154163
{
@@ -158,13 +167,13 @@ namespace ZEngine::Applications
158167
auto vertex_buffer_set = Device->VertexBufferSetManager.Access(payload.VBHandle);
159168
auto index_buffer_set = Device->IndexBufferSetManager.Access(payload.IdxBHandle);
160169

161-
auto vertex_buffer = vertex_buffer_set->At(Device->SwapchainPtr->CurrentFrameIndex);
162-
auto index_buffer = index_buffer_set->At(Device->SwapchainPtr->CurrentFrameIndex);
170+
auto vertex_buffer = vertex_buffer_set->At(Device->SwapchainPtr->CurrentFrame->Index);
171+
auto index_buffer = index_buffer_set->At(Device->SwapchainPtr->CurrentFrame->Index);
163172

164173
vertex_buffer->Write(vtx_data_view);
165174
index_buffer->Write(idx_data_view);
166175

167-
auto ui_second_cb = Device->CommandBufferMgr->GetCommandBuffer(Device->SwapchainPtr->CurrentFrameIndex, RenderMainThreadIndex, UICommandBufferIndex, false);
176+
auto ui_second_cb = Device->CommandBufferMgr->GetCommandBuffer(Device->SwapchainPtr->CurrentFrame->Index, RenderMainThreadIndex, UICommandBufferIndex, false);
168177
ui_second_cb->ResetState();
169178
ui_second_cb->BeginSecondary(ImguiRenderer->UIPass, current_framebuffer);
170179
ui_second_cb->SetViewport(ImguiRenderer->UIPass->GetRenderAreaWidth(), ImguiRenderer->UIPass->GetRenderAreaHeight());
@@ -189,7 +198,7 @@ namespace ZEngine::Applications
189198
ui_second_cb->SetScissor(scissor_cmd.w, scissor_cmd.h, scissor_cmd.x, scissor_cmd.y);
190199
pc_data.TextureId = payload.TextureIds[i];
191200
ui_second_cb->PushConstants(VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(Rendering::Renderers::PushConstantData), &pc_data);
192-
ui_second_cb->BindDescriptorSets(Device->SwapchainPtr->CurrentFrameIndex);
201+
ui_second_cb->BindDescriptorSets(Device->SwapchainPtr->CurrentFrame->Index);
193202
ui_second_cb->DrawIndexed(indexed_cmd.IdxCount, indexed_cmd.InstanceCount, indexed_cmd.FirstIndex, indexed_cmd.VertexOffset, indexed_cmd.FirstInstance);
194203
}
195204

ZEngine/ZEngine/Applications/AppRenderPipeline.h

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55

66
namespace ZEngine::Applications
77
{
8+
struct alignas(std::hardware_destructive_interference_size) PaddedAtomicInt
9+
{
10+
std::atomic_uint32_t value = 0;
11+
};
12+
813
struct RenderPayload
914
{
1015
bool RenderUIOverlay = false;
@@ -18,15 +23,19 @@ namespace ZEngine::Applications
1823

1924
struct AppRenderPipeline
2025
{
21-
const uint8_t RenderMainThreadIndex = 0;
22-
uint8_t RenderWorkerThreadCount = 0;
23-
uint8_t UICommandBufferIndex = 0xff;
24-
Hardwares::VulkanDevicePtr Device = nullptr;
25-
Rendering::Renderers::GraphicRendererPtr SceneRenderer = nullptr;
26-
Rendering::Renderers::ImGUIRendererPtr ImguiRenderer = nullptr;
27-
Hardwares::CommandBufferPtr CurrentCmdBuf = nullptr;
28-
29-
ZEngine::Core::Memory::ArenaAllocator LocalArena = {};
26+
const uint8_t MaxMailBoxBufferCount = 3;
27+
const uint8_t RenderMainThreadIndex = 0;
28+
uint8_t RenderWorkerThreadCount = 0;
29+
uint8_t UICommandBufferIndex = 0xff;
30+
uint32_t CurrentMailBoxBufferHead = 0;
31+
PaddedAtomicInt MailBoxBufferHead = {};
32+
PaddedAtomicInt MailBoxBufferTail = {};
33+
RenderPayload RenderPayloads[3] = {};
34+
ZEngine::Core::Memory::ArenaAllocator LocalArena = {};
35+
Hardwares::VulkanDevicePtr Device = nullptr;
36+
Rendering::Renderers::GraphicRendererPtr SceneRenderer = nullptr;
37+
Rendering::Renderers::ImGUIRendererPtr ImguiRenderer = nullptr;
38+
Hardwares::CommandBufferPtr CurrentCmdBuf = nullptr;
3039

3140
void Initialize(Hardwares::VulkanDevicePtr device);
3241
void Shutdown();

ZEngine/ZEngine/Engine.cpp

Lines changed: 28 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,12 @@ using namespace std::chrono_literals;
1717

1818
namespace ZEngine
1919
{
20-
21-
struct alignas(std::hardware_destructive_interference_size) PaddedAtomicInt
22-
{
23-
std::atomic_uint32_t value;
24-
};
25-
2620
static std::atomic_bool s_request_terminate = false;
2721
static EngineContextPtr g_engine_ctx = nullptr;
2822
static Applications::GameApplicationPtr g_app = nullptr;
2923
static Applications::AppRenderPipelinePtr g_appRenderPipeline = nullptr;
3024
static std::thread g_render_thread = {};
3125

32-
static PaddedAtomicInt g_head{0};
33-
static PaddedAtomicInt g_tail{0};
34-
static constexpr uint8_t k_mailbox_buffer_size = 3;
35-
static Applications::RenderPayload g_mailbox_payloads[k_mailbox_buffer_size] = {};
36-
3726
void Engine::Initialize(ZEngine::Core::Memory::ArenaAllocator* arena, Windows::WindowConfigurationPtr window_cfg_ptr, Applications::GameApplicationPtr app)
3827
{
3928
g_engine_ctx = ZPushStruct(arena, EngineContext);
@@ -46,7 +35,7 @@ namespace ZEngine
4635

4736
g_appRenderPipeline = ZPushStructCtor(arena, Applications::AppRenderPipeline);
4837

49-
g_engine_ctx->Device->Initialize(arena, window, (Helpers::ThreadPoolHelper::Pool->MaxThreadCount / 2u));
38+
g_engine_ctx->Device->Initialize(arena, window, (Helpers::ThreadPoolHelper::Pool->MaxThreadCount / 2u) /*, k_mailbox_buffer_size */);
5039
g_appRenderPipeline->Initialize(g_engine_ctx->Device);
5140

5241
Managers::AssetManager::Initialize(arena, g_engine_ctx->Device, app->WorkingSpacePath);
@@ -55,12 +44,6 @@ namespace ZEngine
5544
app->CurrentWindow = g_engine_ctx->Window;
5645
g_app = app;
5746

58-
for (size_t i = 0; i < k_mailbox_buffer_size; ++i)
59-
{
60-
g_mailbox_payloads[i].UIOverlay.IndexedCmds.resize(100);
61-
g_mailbox_payloads[i].UIOverlay.ScissorCmds.resize(100);
62-
g_mailbox_payloads[i].UIOverlay.TextureIds.resize(100);
63-
}
6447
ZENGINE_CORE_INFO("Engine initialized")
6548
}
6649

@@ -113,34 +96,35 @@ namespace ZEngine
11396

11497
g_app->Update(dt);
11598

116-
uint32_t head = g_head.value.load(std::memory_order_relaxed);
99+
auto pipeline = g_app->RenderPipeline;
117100

118-
uint32_t next = (head + 1) % k_mailbox_buffer_size;
119-
120-
uint32_t tail = g_tail.value.load(std::memory_order_acquire);
101+
uint32_t head = pipeline->MailBoxBufferHead.value.load(std::memory_order_relaxed);
102+
uint32_t next = (head + 1) % pipeline->MaxMailBoxBufferCount;
103+
uint32_t tail = pipeline->MailBoxBufferTail.value.load(std::memory_order_acquire);
121104

122105
// Buffer full, drop frame (non-blocking)
123106
if (next == tail)
124-
continue;
125107
{
126-
auto& r_payload = g_mailbox_payloads[head];
127-
r_payload.UIOverlay.DrawDataIndex = 0;
128-
r_payload.RenderUIOverlay = false;
129-
130-
if (g_app->EnableRenderOverlay)
131-
{
132-
g_app->RenderPipeline->BeginOverlayFrame();
133-
g_app->OnRenderUI();
134-
g_app->RenderPipeline->EndOverlayFrame();
108+
continue;
109+
}
135110

136-
r_payload.RenderUIOverlay = true;
137-
g_appRenderPipeline->FillOverlayPayload(r_payload.UIOverlay);
138-
}
111+
auto& r_payload = pipeline->RenderPayloads[head];
112+
r_payload.UIOverlay.DrawDataIndex = 0;
113+
r_payload.RenderUIOverlay = false;
139114

140-
g_app->PrepareScene(r_payload);
115+
if (g_app->EnableRenderOverlay)
116+
{
117+
pipeline->BeginOverlayFrame();
118+
g_app->OnRenderUI();
119+
pipeline->EndOverlayFrame();
141120

142-
g_head.value.store(next, std::memory_order_release);
121+
r_payload.RenderUIOverlay = true;
122+
pipeline->FillOverlayPayload(r_payload.UIOverlay);
143123
}
124+
125+
g_app->PrepareScene(r_payload);
126+
127+
pipeline->MailBoxBufferHead.value.store(next, std::memory_order_release);
144128
}
145129
}
146130

@@ -164,9 +148,10 @@ namespace ZEngine
164148
break;
165149
}
166150

167-
uint32_t tail = g_tail.value.load(std::memory_order_relaxed);
151+
auto pipeline = g_app->RenderPipeline;
168152

169-
uint32_t head = g_head.value.load(std::memory_order_acquire);
153+
uint32_t tail = pipeline->MailBoxBufferTail.value.load(std::memory_order_relaxed);
154+
uint32_t head = pipeline->MailBoxBufferHead.value.load(std::memory_order_acquire);
170155

171156
// Buffer empty
172157
if (tail == head)
@@ -175,9 +160,8 @@ namespace ZEngine
175160
continue;
176161
}
177162

178-
Applications::RenderPayload& r_payload = g_mailbox_payloads[tail];
179-
180-
auto pipeline = g_app->RenderPipeline;
163+
pipeline->CurrentMailBoxBufferHead = tail;
164+
Applications::RenderPayload& r_payload = pipeline->RenderPayloads[tail];
181165

182166
if (r_payload.ResizeRenderTarget)
183167
{
@@ -193,9 +177,9 @@ namespace ZEngine
193177
}
194178
pipeline->EndFrame();
195179

196-
uint32_t next = (tail + 1) % k_mailbox_buffer_size;
180+
uint32_t next = (tail + 1) % pipeline->MaxMailBoxBufferCount;
197181

198-
g_tail.value.store(next, std::memory_order_release);
182+
pipeline->MailBoxBufferTail.value.store(next, std::memory_order_release);
199183
}
200184
}
201185

ZEngine/ZEngine/Hardwares/AsyncResourceLoader.cpp

Lines changed: 5 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, Device->SwapchainPtr->SwapchainImageCount, 1);
28+
BufferManager->Initialize(Device, Device->SwapchainPtr->BufferredFrameCount, 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->SwapchainPtr->CurrentFrameIndex, 0, 2, true);
112+
auto command_buffer_0 = BufferManager->GetInstantCommandBuffer(QueueType::TRANSFER_QUEUE, Device->SwapchainPtr->CurrentFrame->Index, 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->SwapchainPtr->CurrentFrameIndex, 0, 2, true);
137+
auto command_buffer = BufferManager->GetInstantCommandBuffer(QueueType::GRAPHIC_QUEUE, (Device->SwapchainPtr->CurrentFrame == nullptr ? 0u : Device->SwapchainPtr->CurrentFrame->Index), 0, 2, true);
138138
{
139139
command_buffer.Buffer->TransitionImageLayout(barrier);
140140
img_buf->Layout = barrier_spec.NewLayout;
@@ -155,7 +155,8 @@ 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->SwapchainPtr->CurrentFrameIndex, 0, 2, true);
158+
// todo(jeanphilippekernel): we should weak acquire the frame index
159+
auto command_buffer = BufferManager->GetInstantCommandBuffer(QueueType::TRANSFER_QUEUE, (Device->SwapchainPtr->CurrentFrame == nullptr ? 0u : Device->SwapchainPtr->CurrentFrame->Index), 0, 2, true);
159160
{
160161
auto image_handle = img_buf->GetHandle();
161162
auto& image_buffer = img_buf->GetBuffer();

0 commit comments

Comments
 (0)