diff options
| author | Brian Paul <brian.paul@tungstengraphics.com> | 2008-09-18 08:10:34 -0600 | 
|---|---|---|
| committer | Brian Paul <brian.paul@tungstengraphics.com> | 2008-09-18 08:10:58 -0600 | 
| commit | f68d2a0febca38bc7b31f9ab9718e944935b48bc (patch) | |
| tree | 56d09fef1f5ade44d0c82a2204c23cb084928033 /src/gallium/auxiliary | |
| parent | 5e1ef85dc430a4439cd60b66262eab9062dd5f4f (diff) | |
gallium: fix surface object memory leak in cso module
Diffstat (limited to 'src/gallium/auxiliary')
| -rw-r--r-- | src/gallium/auxiliary/cso_cache/cso_context.c | 20 | 
1 files changed, 20 insertions, 0 deletions
| diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index b1ccfc0374..68508f24de 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -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);     }  } | 
