Skip to content

Commit 0bbc130

Browse files
committed
draft
1 parent d19286c commit 0bbc130

2 files changed

Lines changed: 11 additions & 26 deletions

File tree

media_kit_video/windows/mailbox_swap_chain.cc

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -127,26 +127,27 @@ void MailboxSwapChain::ProducerCommit() {
127127
HANDLE 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

152153
HRESULT 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
}

media_kit_video/windows/mailbox_swap_chain.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ class MailboxSwapChain final : public IDXGISwapChain {
127127
Microsoft::WRL::ComPtr<ID3D11Texture2D> texture;
128128
HANDLE shared_handle = nullptr;
129129
Microsoft::WRL::ComPtr<ID3D11Fence> fence;
130-
HANDLE fence_event = nullptr;
131130
uint64_t fence_value = 0;
132131
};
133132

0 commit comments

Comments
 (0)