[Libva] [PATCH] vaBeginPicture: allow processing surfaces exported to dmabuf
Julien Isorce
julien.isorce at gmail.com
Tue Sep 29 01:09:50 PDT 2015
Hi Zhao,
Thx for the answer. Here are the reason why I moved the safety to app
handling:
Use case is gstreamer-vaapi:
Ex: gstvaapipostproc ! dmabuf_rgbx ! glimagesink
Vpp output a rgbx va surface and export it as dmabuf with
vaAcquireBufferHandle. As it manages a pool of gst buffers, it exports N
surface only one time when starting. So that when processing (feeding
output va surfaces) they are already exported. Which means derived first.
II think it is more efficient than releasing/ re-exporting each time. And
it seems this is how gstreamer-vaapi is designed.
I can try to see if I can still free the derived image + calling
vaReleaseBufferHandle but keep the FD valid in the gst buffer for usage
along the run . And still be able to import it through eglcreateimage in
glimagesink.
Cheers
Julien
On Tuesday, 29 September 2015, Zhao Yakui <yakui.zhao at intel.com> wrote:
> On 09/29/2015 06:05 AM, Julien Isorce wrote:
>
>> is_surface_busy looks for locked or derived.
>> If VPP and surface is not locked it should only check fail
>> for derived if it is not exported to dmabuf.
>>
>> XXX: maybe checking CODEC_PROC + not locked is enough
>> to allow processing.
>>
>
> Hi, Julien
>
> What is the main concern of checking the surface_busy for VPP? what is
> the usage scenario?
>
> When one surface is exported or derived, maybe other components are
> using them. In such case it is difficult to synchronize between multiple
> components. So currently it uses the safe mode to assure that the surface
> is not accessed.
>
> If you want to use the derived surface for the further VPP, I suggest
> that you can free the derived image.
>
> thanks.
> Yakui
>
>
>> Signed-off-by: Julien Isorce<j.isorce at samsung.com>
>> ---
>> src/i965_drv_video.c | 24 ++++++++++++++++++++++--
>> 1 file changed, 22 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
>> index bf599d6..0d6f513 100644
>> --- a/src/i965_drv_video.c
>> +++ b/src/i965_drv_video.c
>> @@ -2610,8 +2610,28 @@ i965_BeginPicture(VADriverContextP ctx,
>> obj_config = obj_context->obj_config;
>> ASSERT_RET(obj_config, VA_STATUS_ERROR_INVALID_CONFIG);
>>
>> - if (is_surface_busy(i965, obj_surface))
>> - return VA_STATUS_ERROR_SURFACE_BUSY;
>> + if (obj_context->codec_type == CODEC_PROC) {
>> + if (obj_surface->locked_image_id != VA_INVALID_ID)
>> + return VA_STATUS_ERROR_SURFACE_BUSY;
>> +
>> + if (obj_surface->derived_image_id != VA_INVALID_ID) {
>> + /* Allow derived surface exported to dmabuf. */
>> + struct object_buffer *obj_buffer = NULL;
>> + struct object_image *obj_image =
>> IMAGE(obj_surface->derived_image_id);
>> + if (!obj_image)
>> + return VA_STATUS_ERROR_INVALID_IMAGE;
>> +
>> + obj_buffer = BUFFER(obj_image->image.buf);
>> + if (!obj_buffer)
>> + return VA_STATUS_ERROR_INVALID_BUFFER;
>> +
>> + if (obj_buffer->export_state.mem_type !=
>> VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME)
>> + return VA_STATUS_ERROR_SURFACE_BUSY;
>> + }
>> + } else {
>> + if (is_surface_busy(i965, obj_surface))
>> + return VA_STATUS_ERROR_SURFACE_BUSY;
>> + }
>>
>> if (obj_context->codec_type == CODEC_PROC) {
>> obj_context->codec_state.proc.current_render_target =
>> render_target;
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/libva/attachments/20150929/dde4e1c4/attachment.html>
More information about the Libva
mailing list