From 0e63becefbb0785da420d14ffb217743fe15fdfa Mon Sep 17 00:00:00 2001 From: Sil Vilerino Date: Tue, 27 May 2025 12:07:39 -0400 Subject: [PATCH] d3d12: Use helper to properly initialize d3d12_fences in d3d12 video Reviewed-by: Pohsiang (John) Hsu Reviewed-by: Jesse Natalie Part-of: --- src/gallium/drivers/d3d12/d3d12_fence.cpp | 26 +++++++++++++++---- src/gallium/drivers/d3d12/d3d12_fence.h | 3 +++ src/gallium/drivers/d3d12/d3d12_video_dec.cpp | 6 ++--- src/gallium/drivers/d3d12/d3d12_video_enc.cpp | 8 +++--- .../drivers/d3d12/d3d12_video_proc.cpp | 5 ++-- 5 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_fence.cpp b/src/gallium/drivers/d3d12/d3d12_fence.cpp index c496c9fa9d4..86057c0565a 100644 --- a/src/gallium/drivers/d3d12/d3d12_fence.cpp +++ b/src/gallium/drivers/d3d12/d3d12_fence.cpp @@ -37,6 +37,25 @@ destroy_fence(struct d3d12_fence *fence) FREE(fence); } +bool +d3d12_reset_fence(struct d3d12_fence *fence, ID3D12Fence *d3d12_fence_obj, uint64_t fence_value) +{ + d3d12_fence_close_event(fence->event, fence->event_fd); + fence->cmdqueue_fence = d3d12_fence_obj; + fence->value = fence_value; + fence->event = d3d12_fence_create_event(&fence->event_fd); + fence->signaled = false; + + if (FAILED(fence->cmdqueue_fence->SetEventOnCompletion(fence->value, fence->event))) + goto fail; + + return true; + +fail: + d3d12_fence_close_event(fence->event, fence->event_fd); + return false; +} + struct d3d12_fence * d3d12_create_fence(struct d3d12_screen *screen) { @@ -46,12 +65,9 @@ d3d12_create_fence(struct d3d12_screen *screen) return NULL; } - ret->cmdqueue_fence = screen->fence; - ret->value = ++screen->fence_value; - ret->event = d3d12_fence_create_event(&ret->event_fd); - if (FAILED(screen->cmdqueue->Signal(screen->fence, ret->value))) + if(!d3d12_reset_fence(ret, screen->fence, ++screen->fence_value)) goto fail; - if (FAILED(screen->fence->SetEventOnCompletion(ret->value, ret->event))) + if (FAILED(screen->cmdqueue->Signal(screen->fence, ret->value))) goto fail; pipe_reference_init(&ret->reference, 1); diff --git a/src/gallium/drivers/d3d12/d3d12_fence.h b/src/gallium/drivers/d3d12/d3d12_fence.h index 0c14888a3a3..a7cad0c832e 100644 --- a/src/gallium/drivers/d3d12/d3d12_fence.h +++ b/src/gallium/drivers/d3d12/d3d12_fence.h @@ -98,6 +98,9 @@ d3d12_fence(struct pipe_fence_handle *pfence) return (struct d3d12_fence *)pfence; } +bool +d3d12_reset_fence(struct d3d12_fence *fence, ID3D12Fence *d3d12_fence_obj, uint64_t fence_value); + struct d3d12_fence * d3d12_create_fence(struct d3d12_screen *screen); diff --git a/src/gallium/drivers/d3d12/d3d12_video_dec.cpp b/src/gallium/drivers/d3d12/d3d12_video_dec.cpp index d1898a7c287..d4c1a379597 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_dec.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_dec.cpp @@ -806,10 +806,8 @@ d3d12_video_decoder_flush(struct pipe_video_codec *codec) } // Set async fence info - memset(&inFlightResources.m_FenceData, 0, sizeof(inFlightResources.m_FenceData)); - - inFlightResources.m_FenceData.value = pD3D12Dec->m_fenceValue; - inFlightResources.m_FenceData.cmdqueue_fence = pD3D12Dec->m_spFence.Get(); + ASSERTED bool success = d3d12_reset_fence(&inFlightResources.m_FenceData, pD3D12Dec->m_spFence.Get(), pD3D12Dec->m_fenceValue); + assert(success); pD3D12Dec->m_fenceValue++; pD3D12Dec->m_needsGPUFlush = false; diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc.cpp b/src/gallium/drivers/d3d12/d3d12_video_enc.cpp index aef2908843a..0e6f13ae448 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_enc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_enc.cpp @@ -3059,11 +3059,9 @@ d3d12_video_encoder_encode_bitstream_impl(struct pipe_video_codec *codec, } } - memset(&pD3D12Enc->m_spEncodedFrameMetadata[current_metadata_slot].m_FenceData, - 0, - sizeof(pD3D12Enc->m_spEncodedFrameMetadata[current_metadata_slot].m_FenceData)); - pD3D12Enc->m_spEncodedFrameMetadata[current_metadata_slot].m_FenceData.value = pD3D12Enc->m_fenceValue; - pD3D12Enc->m_spEncodedFrameMetadata[current_metadata_slot].m_FenceData.cmdqueue_fence = pD3D12Enc->m_spFence.Get(); + ASSERTED bool success = d3d12_reset_fence(&pD3D12Enc->m_spEncodedFrameMetadata[current_metadata_slot].m_FenceData, pD3D12Enc->m_spFence.Get(), pD3D12Enc->m_fenceValue); + assert(success); + *feedback = (void*) &pD3D12Enc->m_spEncodedFrameMetadata[current_metadata_slot].m_FenceData; std::vector rgCurrentFrameStateTransitions = { diff --git a/src/gallium/drivers/d3d12/d3d12_video_proc.cpp b/src/gallium/drivers/d3d12/d3d12_video_proc.cpp index af31226a8d9..d8db3f736ad 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_proc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_proc.cpp @@ -179,8 +179,9 @@ d3d12_video_processor_end_frame(struct pipe_video_codec * codec, pD3D12Proc->m_spCommandList->ResourceBarrier(static_cast(barrier_transitions.size()), barrier_transitions.data()); - pD3D12Proc->m_PendingFences[d3d12_video_processor_pool_current_index(pD3D12Proc)].value = pD3D12Proc->m_fenceValue; - pD3D12Proc->m_PendingFences[d3d12_video_processor_pool_current_index(pD3D12Proc)].cmdqueue_fence = pD3D12Proc->m_spFence.Get(); + ASSERTED bool success = d3d12_reset_fence(&pD3D12Proc->m_PendingFences[d3d12_video_processor_pool_current_index(pD3D12Proc)], pD3D12Proc->m_spFence.Get(), pD3D12Proc->m_fenceValue); + assert(success); + *picture->fence = (pipe_fence_handle*) &pD3D12Proc->m_PendingFences[d3d12_video_processor_pool_current_index(pD3D12Proc)]; return 0; }