[PATCH v3 2/6] dxgi: Signal frame latency event on present as necessary.
Philip Rebohle
philip.rebohle at tu-dortmund.de
Thu Apr 16 11:12:43 CDT 2020
Signed-off-by: Philip Rebohle <philip.rebohle at tu-dortmund.de>
---
v2: Do not manually reset the event.
v3: FIXME -> ERR
dlls/dxgi/swapchain.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 58353ec1b7..bab3a7157e 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -1097,6 +1097,9 @@ struct d3d12_swapchain
ID3D12Fence *frame_latency_fence;
HANDLE frame_latency_event;
+
+ uint64_t frame_number;
+ uint32_t frame_latency;
};
static DXGI_FORMAT dxgi_format_from_vk_format(VkFormat vk_format)
@@ -2166,6 +2169,25 @@ static HRESULT d3d12_swapchain_present(struct d3d12_swapchain *swapchain,
return hresult_from_vk_result(vr);
}
+ if (swapchain->desc.Flags & DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT)
+ {
+ ++swapchain->frame_number;
+
+ if (FAILED(hr = ID3D12CommandQueue_Signal(swapchain->command_queue,
+ swapchain->frame_latency_fence, swapchain->frame_number)))
+ {
+ ERR("Failed to signal frame latency fence, hr %#x.\n", hr);
+ return hr;
+ }
+
+ if (FAILED(hr = ID3D12Fence_SetEventOnCompletion(swapchain->frame_latency_fence,
+ swapchain->frame_number - swapchain->frame_latency, swapchain->frame_latency_event)))
+ {
+ ERR("Failed to enqueue frame latency event, hr %#x.\n", hr);
+ return hr;
+ }
+ }
+
swapchain->current_buffer_index = (swapchain->current_buffer_index + 1) % swapchain->desc.BufferCount;
vr = d3d12_swapchain_acquire_next_back_buffer(swapchain);
if (vr == VK_ERROR_OUT_OF_DATE_KHR)
@@ -2994,6 +3016,9 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
if (swapchain_desc->Flags & DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT)
{
+ swapchain->frame_number = DXGI_MAX_SWAP_CHAIN_BUFFERS;
+ swapchain->frame_latency = 1;
+
if (FAILED(hr = ID3D12Device_CreateFence(device, DXGI_MAX_SWAP_CHAIN_BUFFERS,
0, &IID_ID3D12Fence, (void **)&swapchain->frame_latency_fence)))
{
--
2.26.0
More information about the wine-devel
mailing list