[g3dvl] fix a whole bunch of memory leaks
authorChristian König <deathsimple@vodafone.de>
Mon, 11 Jul 2011 14:29:02 +0000 (16:29 +0200)
committerChristian König <deathsimple@vodafone.de>
Mon, 11 Jul 2011 14:29:02 +0000 (16:29 +0200)
src/gallium/auxiliary/vl/vl_idct.c
src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
src/gallium/auxiliary/vl/vl_video_buffer.c
src/gallium/state_trackers/vdpau/device.c
src/gallium/state_trackers/vdpau/output.c
src/gallium/state_trackers/vdpau/presentation.c
src/gallium/state_trackers/xorg/xvmc/surface.c

index 45180499e2eb0ce961d3d413cf418e99380c6eab..744a35603d7143aa4033813e7fcab8ee9d272000 100644 (file)
@@ -749,7 +749,8 @@ bool vl_idct_init(struct vl_idct *idct, struct pipe_context *pipe,
                   struct pipe_sampler_view *matrix,
                   struct pipe_sampler_view *transpose)
 {
-   assert(idct && pipe && matrix);
+   assert(idct && pipe);
+   assert(matrix && transpose);
 
    idct->pipe = pipe;
    idct->buffer_width = buffer_width;
@@ -777,6 +778,7 @@ vl_idct_cleanup(struct vl_idct *idct)
    cleanup_state(idct);
 
    pipe_sampler_view_reference(&idct->matrix, NULL);
+   pipe_sampler_view_reference(&idct->transpose, NULL);
 }
 
 bool
@@ -784,9 +786,8 @@ vl_idct_init_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer,
                     struct pipe_sampler_view *source,
                     struct pipe_sampler_view *intermediate)
 {
-   assert(buffer);
-   assert(idct);
-   assert(source);
+   assert(buffer && idct);
+   assert(source && intermediate);
 
    memset(buffer, 0, sizeof(struct vl_idct_buffer));
 
@@ -811,6 +812,9 @@ vl_idct_cleanup_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer)
 
    cleanup_source(idct, buffer);
    cleanup_intermediate(idct, buffer);
+
+   pipe_sampler_view_reference(&buffer->sampler_views.individual.matrix, NULL);
+   pipe_sampler_view_reference(&buffer->sampler_views.individual.transpose, NULL);
 }
 
 void
index b866e0e5aec07677ed44d23de8fb5f42f4a655f9..7bb5a695e40617722cec930bec07d50e19233037 100644 (file)
@@ -447,6 +447,7 @@ vl_mpeg12_destroy(struct pipe_video_decoder *decoder)
 
    pipe_resource_reference(&dec->quads.buffer, NULL);
    pipe_resource_reference(&dec->pos.buffer, NULL);
+   pipe_resource_reference(&dec->block_num.buffer, NULL);
 
    pipe_sampler_view_reference(&dec->zscan_linear, NULL);
    pipe_sampler_view_reference(&dec->zscan_normal, NULL);
index 49b7b50cfee3387d62c1b6ec59d26e898e1d79ee..8b05749659f935c725230fe66e7637f0b170d148 100644 (file)
@@ -102,6 +102,8 @@ vl_video_buffer_destroy(struct pipe_video_buffer *buffer)
       pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL);
       pipe_resource_reference(&buf->resources[i], NULL);
    }
+
+   FREE(buffer);
 }
 
 static struct pipe_sampler_view **
index b032e83dc80e491be6feca6088f7244b368ba735..200d5f62f63b74f3ccf4ef487c108bc74106e6f9 100644 (file)
@@ -151,6 +151,9 @@ vlVdpDeviceDestroy(VdpDevice device)
    vlVdpDevice *dev = vlGetDataHTAB(device);
    if (!dev)
       return VDP_STATUS_INVALID_HANDLE;
+      
+   vl_video_destroy(dev->context);
+   vl_screen_destroy(dev->vscreen);
 
    FREE(dev);
    vlDestroyHTAB();
index f67d6ccff6bab576d42cfb7c1fb1a390a700658e..bc4b39ae75c0aecae95e5b3e330bc3345d0869df 100644 (file)
@@ -88,6 +88,7 @@ vlVdpOutputSurfaceCreate(VdpDevice device,
 
    vlsurface->sampler_view = pipe->create_sampler_view(pipe, res, &sv_templ);
    if (!vlsurface->sampler_view) {
+      pipe_resource_reference(&res, NULL);
       FREE(dev);
       return VDP_STATUS_ERROR;
    }
@@ -97,15 +98,19 @@ vlVdpOutputSurfaceCreate(VdpDevice device,
    surf_templ.usage = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
    vlsurface->surface = pipe->create_surface(pipe, res, &surf_templ);
    if (!vlsurface->surface) {
+      pipe_resource_reference(&res, NULL);
       FREE(dev);
       return VDP_STATUS_ERROR;
    }
 
    *surface = vlAddDataHTAB(vlsurface);
    if (*surface == 0) {
+      pipe_resource_reference(&res, NULL);
       FREE(dev);
       return VDP_STATUS_ERROR;
    }
+   
+   pipe_resource_reference(&res, NULL);
 
    return VDP_STATUS_OK;
 }
index 16beb289c4240c7e2cec1a2044c31eabba59a590..1176c7a30b764487d4ab2833ada0cf0130511790 100644 (file)
@@ -192,6 +192,8 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue,
       if (system(cmd) != 0)
          VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Dumping surface %d failed.\n", surface);
    }
+   
+   pipe_surface_reference(&drawable_surface, NULL);
 
    return VDP_STATUS_OK;
 }
index e8ca8152e7ae8abf5c66e10e070349ca31cbc9b0..aef1eff2bb3c66a405397f4124ec402406c6ac2e 100644 (file)
@@ -522,6 +522,7 @@ Status XvMCPutSurface(Display *dpy, XvMCSurface *surface, Drawable drawable,
        context_priv->dst_rect.x != dst_rect.x || context_priv->dst_rect.y != dst_rect.y ||
        context_priv->dst_rect.w != dst_rect.w || context_priv->dst_rect.h != dst_rect.h) {
 
+      pipe_surface_reference(&context_priv->drawable_surface, NULL);
       context_priv->drawable_surface = vl_drawable_surface_get(context_priv->vctx, drawable);
       context_priv->dst_rect = dst_rect;
       vl_compositor_reset_dirty_area(compositor);
@@ -636,6 +637,9 @@ Status XvMCDestroySurface(Display *dpy, XvMCSurface *surface)
       return XvMCBadSurface;
 
    surface_priv = surface->privData;
+   
+   if (surface_priv->mapped)
+      surface_priv->decode_buffer->end_frame(surface_priv->decode_buffer);
    surface_priv->decode_buffer->destroy(surface_priv->decode_buffer);
    surface_priv->video_buffer->destroy(surface_priv->video_buffer);
    FREE(surface_priv);