d3d12: Video Decode - Wait for GPU completion before destroying decoder in-flight objects

Reviewed-by: Giancarlo Devich <gdevich@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25819>
This commit is contained in:
Sil Vilerino
2023-09-11 14:48:22 -04:00
committed by Marge Bot
parent 09b36aea56
commit d38fff5907

View File

@@ -145,12 +145,16 @@ d3d12_video_decoder_destroy(struct pipe_video_codec *codec)
return; return;
} }
// Flush pending work before destroying.
struct d3d12_video_decoder *pD3D12Dec = (struct d3d12_video_decoder *) codec; struct d3d12_video_decoder *pD3D12Dec = (struct d3d12_video_decoder *) codec;
uint64_t curBatchFence = pD3D12Dec->m_fenceValue; // Flush and wait for completion of any in-flight GPU work before destroying objects
if (pD3D12Dec->m_needsGPUFlush) { d3d12_video_decoder_flush(codec);
d3d12_video_decoder_flush(codec); if (pD3D12Dec->m_fenceValue > 1 /* Check we submitted at least one frame */) {
d3d12_video_decoder_sync_completion(codec, pD3D12Dec->m_spFence.Get(), curBatchFence, OS_TIMEOUT_INFINITE); auto decode_queue_completion_fence = pD3D12Dec->m_inflightResourcesPool[(pD3D12Dec->m_fenceValue - 1u) % D3D12_VIDEO_DEC_ASYNC_DEPTH].m_FenceData;
d3d12_video_decoder_sync_completion(codec, decode_queue_completion_fence.cmdqueue_fence, decode_queue_completion_fence.value, OS_TIMEOUT_INFINITE);
struct pipe_fence_handle *context_queue_completion_fence = NULL;
pD3D12Dec->base.context->flush(pD3D12Dec->base.context, &context_queue_completion_fence, PIPE_FLUSH_ASYNC | PIPE_FLUSH_HINT_FINISH);
pD3D12Dec->m_pD3D12Screen->base.fence_finish(&pD3D12Dec->m_pD3D12Screen->base, NULL, context_queue_completion_fence, OS_TIMEOUT_INFINITE);
pD3D12Dec->m_pD3D12Screen->base.fence_reference(&pD3D12Dec->m_pD3D12Screen->base, &context_queue_completion_fence, NULL);
} }
// //