[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