<div dir="ltr"><div><div><div><div>Hi Christian,<br><br></div>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.<br>I tested with:<br>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<br><br></div>(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)<br><br></div>Also note that in this pipeline, HW decoding is done with nouveau driver and rendering is done with intel. dmabuf in between.<br><br></div>Maybe the idea of the patch is good but something is still wrong.<br><div><div><div><div><div>I can test any update if it helps.<br><br></div><div>Cheers<br></div><div>Julien<br></div><div><br><br><br></div></div></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 11 December 2015 at 12:33, Christian König <span dir="ltr"><<a href="mailto:deathsimple@vodafone.de" target="_blank">deathsimple@vodafone.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Christian König <<a href="mailto:christian.koenig@amd.com">christian.koenig@amd.com</a>><br>
<br>
It's nonsense to drain the pipeline like this.<br>
<br>
Signed-off-by: Christian König <<a href="mailto:christian.koenig@amd.com">christian.koenig@amd.com</a>><br>
---<br>
 src/gallium/state_trackers/va/buffer.c     |  5 -----<br>
 src/gallium/state_trackers/va/image.c      |  1 -<br>
 src/gallium/state_trackers/va/postproc.c   |  6 ------<br>
 src/gallium/state_trackers/va/surface.c    | 10 +---------<br>
 src/gallium/state_trackers/va/va_private.h |  2 --<br>
 5 files changed, 1 insertion(+), 23 deletions(-)<br>
<br>
diff --git a/src/gallium/state_trackers/va/buffer.c b/src/gallium/state_trackers/va/buffer.c<br>
index 769305e..2ec187c 100644<br>
--- a/src/gallium/state_trackers/va/buffer.c<br>
+++ b/src/gallium/state_trackers/va/buffer.c<br>
@@ -257,11 +257,6 @@ vlVaAcquireBufferHandle(VADriverContextP ctx, VABufferID buf_id,<br>
<br>
    screen = VL_VA_PSCREEN(ctx);<br>
<br>
-   if (buf->derived_surface.fence) {<br>
-      screen->fence_finish(screen, buf->derived_surface.fence, PIPE_TIMEOUT_INFINITE);<br>
-      screen->fence_reference(screen, &buf->derived_surface.fence, NULL);<br>
-   }<br>
-<br>
    if (buf->export_refcount > 0) {<br>
       if (buf->export_state.mem_type != mem_type)<br>
          return VA_STATUS_ERROR_INVALID_PARAMETER;<br>
diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c<br>
index ae07da8..58c9ff7 100644<br>
--- a/src/gallium/state_trackers/va/image.c<br>
+++ b/src/gallium/state_trackers/va/image.c<br>
@@ -266,7 +266,6 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)<br>
    img_buf->type = VAImageBufferType;<br>
    img_buf->size = image->data_size;<br>
    img_buf->num_elements = 1;<br>
-   img_buf->derived_surface.fence = surf->fence;<br>
<br>
    pipe_resource_reference(&img_buf->derived_surface.resource, surfaces[0]->texture);<br>
<br>
diff --git a/src/gallium/state_trackers/va/postproc.c b/src/gallium/state_trackers/va/postproc.c<br>
index 105f251..1ee3587 100644<br>
--- a/src/gallium/state_trackers/va/postproc.c<br>
+++ b/src/gallium/state_trackers/va/postproc.c<br>
@@ -54,7 +54,6 @@ vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver *drv, vlVaContext *contex<br>
    vlVaSurface *src_surface;<br>
    VAProcPipelineParameterBuffer *pipeline_param;<br>
    struct pipe_surface **surfaces;<br>
-   struct pipe_screen *screen;<br>
    struct pipe_surface *psurf;<br>
<br>
    if (!drv || !context)<br>
@@ -77,8 +76,6 @@ vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver *drv, vlVaContext *contex<br>
    if (!surfaces || !surfaces[0])<br>
       return VA_STATUS_ERROR_INVALID_SURFACE;<br>
<br>
-   screen = drv->pipe->screen;<br>
-<br>
    psurf = surfaces[0];<br>
<br>
    src_region = vlVaRegionDefault(pipeline_param->surface_region, src_surface->buffer, &def_src_region);<br>
@@ -99,9 +96,6 @@ vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver *drv, vlVaContext *contex<br>
    vl_compositor_set_layer_dst_area(&drv->cstate, 0, &dst_rect);<br>
    vl_compositor_render(&drv->cstate, &drv->compositor, psurf, NULL, false);<br>
<br>
-   screen->fence_reference(screen, &src_surface->fence, NULL);<br>
-   drv->pipe->flush(drv->pipe, &src_surface->fence, 0);<br>
-<br>
    return VA_STATUS_SUCCESS;<br>
 }<br>
<br>
diff --git a/src/gallium/state_trackers/va/surface.c b/src/gallium/state_trackers/va/surface.c<br>
index 4a18a6f..5ddaf04 100644<br>
--- a/src/gallium/state_trackers/va/surface.c<br>
+++ b/src/gallium/state_trackers/va/surface.c<br>
@@ -72,8 +72,6 @@ vlVaDestroySurfaces(VADriverContextP ctx, VASurfaceID *surface_list, int num_sur<br>
       vlVaSurface *surf = handle_table_get(drv->htab, surface_list[i]);<br>
       if (surf->buffer)<br>
          surf->buffer->destroy(surf->buffer);<br>
-      if(surf->fence)<br>
-         drv->pipe->screen->fence_reference(drv->pipe->screen, &surf->fence, NULL);<br>
       util_dynarray_fini(&surf->subpics);<br>
       FREE(surf);<br>
       handle_table_remove(drv->htab, surface_list[i]);<br>
@@ -245,11 +243,6 @@ vlVaPutSurface(VADriverContextP ctx, VASurfaceID surface_id, void* draw, short s<br>
    screen = drv->pipe->screen;<br>
    vscreen = drv->vscreen;<br>
<br>
-   if(surf->fence) {<br>
-      screen->fence_finish(screen, surf->fence, PIPE_TIMEOUT_INFINITE);<br>
-      screen->fence_reference(screen, &surf->fence, NULL);<br>
-   }<br>
-<br>
    tex = vscreen->texture_from_drawable(vscreen, draw);<br>
    if (!tex)<br>
       return VA_STATUS_ERROR_INVALID_DISPLAY;<br>
@@ -281,8 +274,7 @@ vlVaPutSurface(VADriverContextP ctx, VASurfaceID surface_id, void* draw, short s<br>
    screen->flush_frontbuffer(screen, tex, 0, 0,<br>
                              vscreen->get_private(vscreen), NULL);<br>
<br>
-   screen->fence_reference(screen, &surf->fence, NULL);<br>
-   drv->pipe->flush(drv->pipe, &surf->fence, 0);<br>
+   drv->pipe->flush(drv->pipe, NULL, 0);<br>
<br>
    pipe_resource_reference(&tex, NULL);<br>
    pipe_surface_reference(&surf_draw, NULL);<br>
diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h<br>
index 6739efc..fa6e0fb 100644<br>
--- a/src/gallium/state_trackers/va/va_private.h<br>
+++ b/src/gallium/state_trackers/va/va_private.h<br>
@@ -244,7 +244,6 @@ typedef struct {<br>
    struct {<br>
       struct pipe_resource *resource;<br>
       struct pipe_transfer *transfer;<br>
-      struct pipe_fence_handle *fence;<br>
    } derived_surface;<br>
    unsigned int export_refcount;<br>
    VABufferInfo export_state;<br>
@@ -252,7 +251,6 @@ typedef struct {<br>
<br>
 typedef struct {<br>
    struct pipe_video_buffer templat, *buffer;<br>
-   struct pipe_fence_handle *fence;<br>
    struct util_dynarray subpics; /* vlVaSubpicture */<br>
 } vlVaSurface;<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
2.5.0<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>