Re: [Mesa-dev] [PATCH] vl: use a separate context for shader based decode
Ups, indeed. That line is still in my code directory not amended to the patch. Thanks for the info, will send out a v2 soon. Anything else I should take care of? Christian. Am 06.11.2013 16:38, schrieb Aaron Watry: I haven't looked in-depth at the rest of the patch, but I don't see anywhere in vl_mpeg12_destroy that you are actually destroying the context that you create in vl_create_mpeg12_decoder. Would I be correct in assuming that this is leaked memory? --Aaron On Wed, Nov 6, 2013 at 8:13 AM, Christian König deathsim...@vodafone.de wrote: From: Christian König christian.koe...@amd.com This makes VDPAU thread save again. Signed-off-by: Christian König christian.koe...@amd.com --- src/gallium/auxiliary/vl/vl_mpeg12_decoder.c | 180 ++- src/gallium/auxiliary/vl/vl_mpeg12_decoder.h | 1 + 2 files changed, 120 insertions(+), 61 deletions(-) diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c index ca4eb3e..3777174 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c @@ -82,6 +82,63 @@ static const unsigned const_empty_block_mask_420[3][2][2] = { { { 0x01, 0x01 }, { 0x01, 0x01 } } }; +struct video_buffer_private +{ + struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS]; + struct pipe_surface *surfaces[VL_MAX_SURFACES]; + + struct vl_mpeg12_buffer *buffer; +}; + +static void +vl_mpeg12_destroy_buffer(struct vl_mpeg12_buffer *buf); + +static void +destroy_video_buffer_private(void *private) +{ + struct video_buffer_private *priv = private; + unsigned i; + + for (i = 0; i VL_NUM_COMPONENTS; ++i) + pipe_sampler_view_reference(priv-sampler_view_planes[i], NULL); + + for (i = 0; i VL_MAX_SURFACES; ++i) + pipe_surface_reference(priv-surfaces[i], NULL); + + if (priv-buffer) + vl_mpeg12_destroy_buffer(priv-buffer); +} + +static struct video_buffer_private * +get_video_buffer_private(struct vl_mpeg12_decoder *dec, struct pipe_video_buffer *buf) +{ + struct pipe_context *pipe = dec-context; + struct video_buffer_private *priv; + struct pipe_sampler_view **sv; + struct pipe_surface **surf; + unsigned i; + + priv = vl_video_buffer_get_associated_data(buf, dec-base); + if (priv) + return priv; + + priv = CALLOC_STRUCT(video_buffer_private); + + sv = buf-get_sampler_view_planes(buf); + for (i = 0; i VL_NUM_COMPONENTS; ++i) + if (sv[i]) + priv-sampler_view_planes[i] = pipe-create_sampler_view(pipe, sv[i]-texture, sv[i]); + + surf = buf-get_surfaces(buf); + for (i = 0; i VL_MAX_SURFACES; ++i) + if (surf[i]) + priv-surfaces[i] = pipe-create_surface(pipe, surf[i]-texture, surf[i]); + + vl_video_buffer_set_associated_data(buf, dec-base, priv, destroy_video_buffer_private); + + return priv; +} + static bool init_zscan_buffer(struct vl_mpeg12_decoder *dec, struct vl_mpeg12_buffer *buffer) { @@ -103,7 +160,7 @@ init_zscan_buffer(struct vl_mpeg12_decoder *dec, struct vl_mpeg12_buffer *buffer res_tmpl.usage = PIPE_USAGE_STREAM; res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW; - res = dec-base.context-screen-resource_create(dec-base.context-screen, res_tmpl); + res = dec-context-screen-resource_create(dec-context-screen, res_tmpl); if (!res) goto error_source; @@ -111,7 +168,7 @@ init_zscan_buffer(struct vl_mpeg12_decoder *dec, struct vl_mpeg12_buffer *buffer memset(sv_tmpl, 0, sizeof(sv_tmpl)); u_sampler_view_default_template(sv_tmpl, res, res-format); sv_tmpl.swizzle_r = sv_tmpl.swizzle_g = sv_tmpl.swizzle_b = sv_tmpl.swizzle_a = PIPE_SWIZZLE_RED; - buffer-zscan_source = dec-base.context-create_sampler_view(dec-base.context, res, sv_tmpl); + buffer-zscan_source = dec-context-create_sampler_view(dec-context, res, sv_tmpl); pipe_resource_reference(res, NULL); if (!buffer-zscan_source) goto error_sampler; @@ -384,9 +441,8 @@ UploadYcbcrBlocks(struct vl_mpeg12_decoder *dec, } static void -vl_mpeg12_destroy_buffer(void *buffer) +vl_mpeg12_destroy_buffer(struct vl_mpeg12_buffer *buf) { - struct vl_mpeg12_buffer *buf = buffer; assert(buf); @@ -407,11 +463,11 @@ vl_mpeg12_destroy(struct pipe_video_codec *decoder) assert(decoder); /* Asserted in softpipe_delete_fs_state() for some reason */ - dec-base.context-bind_vs_state(dec-base.context, NULL); - dec-base.context-bind_fs_state(dec-base.context, NULL); + dec-context-bind_vs_state(dec-context, NULL); + dec-context-bind_fs_state(dec-context, NULL); - dec-base.context-delete_depth_stencil_alpha_state(dec-base.context, dec-dsa); - dec-base.context-delete_sampler_state(dec-base.context, dec-sampler_ycbcr); + dec-context-delete_depth_stencil_alpha_state(dec-context, dec-dsa); + dec-context-delete_sampler_state(dec-context, dec-sampler_ycbcr); vl_mc_cleanup(dec-mc_y); vl_mc_cleanup(dec-mc_c); @@
Re: [Mesa-dev] [PATCH] vl: use a separate context for shader based decode
On Wed, Nov 6, 2013 at 8:13 AM, Christian König deathsim...@vodafone.de wrote: From: Christian König christian.koe...@amd.com This makes VDPAU thread save again. Signed-off-by: Christian König christian.koe...@amd.com --- src/gallium/auxiliary/vl/vl_mpeg12_decoder.c | 180 ++- src/gallium/auxiliary/vl/vl_mpeg12_decoder.h | 1 + 2 files changed, 120 insertions(+), 61 deletions(-) diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c index ca4eb3e..3777174 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c @@ -82,6 +82,63 @@ static const unsigned const_empty_block_mask_420[3][2][2] = { { { 0x01, 0x01 }, { 0x01, 0x01 } } }; +struct video_buffer_private +{ + struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS]; + struct pipe_surface *surfaces[VL_MAX_SURFACES]; + + struct vl_mpeg12_buffer *buffer; +}; + +static void +vl_mpeg12_destroy_buffer(struct vl_mpeg12_buffer *buf); + +static void +destroy_video_buffer_private(void *private) +{ + struct video_buffer_private *priv = private; + unsigned i; + + for (i = 0; i VL_NUM_COMPONENTS; ++i) + pipe_sampler_view_reference(priv-sampler_view_planes[i], NULL); + + for (i = 0; i VL_MAX_SURFACES; ++i) + pipe_surface_reference(priv-surfaces[i], NULL); + + if (priv-buffer) + vl_mpeg12_destroy_buffer(priv-buffer); Should we be freeing priv/private at the end here, or is this struct still in use elsewhere? I'm assuming that it's unused, given that this is the matching destructor for get_video_buffer_private where the struct is CALLOC'd. I'm not too qualified to give a full review of this patch, but I had memory leaks on my mind after some stuff I was working on last night. I didn't see any others besides the one in my first email and this one. I haven't run this through valgrind, so for the moment it's just me looking for stuff that's fishy. --Aaron +} + +static struct video_buffer_private * +get_video_buffer_private(struct vl_mpeg12_decoder *dec, struct pipe_video_buffer *buf) +{ + struct pipe_context *pipe = dec-context; + struct video_buffer_private *priv; + struct pipe_sampler_view **sv; + struct pipe_surface **surf; + unsigned i; + + priv = vl_video_buffer_get_associated_data(buf, dec-base); + if (priv) + return priv; + + priv = CALLOC_STRUCT(video_buffer_private); + + sv = buf-get_sampler_view_planes(buf); + for (i = 0; i VL_NUM_COMPONENTS; ++i) + if (sv[i]) + priv-sampler_view_planes[i] = pipe-create_sampler_view(pipe, sv[i]-texture, sv[i]); + + surf = buf-get_surfaces(buf); + for (i = 0; i VL_MAX_SURFACES; ++i) + if (surf[i]) + priv-surfaces[i] = pipe-create_surface(pipe, surf[i]-texture, surf[i]); + + vl_video_buffer_set_associated_data(buf, dec-base, priv, destroy_video_buffer_private); + + return priv; +} + static bool init_zscan_buffer(struct vl_mpeg12_decoder *dec, struct vl_mpeg12_buffer *buffer) { @@ -103,7 +160,7 @@ init_zscan_buffer(struct vl_mpeg12_decoder *dec, struct vl_mpeg12_buffer *buffer res_tmpl.usage = PIPE_USAGE_STREAM; res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW; - res = dec-base.context-screen-resource_create(dec-base.context-screen, res_tmpl); + res = dec-context-screen-resource_create(dec-context-screen, res_tmpl); if (!res) goto error_source; @@ -111,7 +168,7 @@ init_zscan_buffer(struct vl_mpeg12_decoder *dec, struct vl_mpeg12_buffer *buffer memset(sv_tmpl, 0, sizeof(sv_tmpl)); u_sampler_view_default_template(sv_tmpl, res, res-format); sv_tmpl.swizzle_r = sv_tmpl.swizzle_g = sv_tmpl.swizzle_b = sv_tmpl.swizzle_a = PIPE_SWIZZLE_RED; - buffer-zscan_source = dec-base.context-create_sampler_view(dec-base.context, res, sv_tmpl); + buffer-zscan_source = dec-context-create_sampler_view(dec-context, res, sv_tmpl); pipe_resource_reference(res, NULL); if (!buffer-zscan_source) goto error_sampler; @@ -384,9 +441,8 @@ UploadYcbcrBlocks(struct vl_mpeg12_decoder *dec, } static void -vl_mpeg12_destroy_buffer(void *buffer) +vl_mpeg12_destroy_buffer(struct vl_mpeg12_buffer *buf) { - struct vl_mpeg12_buffer *buf = buffer; assert(buf); @@ -407,11 +463,11 @@ vl_mpeg12_destroy(struct pipe_video_codec *decoder) assert(decoder); /* Asserted in softpipe_delete_fs_state() for some reason */ - dec-base.context-bind_vs_state(dec-base.context, NULL); - dec-base.context-bind_fs_state(dec-base.context, NULL); + dec-context-bind_vs_state(dec-context, NULL); + dec-context-bind_fs_state(dec-context, NULL); - dec-base.context-delete_depth_stencil_alpha_state(dec-base.context, dec-dsa); - dec-base.context-delete_sampler_state(dec-base.context, dec-sampler_ycbcr); +