@@ -127,26 +127,27 @@ void MailboxSwapChain::ProducerCommit() {
127127HANDLE MailboxSwapChain::ConsumerAcquire () {
128128 uint32_t expected = mailbox_state_.load (std::memory_order_acquire);
129129 if (!(expected & 0x4u )) {
130- // No new frame — we already waited for this slot last time we acquired it.
131130 return slots_[read_slot_].shared_handle ;
132131 }
132+
133+ int peek_slot = static_cast <int >(expected & 0x3u );
134+ if (slots_[peek_slot].fence ->GetCompletedValue () < slots_[peek_slot].fence_value ) {
135+ return slots_[read_slot_].shared_handle ;
136+ }
137+
133138 const uint32_t desired = static_cast <uint32_t >(read_slot_); // dirty=0
134139 while (!mailbox_state_.compare_exchange_weak (
135140 expected, desired, std::memory_order_acq_rel,
136141 std::memory_order_relaxed)) {
137142 if (!(expected & 0x4u ))
138143 return slots_[read_slot_].shared_handle ;
144+ peek_slot = static_cast <int >(expected & 0x3u );
145+ if (slots_[peek_slot].fence ->GetCompletedValue () < slots_[peek_slot].fence_value )
146+ return slots_[read_slot_].shared_handle ;
139147 }
140- read_slot_ = static_cast <int >(expected & 0x3u );
141148
142- auto & rs = slots_[read_slot_];
143- if (rs.fence ->GetCompletedValue () < rs.fence_value ) {
144- if (SUCCEEDED (rs.fence ->SetEventOnCompletion (rs.fence_value ,
145- rs.fence_event ))) {
146- ::WaitForSingleObject (rs.fence_event, INFINITE);
147- }
148- }
149- return rs.shared_handle ;
149+ read_slot_ = static_cast <int >(expected & 0x3u );
150+ return slots_[read_slot_].shared_handle ;
150151}
151152
152153HRESULT MailboxSwapChain::Resize (int32_t width, int32_t height) {
@@ -220,17 +221,6 @@ HRESULT MailboxSwapChain::AllocateSlots() {
220221 return hr;
221222 }
222223 slots_[i].fence_value = 0 ;
223-
224- slots_[i].fence_event =
225- ::CreateEventW (nullptr , /* bManualReset=*/ FALSE , /* bInitialState=*/ FALSE ,
226- nullptr );
227- if (!slots_[i].fence_event ) {
228- const HRESULT hrE = HRESULT_FROM_WIN32 (::GetLastError ());
229- std::cout << " media_kit: MailboxSwapChain: CreateEvent slot " << i
230- << " failed (hr=0x" << std::hex << hrE << std::dec << " )"
231- << std::endl;
232- return hrE;
233- }
234224 }
235225
236226 return S_OK;
@@ -242,9 +232,5 @@ void MailboxSwapChain::ReleaseSlots() {
242232 slot.shared_handle = nullptr ;
243233 slot.fence .Reset ();
244234 slot.fence_value = 0 ;
245- if (slot.fence_event ) {
246- ::CloseHandle (slot.fence_event);
247- slot.fence_event = nullptr ;
248- }
249235 }
250236}
0 commit comments