[Mesa-dev] [PATCH 2/3] st/vdpau: use dri3 to direclty send the buffer to X(v1.1)
this avoids an extra copy which occurs in case of dri2 v1.1: fallback to dri2 if dri3 fails to initialize Suggested-by: Christian KönigSigned-off-by: Nayan Deshmukh --- src/gallium/state_trackers/vdpau/presentation.c | 58 ++--- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/gallium/state_trackers/vdpau/presentation.c b/src/gallium/state_trackers/vdpau/presentation.c index f35d73a..b2c8aea 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(_templ, 0, sizeof(surf_templ)); - surf_templ.format = tex->format; - surf_draw = pipe->create_surface(pipe, tex, _templ); + memset(_templ, 0, sizeof(surf_templ)); + surf_templ.format = tex->format; + surf_draw = pipe->create_surface(pipe, tex, _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, _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, _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, _rect, NULL, NULL); - vl_compositor_set_dst_clip(cstate, _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, _rect, NULL, NULL); + vl_compositor_set_dst_clip(cstate, _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(, NULL); - pipe_surface_reference(_draw, NULL); + if (!vscreen->set_back_texture_from_output) { + pipe_resource_reference(, NULL); + pipe_surface_reference(_draw, NULL); + } pipe_mutex_unlock(pq->device->mutex); return VDP_STATUS_OK; -- 2.9.3 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [PATCH 2/3] st/vdpau: use dri3 to direclty send the buffer to X(v1.1)
this avoids an extra copy which occurs in case of dri2 v1.1: fallback to dri2 if dri3 fails to initialize Suggested-by: Christian KönigSigned-off-by: Nayan Deshmukh --- src/gallium/state_trackers/vdpau/presentation.c | 58 ++--- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/gallium/state_trackers/vdpau/presentation.c b/src/gallium/state_trackers/vdpau/presentation.c index f35d73a..b2c8aea 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(_templ, 0, sizeof(surf_templ)); - surf_templ.format = tex->format; - surf_draw = pipe->create_surface(pipe, tex, _templ); + memset(_templ, 0, sizeof(surf_templ)); + surf_templ.format = tex->format; + surf_draw = pipe->create_surface(pipe, tex, _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, _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, _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, _rect, NULL, NULL); - vl_compositor_set_dst_clip(cstate, _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, _rect, NULL, NULL); + vl_compositor_set_dst_clip(cstate, _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(, NULL); - pipe_surface_reference(_draw, NULL); + if (!vscreen->set_back_texture_from_output) { + pipe_resource_reference(, NULL); + pipe_surface_reference(_draw, NULL); + } pipe_mutex_unlock(pq->device->mutex); return VDP_STATUS_OK; -- 2.7.4 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [PATCH 2/3] st/vdpau: use dri3 to direclty send the buffer to X
this avoids an extra copy which occurs in case of dri2 Suggested-by: Christian KönigSigned-off-by: Nayan Deshmukh --- src/gallium/state_trackers/vdpau/presentation.c | 7 +++ 1 file changed, 7 insertions(+) diff --git a/src/gallium/state_trackers/vdpau/presentation.c b/src/gallium/state_trackers/vdpau/presentation.c index f35d73a..9051b49 100644 --- a/src/gallium/state_trackers/vdpau/presentation.c +++ b/src/gallium/state_trackers/vdpau/presentation.c @@ -231,12 +231,16 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue, vscreen = pq->device->vscreen; pipe_mutex_lock(pq->device->mutex); +#if defined(HAVE_DRI3) + vscreen->set_output_texture(vscreen, surf->surface->texture, clip_width, clip_height); +#endif tex = vscreen->texture_from_drawable(vscreen, (void *)pq->drawable); if (!tex) { pipe_mutex_unlock(pq->device->mutex); return VDP_STATUS_INVALID_HANDLE; } +#if !defined(HAVE_DRI3) dirty_area = vscreen->get_dirty_area(vscreen); memset(_templ, 0, sizeof(surf_templ)); @@ -269,6 +273,7 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue, vl_compositor_set_dst_clip(cstate, _clip); vl_compositor_render(cstate, compositor, surf_draw, dirty_area, true); } +#endif vscreen->set_next_timestamp(vscreen, earliest_presentation_time); @@ -297,8 +302,10 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue, framenum++; } +#if !defined(HAVE_DRI3) pipe_resource_reference(, NULL); pipe_surface_reference(_draw, NULL); +#endif pipe_mutex_unlock(pq->device->mutex); return VDP_STATUS_OK; -- 2.7.4 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev