Skip to content

Commit 824e006

Browse files
bounded to 3x buffering
1 parent 52c99ab commit 824e006

1 file changed

Lines changed: 19 additions & 8 deletions

File tree

ZEngine/ZEngine/Engine.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ namespace ZEngine
2424
static std::atomic_int g_mailbox_ready_idx = -1;
2525
static std::condition_variable g_mailbox_ready_cv = {};
2626

27+
static int g_write_idx = 0;
28+
static int g_pending_idx = -1;
29+
2730
void Engine::Initialize(ZEngine::Core::Memory::ArenaAllocator* arena, Windows::WindowConfigurationPtr window_cfg_ptr, Applications::GameApplicationPtr app)
2831
{
2932
g_engine_ctx = ZPushStruct(arena, EngineContext);
@@ -116,11 +119,13 @@ namespace ZEngine
116119

117120
g_app->Update(dt);
118121

119-
int next_payload_idx = writable_payload_idx++ % k_mailbox_buffer_size;
120122
{
121-
std::lock_guard lg(g_mailbox_mut);
123+
std::unique_lock l(g_mailbox_mut);
124+
g_mailbox_ready_cv.wait(l, [&] { return g_pending_idx == -1; });
122125

123-
auto& r_payload = g_mailbox_payloads[next_payload_idx];
126+
int next_payload_idx = g_write_idx;
127+
128+
auto& r_payload = g_mailbox_payloads[next_payload_idx];
124129
r_payload.UIOverlay.DrawDataIndex = 0;
125130

126131
if (g_app->EnableRenderOverlay)
@@ -134,7 +139,9 @@ namespace ZEngine
134139
}
135140

136141
g_app->PrepareScene(r_payload);
137-
g_mailbox_ready_idx.store(next_payload_idx, std::memory_order_release);
142+
143+
g_pending_idx = next_payload_idx;
144+
g_write_idx = (g_write_idx + 1) % k_mailbox_buffer_size;
138145
}
139146
g_mailbox_ready_cv.notify_one();
140147
}
@@ -150,17 +157,19 @@ namespace ZEngine
150157
int idx = -1;
151158
{
152159
std::unique_lock l(g_mailbox_mut);
153-
g_mailbox_ready_cv.wait(l, [&] { return (g_mailbox_ready_idx.load(std::memory_order_acquire) >= 0) || s_request_terminate.load(std::memory_order_acquire); });
160+
g_mailbox_ready_cv.wait(l, [&] { return g_pending_idx != -1; });
154161

155-
if (s_request_terminate.load(std::memory_order_relaxed))
162+
if (s_request_terminate.load(std::memory_order_acquire))
156163
{
157164
break;
158165
}
159166

160-
idx = g_mailbox_ready_idx.load(std::memory_order_relaxed);
161-
g_mailbox_ready_idx.store(-1, std::memory_order_release);
167+
idx = g_pending_idx;
168+
g_pending_idx = -1;
162169
}
163170

171+
ZENGINE_VALIDATE_ASSERT(idx > -1, "Invalid payload index")
172+
164173
Applications::RenderPayload& r_payload = g_mailbox_payloads[idx];
165174

166175
auto pipeline = g_app->RenderPipeline;
@@ -177,6 +186,8 @@ namespace ZEngine
177186
pipeline->RenderOverlay(r_payload.UIOverlay);
178187
}
179188
pipeline->EndFrame();
189+
190+
g_mailbox_ready_cv.notify_one();
180191
}
181192
}
182193

0 commit comments

Comments
 (0)