<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">
      <blockquote type="cite">Also note that in this pipeline, HW
        decoding is done with nouveau driver and rendering is done with
        intel. dmabuf in between.<br>
      </blockquote>
      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.<br>
      <br>
      <blockquote type="cite">Maybe the idea of the patch is good but
        something is still wrong.</blockquote>
      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.<br>
      <br>
      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?<br>
      <br>
      Regards,<br>
      Christian.<br>
      <br>
      On 14.12.2015 10:14, Julien Isorce wrote:<br>
    </div>
    <blockquote
cite="mid:CAHWPjbWsQbqv4cLTHpOy9e8sG4+hHGyb2jcuo32pgruTjJ+z8g@mail.gmail.com"
      type="cite">
      <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 moz-do-not-send="true"
              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 moz-do-not-send="true"
              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 moz-do-not-send="true"
              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 moz-do-not-send="true"
                  href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
                <a moz-do-not-send="true"
                  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>
    </blockquote>
    <br>
  </body>
</html>