gallium: fix surface object memory leak in cso module
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 18 Sep 2008 14:10:34 +0000 (08:10 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 18 Sep 2008 14:10:58 +0000 (08:10 -0600)
src/gallium/auxiliary/cso_cache/cso_context.c

index b1ccfc0374a07189f09da1fe3a75b39a6db51742..68508f24de47aed4a44d98a37055f3295b0ec590 100644 (file)
@@ -80,6 +80,10 @@ struct cso_context {
 };
 
 
+static void
+free_framebuffer_state(struct pipe_framebuffer_state *fb);
+
+
 static boolean delete_blend_state(struct cso_context *ctx, void *state)
 {
    struct cso_blend *cso = (struct cso_blend *)state;
@@ -252,6 +256,9 @@ void cso_release_all( struct cso_context *ctx )
       pipe_texture_reference(&ctx->textures_saved[i], NULL);
    }
 
+   free_framebuffer_state(&ctx->fb);
+   free_framebuffer_state(&ctx->fb_saved);
+
    if (ctx->cache) {
       cso_cache_delete( ctx->cache );
       ctx->cache = NULL;
@@ -784,6 +791,18 @@ copy_framebuffer_state(struct pipe_framebuffer_state *dst,
 }
 
 
+static void
+free_framebuffer_state(struct pipe_framebuffer_state *fb)
+{
+   uint i;
+
+   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
+      pipe_surface_reference(&fb->cbufs[i], NULL);
+   }
+   pipe_surface_reference(&fb->zsbuf, NULL);
+}
+
+
 enum pipe_error cso_set_framebuffer(struct cso_context *ctx,
                                     const struct pipe_framebuffer_state *fb)
 {
@@ -804,6 +823,7 @@ void cso_restore_framebuffer(struct cso_context *ctx)
    if (memcmp(&ctx->fb, &ctx->fb_saved, sizeof(ctx->fb))) {
       copy_framebuffer_state(&ctx->fb, &ctx->fb_saved);
       ctx->pipe->set_framebuffer_state(ctx->pipe, &ctx->fb);
+      free_framebuffer_state(&ctx->fb_saved);
    }
 }