@@ -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