From: Christian König Date: Mon, 11 Jul 2011 14:29:02 +0000 (+0200) Subject: [g3dvl] fix a whole bunch of memory leaks X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=df5e0b9435c869f88234a69db9bfe97342b027d4;p=mesa.git [g3dvl] fix a whole bunch of memory leaks --- diff --git a/src/gallium/auxiliary/vl/vl_idct.c b/src/gallium/auxiliary/vl/vl_idct.c index 45180499e2e..744a35603d7 100644 --- a/src/gallium/auxiliary/vl/vl_idct.c +++ b/src/gallium/auxiliary/vl/vl_idct.c @@ -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 diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c index b866e0e5aec..7bb5a695e40 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c @@ -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); diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c b/src/gallium/auxiliary/vl/vl_video_buffer.c index 49b7b50cfee..8b05749659f 100644 --- a/src/gallium/auxiliary/vl/vl_video_buffer.c +++ b/src/gallium/auxiliary/vl/vl_video_buffer.c @@ -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 ** diff --git a/src/gallium/state_trackers/vdpau/device.c b/src/gallium/state_trackers/vdpau/device.c index b032e83dc80..200d5f62f63 100644 --- a/src/gallium/state_trackers/vdpau/device.c +++ b/src/gallium/state_trackers/vdpau/device.c @@ -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(); diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c index f67d6ccff6b..bc4b39ae75c 100644 --- a/src/gallium/state_trackers/vdpau/output.c +++ b/src/gallium/state_trackers/vdpau/output.c @@ -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; } diff --git a/src/gallium/state_trackers/vdpau/presentation.c b/src/gallium/state_trackers/vdpau/presentation.c index 16beb289c42..1176c7a30b7 100644 --- a/src/gallium/state_trackers/vdpau/presentation.c +++ b/src/gallium/state_trackers/vdpau/presentation.c @@ -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; } diff --git a/src/gallium/state_trackers/xorg/xvmc/surface.c b/src/gallium/state_trackers/xorg/xvmc/surface.c index e8ca8152e7a..aef1eff2bb3 100644 --- a/src/gallium/state_trackers/xorg/xvmc/surface.c +++ b/src/gallium/state_trackers/xorg/xvmc/surface.c @@ -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);