[Mesa-dev] [PATCH] st/vdpau: use temporary buffers while applying filters
Christian König
deathsimple at vodafone.de
Fri Aug 26 08:06:23 UTC 2016
Am 26.08.2016 um 07:51 schrieb Nayan Deshmukh:
> We use temporary buffers so that we don't read and write to the
> same surface at the same time. We don't need to use linear
> layout now.
>
> Signed-off-by: Nayan Deshmukh <nayan26deshmukh at gmail.com>
Looks really good to me, can you rebase this on the revert of the
earlier patch I've just send out?
And please reply to the revert with an Acked-by or Reviewed-by to note
that you are ok with it.
Regards,
Christian.
> ---
> src/gallium/state_trackers/vdpau/mixer.c | 87 ++++++++++++++++++++++----------
> 1 file changed, 59 insertions(+), 28 deletions(-)
>
> diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c
> index 56b667d..c205427 100644
> --- a/src/gallium/state_trackers/vdpau/mixer.c
> +++ b/src/gallium/state_trackers/vdpau/mixer.c
> @@ -240,8 +240,10 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
> struct u_rect rect, clip, *prect, dirty_area;
> unsigned i, layer = 0;
> struct pipe_video_buffer *video_buffer;
> - struct pipe_sampler_view *sampler_view, **sampler_views;
> - struct pipe_surface *surface, **surfaces;
> + struct pipe_sampler_view *sampler_view, sv_templ;
> + struct pipe_surface *surface, surf_templ;
> + struct pipe_context *pipe;
> + struct pipe_resource res_tmpl, *res;
>
> vlVdpVideoMixer *vmixer;
> vlVdpSurface *surf;
> @@ -325,22 +327,6 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
> }
> }
>
> - surfaces = video_buffer->get_surfaces(video_buffer);
> - sampler_views = video_buffer->get_sampler_view_planes(video_buffer);
> -
> - for(i = 0; i < VL_MAX_SURFACES; ++i) {
> - if(sampler_views[i] != NULL && surfaces[i] != NULL) {
> - if (vmixer->noise_reduction.filter)
> - vl_median_filter_render(vmixer->noise_reduction.filter,
> - sampler_views[i], surfaces[i]);
> -
> - if (vmixer->sharpness.filter)
> - vl_matrix_filter_render(vmixer->sharpness.filter,
> - sampler_views[i], surfaces[i]);
> -
> - }
> - }
> -
> prect = RectToPipe(video_source_rect, &rect);
> if (!prect) {
> rect.x0 = 0;
> @@ -351,25 +337,25 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
> }
> vl_compositor_set_buffer_layer(&vmixer->cstate, compositor, layer, video_buffer, prect, NULL, deinterlace);
>
> - if(vmixer->bicubic.filter) {
> - struct pipe_context *pipe;
> - struct pipe_resource res_tmpl, *res;
> - struct pipe_sampler_view sv_templ;
> - struct pipe_surface surf_templ;
> -
> + if (vmixer->bicubic.filter || vmixer->sharpness.filter || vmixer->noise_reduction.filter) {
> pipe = vmixer->device->context;
> memset(&res_tmpl, 0, sizeof(res_tmpl));
>
> res_tmpl.target = PIPE_TEXTURE_2D;
> - res_tmpl.width0 = surf->templat.width;
> - res_tmpl.height0 = surf->templat.height;
> res_tmpl.format = dst->sampler_view->format;
> res_tmpl.depth0 = 1;
> res_tmpl.array_size = 1;
> - res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET |
> - PIPE_BIND_LINEAR;
> + res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
> res_tmpl.usage = PIPE_USAGE_DEFAULT;
>
> + if (!vmixer->bicubic.filter) {
> + res_tmpl.width0 = dst->surface->width;
> + res_tmpl.height0 = dst->surface->height;
> + } else {
> + res_tmpl.width0 = surf->templat.width;
> + res_tmpl.height0 = surf->templat.height;
> + }
> +
> res = pipe->screen->resource_create(pipe->screen, &res_tmpl);
>
> vlVdpDefaultSamplerViewTemplate(&sv_templ, res);
> @@ -385,6 +371,9 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
> surface = dst->surface;
> sampler_view = dst->sampler_view;
> dirty_area = dst->dirty_area;
> + }
> +
> + if (!vmixer->bicubic.filter) {
> vl_compositor_set_layer_dst_area(&vmixer->cstate, layer++, RectToPipe(destination_video_rect, &rect));
> vl_compositor_set_dst_clip(&vmixer->cstate, RectToPipe(destination_rect, &clip));
> }
> @@ -410,6 +399,48 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
> else {
> vl_compositor_render(&vmixer->cstate, compositor, surface, &dirty_area, true);
>
> + if (vmixer->noise_reduction.filter) {
> + if (!vmixer->sharpness.filter && !vmixer->bicubic.filter) {
> + vl_median_filter_render(vmixer->noise_reduction.filter,
> + sampler_view, dst->surface);
> + } else {
> + res = pipe->screen->resource_create(pipe->screen, &res_tmpl);
> + struct pipe_sampler_view *sampler_view_temp = pipe->create_sampler_view(pipe, res, &sv_templ);
> + struct pipe_surface *surface_temp = pipe->create_surface(pipe, res, &surf_templ);
> + pipe_resource_reference(&res, NULL);
> +
> + vl_median_filter_render(vmixer->noise_reduction.filter,
> + sampler_view, surface_temp);
> +
> + pipe_sampler_view_reference(&sampler_view, NULL);
> + pipe_surface_reference(&surface, NULL);
> +
> + sampler_view = sampler_view_temp;
> + surface = surface_temp;
> + }
> + }
> +
> + if (vmixer->sharpness.filter) {
> + if (!vmixer->bicubic.filter) {
> + vl_matrix_filter_render(vmixer->sharpness.filter,
> + sampler_view, dst->surface);
> + } else {
> + res = pipe->screen->resource_create(pipe->screen, &res_tmpl);
> + struct pipe_sampler_view *sampler_view_temp = pipe->create_sampler_view(pipe, res, &sv_templ);
> + struct pipe_surface *surface_temp = pipe->create_surface(pipe, res, &surf_templ);
> + pipe_resource_reference(&res, NULL);
> +
> + vl_matrix_filter_render(vmixer->sharpness.filter,
> + sampler_view, surface_temp);
> +
> + pipe_sampler_view_reference(&sampler_view, NULL);
> + pipe_surface_reference(&surface, NULL);
> +
> + sampler_view = sampler_view_temp;
> + surface = surface_temp;
> + }
> + }
> +
> if (vmixer->bicubic.filter)
> vl_bicubic_filter_render(vmixer->bicubic.filter,
> sampler_view, dst->surface,
More information about the mesa-dev
mailing list