Re: [Mesa-dev] [PATCH] vl: use a separate context for shader based decode

2013-11-06 Thread Christian König
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

2013-11-06 Thread Aaron Watry
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);
 +