[Mesa-dev] [PATCH] st/vdpau: use temporary buffers while applying filters

Nayan Deshmukh nayan26deshmukh at gmail.com
Tue Aug 16 14:18:50 UTC 2016


Hi,

I sent out the patch in a hurry and later noticed that the coding style is off
at some places especially the ifs. I will send a new patch with fixes once
the patch before this is verified by Andy.

Regards,
Nayan.

On Tue, Aug 16, 2016 at 2:53 PM, Nayan Deshmukh
<nayan26deshmukh at gmail.com> wrote:
> We temporary buffers so that we don't read and write to the
> same surface at the same time.
>
> Signed-off-by: Nayan Deshmukh <nayan26deshmukh at gmail.com>
> ---
>  src/gallium/state_trackers/vdpau/mixer.c | 54 ++++++++++++++++++++++++++------
>  1 file changed, 45 insertions(+), 9 deletions(-)
>
> diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c
> index 56b667d..ff6750f 100644
> --- a/src/gallium/state_trackers/vdpau/mixer.c
> +++ b/src/gallium/state_trackers/vdpau/mixer.c
> @@ -239,9 +239,10 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
>     enum vl_compositor_deinterlace deinterlace;
>     struct u_rect rect, clip, *prect, dirty_area;
>     unsigned i, layer = 0;
> -   struct pipe_video_buffer *video_buffer;
> +   struct pipe_video_buffer *video_buffer, templ, *video_buffer_output, *video_buffer_temp = NULL;
>     struct pipe_sampler_view *sampler_view, **sampler_views;
>     struct pipe_surface *surface, **surfaces;
> +   struct pipe_context *pipe;
>
>     vlVdpVideoMixer *vmixer;
>     vlVdpSurface *surf;
> @@ -325,19 +326,48 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
>        }
>     }
>
> -   surfaces = video_buffer->get_surfaces(video_buffer);
> -   sampler_views = video_buffer->get_sampler_view_planes(video_buffer);
> +   video_buffer_output = video_buffer;
>
> -   for(i = 0; i < VL_MAX_SURFACES; ++i) {
> -      if(sampler_views[i] != NULL && surfaces[i] != NULL) {
> -         if (vmixer->noise_reduction.filter)
> +   if (vmixer->noise_reduction.filter || vmixer->sharpness.filter) {
> +      pipe = vmixer->device->context;
> +
> +      memset(&templ, 0, sizeof(templ));
> +      templ.buffer_format = video_buffer->buffer_format;
> +      templ.chroma_format = video_buffer->chroma_format;
> +      templ.width = video_buffer->width;
> +      templ.height = video_buffer->height;
> +      templ.interlaced = video_buffer->interlaced;
> +
> +   }
> +
> +   if (vmixer->noise_reduction.filter) {
> +      sampler_views = video_buffer->get_sampler_view_planes(video_buffer_output);
> +      video_buffer_output = vl_video_buffer_create(pipe, &templ);
> +      surfaces = video_buffer_output->get_surfaces(video_buffer_output);
> +
> +      for(i = 0; i < VL_MAX_SURFACES; ++i) {
> +         if(sampler_views[i] != NULL && surfaces[i] != NULL)
>              vl_median_filter_render(vmixer->noise_reduction.filter,
>                                      sampler_views[i], surfaces[i]);
> +      }
> +   }
>
> -         if (vmixer->sharpness.filter)
> +   if (vmixer->sharpness.filter) {
> +      sampler_views = video_buffer_output->get_sampler_view_planes(video_buffer_output);
> +      /*
> +       * To keep a pointer to the buffer allocated
> +       * if noise reduction is enabled so that it
> +       * can be destroyed in the end
> +       */
> +      if (video_buffer_output != video_buffer)
> +         video_buffer_temp = video_buffer_output;
> +      video_buffer_output = vl_video_buffer_create(pipe, &templ);
> +      surfaces = video_buffer_output->get_surfaces(video_buffer_output);
> +
> +      for (i = 0; i < VL_MAX_SURFACES; ++i) {
> +         if (sampler_views[i] != NULL && surfaces[i] != NULL)
>              vl_matrix_filter_render(vmixer->sharpness.filter,
>                                      sampler_views[i], surfaces[i]);
> -
>        }
>     }
>
> @@ -349,7 +379,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
>        rect.y1 = surf->templat.height;
>        prect = ▭
>     }
> -   vl_compositor_set_buffer_layer(&vmixer->cstate, compositor, layer, video_buffer, prect, NULL, deinterlace);
> +   vl_compositor_set_buffer_layer(&vmixer->cstate, compositor, layer, video_buffer_output, prect, NULL, deinterlace);
>
>     if(vmixer->bicubic.filter) {
>        struct pipe_context *pipe;
> @@ -421,6 +451,12 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
>           pipe_surface_reference(&surface, NULL);
>        }
>     }
> +
> +   if(video_buffer_output != video_buffer)
> +      video_buffer_output->destroy(video_buffer_output);
> +   if(video_buffer_temp != NULL)
> +      video_buffer_temp->destroy(video_buffer_temp);
> +
>     pipe_mutex_unlock(vmixer->device->mutex);
>
>     return VDP_STATUS_OK;
> --
> 2.7.4
>


More information about the mesa-dev mailing list