mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-26 14:20:35 +01:00
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:
parent
7fb98a1e6f
commit
0e63becefb
5 changed files with 32 additions and 16 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 = {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue