[Mesa-dev] [PATCH 6/8] st/va: remove fence handling
Julien Isorce
julien.isorce at gmail.com
Tue Dec 15 01:06:39 PST 2015
And the attachment :)
On 15 December 2015 at 09:06, Julien Isorce <julien.isorce at gmail.com> wrote:
> Hi Christian,
>
> I tried your v2.
>
> I had to apply attached change on top of your patch. (the one in buffer.c
> to avoid crashing, the one postproc.c otherwise same behavior as the v1 of
> this patch). Note that I export the RGB-like surface (the one that vpp
> output), not the NV12 one that come from the decoder directly.
>
> Cheers
> Julien
>
> On 14 December 2015 at 10:11, Christian König <deathsimple at vodafone.de>
> wrote:
>
>> Also note that in this pipeline, HW decoding is done with nouveau driver
>> and rendering is done with intel. dmabuf in between.
>>
>> Yeah, I already thought that somebody is using it like this. I'm not sure
>> if this is actually supposed to work because we don't have proper
>> synchronization between kernel drivers with DMA-buf jet.
>>
>> Maybe the idea of the patch is good but something is still wrong.
>>
>> While it is not the proper solution I would say let's keep the pipeline
>> draining during exporting the handle for now if that's really necessary for
>> your use case. Please test the attached patch.
>>
>> Coding the patch I've just noticed that there wasn't a pipe->flush()
>> before exporting the handle. Does it work as well if you just flush the
>> pipeline without waiting for the commands to be finished?
>>
>> Regards,
>> Christian.
>>
>>
>> On 14.12.2015 10:14, Julien Isorce wrote:
>>
>> Hi Christian,
>>
>> I have tested this patch but then the displayed video is garbage (mostly
>> white and sometimes just garbage). It also stall the nouveau driver which
>> requires to reboot but I guess this is another issue.
>> I tested with:
>> GST_GL_WINDOW=x11 GST_GL_PLATFORM=egl GST_GL_API=gles2 GST_DEBUG=2
>> LIBVA_DRIVER_NAME=gallium gst-launch-1.0 filesrc location=simpson.mp4 !
>> qtdemux ! vaapidecodebin ! glimagesink
>>
>> (to test that you need my gstreamer-vaapi and gstgl branches on my github
>> but I would not waste time to try them since they should be merged upstream
>> at some point)
>>
>> Also note that in this pipeline, HW decoding is done with nouveau driver
>> and rendering is done with intel. dmabuf in between.
>>
>> Maybe the idea of the patch is good but something is still wrong.
>> I can test any update if it helps.
>>
>> Cheers
>> Julien
>>
>>
>>
>>
>> On 11 December 2015 at 12:33, Christian König <deathsimple at vodafone.de>
>> wrote:
>>
>>> From: Christian König <christian.koenig at amd.com>
>>>
>>> It's nonsense to drain the pipeline like this.
>>>
>>> Signed-off-by: Christian König <christian.koenig at amd.com>
>>> ---
>>> src/gallium/state_trackers/va/buffer.c | 5 -----
>>> src/gallium/state_trackers/va/image.c | 1 -
>>> src/gallium/state_trackers/va/postproc.c | 6 ------
>>> src/gallium/state_trackers/va/surface.c | 10 +---------
>>> src/gallium/state_trackers/va/va_private.h | 2 --
>>> 5 files changed, 1 insertion(+), 23 deletions(-)
>>>
>>> diff --git a/src/gallium/state_trackers/va/buffer.c
>>> b/src/gallium/state_trackers/va/buffer.c
>>> index 769305e..2ec187c 100644
>>> --- a/src/gallium/state_trackers/va/buffer.c
>>> +++ b/src/gallium/state_trackers/va/buffer.c
>>> @@ -257,11 +257,6 @@ vlVaAcquireBufferHandle(VADriverContextP ctx,
>>> VABufferID buf_id,
>>>
>>> screen = VL_VA_PSCREEN(ctx);
>>>
>>> - if (buf->derived_surface.fence) {
>>> - screen->fence_finish(screen, buf->derived_surface.fence,
>>> PIPE_TIMEOUT_INFINITE);
>>> - screen->fence_reference(screen, &buf->derived_surface.fence,
>>> NULL);
>>> - }
>>> -
>>> if (buf->export_refcount > 0) {
>>> if (buf->export_state.mem_type != mem_type)
>>> return VA_STATUS_ERROR_INVALID_PARAMETER;
>>> diff --git a/src/gallium/state_trackers/va/image.c
>>> b/src/gallium/state_trackers/va/image.c
>>> index ae07da8..58c9ff7 100644
>>> --- a/src/gallium/state_trackers/va/image.c
>>> +++ b/src/gallium/state_trackers/va/image.c
>>> @@ -266,7 +266,6 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID
>>> surface, VAImage *image)
>>> img_buf->type = VAImageBufferType;
>>> img_buf->size = image->data_size;
>>> img_buf->num_elements = 1;
>>> - img_buf->derived_surface.fence = surf->fence;
>>>
>>> pipe_resource_reference(&img_buf->derived_surface.resource,
>>> surfaces[0]->texture);
>>>
>>> diff --git a/src/gallium/state_trackers/va/postproc.c
>>> b/src/gallium/state_trackers/va/postproc.c
>>> index 105f251..1ee3587 100644
>>> --- a/src/gallium/state_trackers/va/postproc.c
>>> +++ b/src/gallium/state_trackers/va/postproc.c
>>> @@ -54,7 +54,6 @@ vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver
>>> *drv, vlVaContext *contex
>>> vlVaSurface *src_surface;
>>> VAProcPipelineParameterBuffer *pipeline_param;
>>> struct pipe_surface **surfaces;
>>> - struct pipe_screen *screen;
>>> struct pipe_surface *psurf;
>>>
>>> if (!drv || !context)
>>> @@ -77,8 +76,6 @@ vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver
>>> *drv, vlVaContext *contex
>>> if (!surfaces || !surfaces[0])
>>> return VA_STATUS_ERROR_INVALID_SURFACE;
>>>
>>> - screen = drv->pipe->screen;
>>> -
>>> psurf = surfaces[0];
>>>
>>> src_region = vlVaRegionDefault(pipeline_param->surface_region,
>>> src_surface->buffer, &def_src_region);
>>> @@ -99,9 +96,6 @@ vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver
>>> *drv, vlVaContext *contex
>>> vl_compositor_set_layer_dst_area(&drv->cstate, 0, &dst_rect);
>>> vl_compositor_render(&drv->cstate, &drv->compositor, psurf, NULL,
>>> false);
>>>
>>> - screen->fence_reference(screen, &src_surface->fence, NULL);
>>> - drv->pipe->flush(drv->pipe, &src_surface->fence, 0);
>>> -
>>> return VA_STATUS_SUCCESS;
>>> }
>>>
>>> diff --git a/src/gallium/state_trackers/va/surface.c
>>> b/src/gallium/state_trackers/va/surface.c
>>> index 4a18a6f..5ddaf04 100644
>>> --- a/src/gallium/state_trackers/va/surface.c
>>> +++ b/src/gallium/state_trackers/va/surface.c
>>> @@ -72,8 +72,6 @@ vlVaDestroySurfaces(VADriverContextP ctx, VASurfaceID
>>> *surface_list, int num_sur
>>> vlVaSurface *surf = handle_table_get(drv->htab, surface_list[i]);
>>> if (surf->buffer)
>>> surf->buffer->destroy(surf->buffer);
>>> - if(surf->fence)
>>> - drv->pipe->screen->fence_reference(drv->pipe->screen,
>>> &surf->fence, NULL);
>>> util_dynarray_fini(&surf->subpics);
>>> FREE(surf);
>>> handle_table_remove(drv->htab, surface_list[i]);
>>> @@ -245,11 +243,6 @@ vlVaPutSurface(VADriverContextP ctx, VASurfaceID
>>> surface_id, void* draw, short s
>>> screen = drv->pipe->screen;
>>> vscreen = drv->vscreen;
>>>
>>> - if(surf->fence) {
>>> - screen->fence_finish(screen, surf->fence, PIPE_TIMEOUT_INFINITE);
>>> - screen->fence_reference(screen, &surf->fence, NULL);
>>> - }
>>> -
>>> tex = vscreen->texture_from_drawable(vscreen, draw);
>>> if (!tex)
>>> return VA_STATUS_ERROR_INVALID_DISPLAY;
>>> @@ -281,8 +274,7 @@ vlVaPutSurface(VADriverContextP ctx, VASurfaceID
>>> surface_id, void* draw, short s
>>> screen->flush_frontbuffer(screen, tex, 0, 0,
>>> vscreen->get_private(vscreen), NULL);
>>>
>>> - screen->fence_reference(screen, &surf->fence, NULL);
>>> - drv->pipe->flush(drv->pipe, &surf->fence, 0);
>>> + drv->pipe->flush(drv->pipe, NULL, 0);
>>>
>>> pipe_resource_reference(&tex, NULL);
>>> pipe_surface_reference(&surf_draw, NULL);
>>> diff --git a/src/gallium/state_trackers/va/va_private.h
>>> b/src/gallium/state_trackers/va/va_private.h
>>> index 6739efc..fa6e0fb 100644
>>> --- a/src/gallium/state_trackers/va/va_private.h
>>> +++ b/src/gallium/state_trackers/va/va_private.h
>>> @@ -244,7 +244,6 @@ typedef struct {
>>> struct {
>>> struct pipe_resource *resource;
>>> struct pipe_transfer *transfer;
>>> - struct pipe_fence_handle *fence;
>>> } derived_surface;
>>> unsigned int export_refcount;
>>> VABufferInfo export_state;
>>> @@ -252,7 +251,6 @@ typedef struct {
>>>
>>> typedef struct {
>>> struct pipe_video_buffer templat, *buffer;
>>> - struct pipe_fence_handle *fence;
>>> struct util_dynarray subpics; /* vlVaSubpicture */
>>> } vlVaSurface;
>>>
>>> --
>>> 2.5.0
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>>
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20151215/70a9bc70/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-WIP-changes-to-remove-fence-handling-v2.patch
Type: text/x-patch
Size: 1718 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20151215/70a9bc70/attachment-0001.bin>
More information about the mesa-dev
mailing list