d3d12: Use helper to properly initialize d3d12_fences in d3d12 video

Reviewed-by: Pohsiang (John) Hsu <pohhsu@microsoft.com>
Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35263>
This commit is contained in:
Sil Vilerino 2025-05-27 12:07:39 -04:00 committed by Marge Bot
parent 7fb98a1e6f
commit 0e63becefb
5 changed files with 32 additions and 16 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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;

View file

@ -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<D3D12_RESOURCE_BARRIER> rgCurrentFrameStateTransitions = {

View file

@ -179,8 +179,9 @@ d3d12_video_processor_end_frame(struct pipe_video_codec * codec,
pD3D12Proc->m_spCommandList->ResourceBarrier(static_cast<uint32_t>(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;
}