svga: don't reference count svga_sampler_view's texture
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>
This commit is contained in:
parent
35cdd7b6db
commit
dce4c368b5
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue