diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index 0fea7b2787..5944ec23f8 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -188,11 +188,21 @@ static void d3d12_overlay_set_alpha(void* data, unsigned index, float mod) D3D12Unmap(d3d12->overlays.vbo, 0, &range); } +#define D3D12_GFX_SYNC() \ +{ \ + D3D12Fence fence = d3d12->queue.fence; \ + d3d12->queue.handle->lpVtbl->Signal(d3d12->queue.handle, fence, ++d3d12->queue.fenceValue); \ + if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue) \ + { \ + fence->lpVtbl->SetEventOnCompletion(fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent); \ + WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE); \ + } \ +} + static bool d3d12_overlay_load(void* data, const void* image_data, unsigned num_images) { size_t i; D3D12_RANGE range; - D3D12Fence fence; d3d12_sprite_t* sprites = NULL; d3d12_video_t* d3d12 = (d3d12_video_t*)data; const struct texture_image* images = (const struct texture_image*)image_data; @@ -200,14 +210,8 @@ static bool d3d12_overlay_load(void* data, const void* image_data, unsigned num_ if (!d3d12) return false; - fence = d3d12->queue.fence; + D3D12_GFX_SYNC(); - if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue) - { - fence->lpVtbl->SetEventOnCompletion( - fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent); - WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE); - } d3d12_free_overlays(d3d12); d3d12->overlays.count = num_images; d3d12->overlays.textures = (d3d12_texture_t*)calloc(num_images, sizeof(d3d12_texture_t)); @@ -460,21 +464,13 @@ static void d3d12_gfx_set_rotation(void* data, unsigned rotation) 0.0f, 0.0f, 0.0f, 0.0f , 0.0f, 0.0f, 0.0f, 1.0f } }; - D3D12Fence fence; D3D12_RANGE read_range; d3d12_video_t* d3d12 = (d3d12_video_t*)data; if (!d3d12) return; - fence = d3d12->queue.fence; - - if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue) - { - fence->lpVtbl->SetEventOnCompletion( - fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent); - WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE); - } + D3D12_GFX_SYNC(); d3d12->frame.rotation = rotation; radians = d3d12->frame.rotation * (M_PI / 2.0f); @@ -630,21 +626,13 @@ static bool d3d12_gfx_set_shader(void* data, enum rarch_shader_type type, const { #if defined(HAVE_SLANG) && defined(HAVE_SPIRV_CROSS) size_t i; - D3D12Fence fence; d3d12_texture_t* source = NULL; d3d12_video_t* d3d12 = (d3d12_video_t*)data; if (!d3d12) return false; - fence = d3d12->queue.fence; - - if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue) - { - fence->lpVtbl->SetEventOnCompletion( - fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent); - WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE); - } + D3D12_GFX_SYNC(); d3d12_free_shader_preset(d3d12); if (string_is_empty(path)) @@ -1151,21 +1139,13 @@ error: static void d3d12_gfx_free(void* data) { - D3D12Fence fence; unsigned i; d3d12_video_t* d3d12 = (d3d12_video_t*)data; if (!d3d12) return; - fence = d3d12->queue.fence; - - if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue) - { - fence->lpVtbl->SetEventOnCompletion( - fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent); - WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE); - } + D3D12_GFX_SYNC(); if (d3d12->flags & D3D12_ST_FLAG_WAITABLE_SWAPCHAINS) CloseHandle(d3d12->chain.frameLatencyWaitableObject); @@ -2210,7 +2190,6 @@ static bool d3d12_gfx_frame( bool use_back_buffer = back_buffer_format != d3d12->chain.formats[d3d12->chain.bit_depth]; #endif D3D12GraphicsCommandList cmd = d3d12->queue.cmd; - D3D12Fence fence = d3d12->queue.fence; if (d3d12->flags & D3D12_ST_FLAG_WAITABLE_SWAPCHAINS) WaitForSingleObjectEx( @@ -2218,12 +2197,7 @@ static bool d3d12_gfx_frame( 1000, true); - if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue) - { - fence->lpVtbl->SetEventOnCompletion( - fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent); - WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE); - } + D3D12_GFX_SYNC(); #ifdef HAVE_DXGI_HDR d3d12_hdr_enable = d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE; @@ -2898,8 +2872,6 @@ static bool d3d12_gfx_frame( cmd->lpVtbl->Close(cmd); d3d12->queue.handle->lpVtbl->ExecuteCommandLists(d3d12->queue.handle, 1, (ID3D12CommandList* const*)&d3d12->queue.cmd); - d3d12->queue.handle->lpVtbl->Signal(d3d12->queue.handle, fence, - ++d3d12->queue.fenceValue); DXGIPresent(d3d12->chain.handle, d3d12->chain.swap_interval, present_flags); if (vsync && wait_for_vblank) @@ -3129,14 +3101,7 @@ static void d3d12_gfx_unload_texture(void* data, if (d3d12) { - D3D12Fence fence = d3d12->queue.fence; - - if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue) - { - fence->lpVtbl->SetEventOnCompletion( - fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent); - WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE); - } + D3D12_GFX_SYNC(); } d3d12_release_texture(texture);