svga: don't reference count svga_sampler_view's texture
authorBrian Paul <brianp@vmware.com>
Wed, 11 Jan 2012 18:52:23 +0000 (19:52 +0100)
committerBrian Paul <brianp@vmware.com>
Wed, 11 Jan 2012 20:10:43 +0000 (13:10 -0700)
svga_sampler_view contains a pointer to a pipe_resource (base class of
svga_texture) and svga_texture contains a pointer to an svga_sampler_view.
This circular dependency prevented the objects from ever being freed when
they pointed to each other.  Make the svga_sampler_view::texture pointer
a "weak reference" (no reference counting) to break the dependency.

This is safe to do because the pipe_resource/texture always has a longer
lifespan than the sampler view so when svga_sampler_view stops referencing
the texture, the texture's refcount never hits zero.

Fixes a memory leak seen with google earth and other apps.

Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
src/gallium/drivers/svga/svga_sampler_view.c

index b756b07b4f672d29df12978ede8c9a341768ec5d..e8234d624c18feee25fc60ade6e7b4e65f2e82f7 100644 (file)
@@ -105,7 +105,12 @@ svga_get_tex_sampler_view(struct pipe_context *pipe,
 
    sv = CALLOC_STRUCT(svga_sampler_view);
    pipe_reference_init(&sv->reference, 1);
-   pipe_resource_reference(&sv->texture, pt);
+
+   /* Note: we're not refcounting the texture resource here to avoid
+    * a circular dependency.
+    */
+   sv->texture = pt;
+
    sv->min_lod = min_lod;
    sv->max_lod = max_lod;
 
@@ -206,6 +211,11 @@ svga_destroy_sampler_view_priv(struct svga_sampler_view *v)
       SVGA_DBG(DEBUG_DMA, "unref sid %p (sampler view)\n", v->handle);
       svga_screen_surface_destroy(ss, &v->key, &v->handle);
    }
-   pipe_resource_reference(&v->texture, NULL);
+
+   /* Note: we're not refcounting the texture resource here to avoid
+    * a circular dependency.
+    */
+   v->texture = NULL;
+
    FREE(v);
 }