st/vdpau: use dri3 to directly send the buffer to X(v2)
authorNayan Deshmukh <nayan26deshmukh@gmail.com>
Wed, 11 Jan 2017 16:57:14 +0000 (22:27 +0530)
committerChristian König <christian.koenig@amd.com>
Tue, 17 Jan 2017 10:51:56 +0000 (11:51 +0100)
this avoids an extra copy which occurs in case of dri2

v1.1: fallback to dri2 if dri3 fails to initialize
v2: add PIPE_BIND_SCANOUT to output buffers as they will
    be send to X server directly (Michel)

Suggested-by: Christian König <christian.koenig@amd.com>
Tested-by: Andy Furniss <adf.lists@gmail.com>
Signed-off-by: Nayan Deshmukh <nayan26deshmukh@gmail.com>
src/gallium/state_trackers/vdpau/output.c
src/gallium/state_trackers/vdpau/presentation.c

index d67ead80f83c29250d2182d347d4b58ed47267d2..8ddf2c1b55cbe4022d50abbf29deac545ec7b72f 100644 (file)
@@ -82,7 +82,7 @@ vlVdpOutputSurfaceCreate(VdpDevice device,
    res_tmpl.depth0 = 1;
    res_tmpl.array_size = 1;
    res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET |
-                   PIPE_BIND_SHARED;
+                   PIPE_BIND_SHARED | PIPE_BIND_SCANOUT;
    res_tmpl.usage = PIPE_USAGE_DEFAULT;
 
    pipe_mutex_lock(dev->mutex);
index f35d73a16ff6a1f3eeb2315ce1bc0c2a2bf97295..b2c8aea45c9db2ff04c26fb0cf0787ce4041035b 100644 (file)
@@ -231,43 +231,47 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue,
    vscreen = pq->device->vscreen;
 
    pipe_mutex_lock(pq->device->mutex);
+   if (vscreen->set_back_texture_from_output)
+      vscreen->set_back_texture_from_output(vscreen, surf->surface->texture, clip_width, clip_height);
    tex = vscreen->texture_from_drawable(vscreen, (void *)pq->drawable);
    if (!tex) {
       pipe_mutex_unlock(pq->device->mutex);
       return VDP_STATUS_INVALID_HANDLE;
    }
 
-   dirty_area = vscreen->get_dirty_area(vscreen);
+   if (!vscreen->set_back_texture_from_output) {
+      dirty_area = vscreen->get_dirty_area(vscreen);
 
-   memset(&surf_templ, 0, sizeof(surf_templ));
-   surf_templ.format = tex->format;
-   surf_draw = pipe->create_surface(pipe, tex, &surf_templ);
+      memset(&surf_templ, 0, sizeof(surf_templ));
+      surf_templ.format = tex->format;
+      surf_draw = pipe->create_surface(pipe, tex, &surf_templ);
 
-   dst_clip.x0 = 0;
-   dst_clip.y0 = 0;
-   dst_clip.x1 = clip_width ? clip_width : surf_draw->width;
-   dst_clip.y1 = clip_height ? clip_height : surf_draw->height;
+      dst_clip.x0 = 0;
+      dst_clip.y0 = 0;
+      dst_clip.x1 = clip_width ? clip_width : surf_draw->width;
+      dst_clip.y1 = clip_height ? clip_height : surf_draw->height;
 
-   if (pq->device->delayed_rendering.surface == surface &&
-       dst_clip.x1 == surf_draw->width && dst_clip.y1 == surf_draw->height) {
+      if (pq->device->delayed_rendering.surface == surface &&
+          dst_clip.x1 == surf_draw->width && dst_clip.y1 == surf_draw->height) {
 
-      // TODO: we correctly support the clipping here, but not the pq background color in the clipped area....
-      cstate = pq->device->delayed_rendering.cstate;
-      vl_compositor_set_dst_clip(cstate, &dst_clip);
-      vlVdpResolveDelayedRendering(pq->device, surf_draw, dirty_area);
+         // TODO: we correctly support the clipping here, but not the pq background color in the clipped area....
+         cstate = pq->device->delayed_rendering.cstate;
+         vl_compositor_set_dst_clip(cstate, &dst_clip);
+         vlVdpResolveDelayedRendering(pq->device, surf_draw, dirty_area);
 
-   } else {
-      vlVdpResolveDelayedRendering(pq->device, NULL, NULL);
+      } else {
+         vlVdpResolveDelayedRendering(pq->device, NULL, NULL);
 
-      src_rect.x0 = 0;
-      src_rect.y0 = 0;
-      src_rect.x1 = surf_draw->width;
-      src_rect.y1 = surf_draw->height;
+         src_rect.x0 = 0;
+         src_rect.y0 = 0;
+         src_rect.x1 = surf_draw->width;
+         src_rect.y1 = surf_draw->height;
 
-      vl_compositor_clear_layers(cstate);
-      vl_compositor_set_rgba_layer(cstate, compositor, 0, surf->sampler_view, &src_rect, NULL, NULL);
-      vl_compositor_set_dst_clip(cstate, &dst_clip);
-      vl_compositor_render(cstate, compositor, surf_draw, dirty_area, true);
+         vl_compositor_clear_layers(cstate);
+         vl_compositor_set_rgba_layer(cstate, compositor, 0, surf->sampler_view, &src_rect, NULL, NULL);
+         vl_compositor_set_dst_clip(cstate, &dst_clip);
+         vl_compositor_render(cstate, compositor, surf_draw, dirty_area, true);
+      }
    }
 
    vscreen->set_next_timestamp(vscreen, earliest_presentation_time);
@@ -297,8 +301,10 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue,
       framenum++;
    }
 
-   pipe_resource_reference(&tex, NULL);
-   pipe_surface_reference(&surf_draw, NULL);
+   if (!vscreen->set_back_texture_from_output) {
+      pipe_resource_reference(&tex, NULL);
+      pipe_surface_reference(&surf_draw, NULL);
+   }
    pipe_mutex_unlock(pq->device->mutex);
 
    return VDP_STATUS_OK;