st/mesa: fix sampler view handling with shared textures v4

Release the references to the sampler views before
destroying the pipe context.

v2: remove TODO and unrelated change
v3: move to st_texture.[ch], rename callback, add comment
v4: fix rebase mess up and add further cleanups

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Cc: "10.0 10.1" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
Christian König 2014-03-23 17:01:38 +01:00
parent 3b421daf32
commit d117ddbe31
3 changed files with 28 additions and 0 deletions

View file

@ -33,6 +33,7 @@
#include "main/shaderobj.h"
#include "main/version.h"
#include "main/vtxfmt.h"
#include "main/hash.h"
#include "program/prog_cache.h"
#include "vbo/vbo.h"
#include "glapi/glapi.h"
@ -66,6 +67,7 @@
#include "st_gen_mipmap.h"
#include "st_program.h"
#include "st_vdpau.h"
#include "st_texture.h"
#include "pipe/p_context.h"
#include "util/u_inlines.h"
#include "util/u_upload_mgr.h"
@ -280,6 +282,19 @@ static void st_destroy_context_priv( struct st_context *st )
free( st );
}
/**
* Callback to release the sampler view attached to a texture object.
* Called by _mesa_HashWalk().
*/
static void
destroy_tex_sampler_cb(GLuint id, void *data, void *userData)
{
struct gl_texture_object *texObj = (struct gl_texture_object *) data;
struct st_context *st = (struct st_context *) userData;
st_texture_release_sampler_view(st, st_texture_object(texObj));
}
void st_destroy_context( struct st_context *st )
{
@ -288,6 +303,8 @@ void st_destroy_context( struct st_context *st )
struct gl_context *ctx = st->ctx;
GLuint i;
_mesa_HashWalk(ctx->Shared->TexObjects, destroy_tex_sampler_cb, st);
/* need to unbind and destroy CSO objects before anything else */
cso_release_all(st->cso_context);

View file

@ -412,3 +412,10 @@ st_create_color_map_texture(struct gl_context *ctx)
return pt;
}
void
st_texture_release_sampler_view(struct st_context *st,
struct st_texture_object *stObj)
{
if (stObj->sampler_view && stObj->sampler_view->context == st->pipe)
pipe_sampler_view_reference(&stObj->sampler_view, NULL);
}

View file

@ -227,4 +227,8 @@ st_texture_image_copy(struct pipe_context *pipe,
extern struct pipe_resource *
st_create_color_map_texture(struct gl_context *ctx);
extern void
st_texture_release_sampler_view(struct st_context *st,
struct st_texture_object *stObj);
#endif