d3d12: implement the get_decoder_fence vfunc
Implement the get_decoder_fence vfunc. Note that the waiting for completion in this driver happens in the end_frame vfunc itself. Signed-off-by: Sil Vilerino <sivileri@microsoft.com> Reviewed-by: Leo Liu <leo.liu@amd.com> Reviewed-by: Boyuan Zhang <Boyuan.Zhang@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20133>
This commit is contained in:
@@ -65,6 +65,7 @@ d3d12_video_create_decoder(struct pipe_context *context, const struct pipe_video
|
|||||||
pD3D12Dec->base.decode_bitstream = d3d12_video_decoder_decode_bitstream;
|
pD3D12Dec->base.decode_bitstream = d3d12_video_decoder_decode_bitstream;
|
||||||
pD3D12Dec->base.end_frame = d3d12_video_decoder_end_frame;
|
pD3D12Dec->base.end_frame = d3d12_video_decoder_end_frame;
|
||||||
pD3D12Dec->base.flush = d3d12_video_decoder_flush;
|
pD3D12Dec->base.flush = d3d12_video_decoder_flush;
|
||||||
|
pD3D12Dec->base.get_decoder_fence = d3d12_video_decoder_get_decoder_fence;
|
||||||
|
|
||||||
pD3D12Dec->m_decodeFormat = d3d12_convert_pipe_video_profile_to_dxgi_format(codec->profile);
|
pD3D12Dec->m_decodeFormat = d3d12_convert_pipe_video_profile_to_dxgi_format(codec->profile);
|
||||||
pD3D12Dec->m_d3d12DecProfileType = d3d12_video_decoder_convert_pipe_video_profile_to_profile_type(codec->profile);
|
pD3D12Dec->m_d3d12DecProfileType = d3d12_video_decoder_convert_pipe_video_profile_to_profile_type(codec->profile);
|
||||||
@@ -665,6 +666,29 @@ d3d12_video_decoder_end_frame(struct pipe_video_codec *codec,
|
|||||||
pD3D12Screen->base.fence_reference(&pD3D12Screen->base, &completion_fence, NULL);
|
pD3D12Screen->base.fence_reference(&pD3D12Screen->base, &completion_fence, NULL);
|
||||||
pipe_resource_reference(&pPipeSrc, NULL);
|
pipe_resource_reference(&pPipeSrc, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We do not use the async fence for now but set it to
|
||||||
|
// NULL to avoid uninitialized memory in VA frontend
|
||||||
|
*picture->fence = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get decoder fence.
|
||||||
|
*/
|
||||||
|
int d3d12_video_decoder_get_decoder_fence(struct pipe_video_codec *codec,
|
||||||
|
struct pipe_fence_handle *fence,
|
||||||
|
uint64_t timeout)
|
||||||
|
{
|
||||||
|
/* No need to wait for anything, we're already flushing
|
||||||
|
and waiting in d3d12_video_decoder_end_frame */
|
||||||
|
|
||||||
|
// We set NULL in d3d12_video_decoder_end_frame
|
||||||
|
assert(fence == NULL);
|
||||||
|
|
||||||
|
// Return semantics based on p_video_codec interface
|
||||||
|
// ret == 0 -> Decode in progress
|
||||||
|
// ret != 0 -> Decode completed
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -77,6 +77,13 @@ d3d12_video_decoder_end_frame(struct pipe_video_codec * codec,
|
|||||||
void
|
void
|
||||||
d3d12_video_decoder_flush(struct pipe_video_codec *codec);
|
d3d12_video_decoder_flush(struct pipe_video_codec *codec);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get decoder fence.
|
||||||
|
*/
|
||||||
|
int d3d12_video_decoder_get_decoder_fence(struct pipe_video_codec *codec,
|
||||||
|
struct pipe_fence_handle *fence,
|
||||||
|
uint64_t timeout);
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Pipe video interface ends
|
/// Pipe video interface ends
|
||||||
///
|
///
|
||||||
|
Reference in New Issue
Block a user