summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/vdpau
diff options
context:
space:
mode:
authorNayan Deshmukh <[email protected]>2017-01-11 22:27:14 +0530
committerChristian König <[email protected]>2017-01-17 11:51:56 +0100
commit15bfdea99c7b487d2c38d6dd7b88fb44810ef75a (patch)
treed0ab8dd381618929e6912f0f356da62dbb31b333 /src/gallium/state_trackers/vdpau
parent0ef17d76bbbc9506d50138f1b4d79db8ef08ad6d (diff)
st/vdpau: use dri3 to directly send the buffer to X(v2)
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 <[email protected]> Tested-by: Andy Furniss <[email protected]> Signed-off-by: Nayan Deshmukh <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers/vdpau')
-rw-r--r--src/gallium/state_trackers/vdpau/output.c2
-rw-r--r--src/gallium/state_trackers/vdpau/presentation.c58
2 files changed, 33 insertions, 27 deletions
diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c
index d67ead80f83..8ddf2c1b55c 100644
--- a/src/gallium/state_trackers/vdpau/output.c
+++ b/src/gallium/state_trackers/vdpau/output.c
@@ -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);
diff --git a/src/gallium/state_trackers/vdpau/presentation.c b/src/gallium/state_trackers/vdpau/presentation.c
index f35d73a16ff..b2c8aea45c9 100644
--- a/src/gallium/state_trackers/vdpau/presentation.c
+++ b/src/gallium/state_trackers/vdpau/presentation.c
@@ -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;