mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
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 <christian.koenig@amd.com>
Tested-by: Andy Furniss <adf.lists@gmail.com>
Signed-off-by: Nayan Deshmukh <nayan26deshmukh@gmail.com>
This commit is contained in:
parent
0ef17d76bb
commit
15bfdea99c
2 changed files with 33 additions and 27 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue