st/mesa: use pipe_sampler_view_release for releasing sampler views
This fixes a crash when exiting Firefox. I have really no idea how Firefox does it. It seems to involve multiple contexts and multithreading. v2: added an XXX comment Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=81680 Acked by Christian König. Cc: 10.2 10.3 <mesa-stable@lists.freedesktop.org> Tested-by: Benjamin Bellec <b.bellec@gmail.com>
This commit is contained in:
@@ -96,6 +96,7 @@ st_bind_surface(struct gl_context *ctx, GLenum target,
|
||||
struct gl_texture_image *texImage,
|
||||
struct pipe_surface *ps)
|
||||
{
|
||||
struct st_context *st = st_context(ctx);
|
||||
struct st_texture_object *stObj;
|
||||
struct st_texture_image *stImage;
|
||||
GLenum internalFormat;
|
||||
@@ -124,7 +125,7 @@ st_bind_surface(struct gl_context *ctx, GLenum target,
|
||||
|
||||
/* FIXME create a non-default sampler view from the pipe_surface? */
|
||||
pipe_resource_reference(&stObj->pt, ps->texture);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
pipe_resource_reference(&stImage->pt, stObj->pt);
|
||||
|
||||
stObj->width0 = ps->width;
|
||||
|
||||
@@ -152,10 +152,11 @@ static void
|
||||
st_DeleteTextureObject(struct gl_context *ctx,
|
||||
struct gl_texture_object *texObj)
|
||||
{
|
||||
struct st_context *st = st_context(ctx);
|
||||
struct st_texture_object *stObj = st_texture_object(texObj);
|
||||
|
||||
pipe_resource_reference(&stObj->pt, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
st_texture_free_sampler_views(stObj);
|
||||
_mesa_delete_texture_object(ctx, texObj);
|
||||
}
|
||||
@@ -512,7 +513,7 @@ st_AllocTextureImageBuffer(struct gl_context *ctx,
|
||||
/* The parent texture object does not have space for this image */
|
||||
|
||||
pipe_resource_reference(&stObj->pt, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
|
||||
if (!guess_and_alloc_texture(st, stObj, stImage)) {
|
||||
/* Probably out of memory.
|
||||
@@ -1571,13 +1572,13 @@ st_finalize_texture(struct gl_context *ctx,
|
||||
|
||||
if (!st_obj) {
|
||||
pipe_resource_reference(&stObj->pt, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
if (st_obj->buffer != stObj->pt) {
|
||||
pipe_resource_reference(&stObj->pt, st_obj->buffer);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
stObj->width0 = stObj->pt->width0 / _mesa_get_format_bytes(tObj->_BufferObjectFormat);
|
||||
stObj->height0 = 1;
|
||||
stObj->depth0 = 1;
|
||||
@@ -1598,7 +1599,7 @@ st_finalize_texture(struct gl_context *ctx,
|
||||
firstImage->pt != stObj->pt &&
|
||||
(!stObj->pt || firstImage->pt->last_level >= stObj->pt->last_level)) {
|
||||
pipe_resource_reference(&stObj->pt, firstImage->pt);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
}
|
||||
|
||||
/* If this texture comes from a window system, there is nothing else to do. */
|
||||
@@ -1646,7 +1647,7 @@ st_finalize_texture(struct gl_context *ctx,
|
||||
* gallium texture now. We'll make a new one below.
|
||||
*/
|
||||
pipe_resource_reference(&stObj->pt, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
st->dirty.st |= ST_NEW_FRAMEBUFFER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target,
|
||||
|
||||
/* release the old tex (will likely be freed too) */
|
||||
pipe_resource_reference(&oldTex, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
}
|
||||
else {
|
||||
/* Make sure that the base texture image data is present in the
|
||||
|
||||
@@ -519,12 +519,14 @@ st_texture_release_sampler_view(struct st_context *st,
|
||||
}
|
||||
|
||||
void
|
||||
st_texture_release_all_sampler_views(struct st_texture_object *stObj)
|
||||
st_texture_release_all_sampler_views(struct st_context *st,
|
||||
struct st_texture_object *stObj)
|
||||
{
|
||||
GLuint i;
|
||||
|
||||
/* XXX This should use sampler_views[i]->pipe, not st->pipe */
|
||||
for (i = 0; i < stObj->num_sampler_views; ++i)
|
||||
pipe_sampler_view_reference(&stObj->sampler_views[i], NULL);
|
||||
pipe_sampler_view_release(st->pipe, &stObj->sampler_views[i]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -255,7 +255,8 @@ st_texture_release_sampler_view(struct st_context *st,
|
||||
struct st_texture_object *stObj);
|
||||
|
||||
extern void
|
||||
st_texture_release_all_sampler_views(struct st_texture_object *stObj);
|
||||
st_texture_release_all_sampler_views(struct st_context *st,
|
||||
struct st_texture_object *stObj);
|
||||
|
||||
void
|
||||
st_texture_free_sampler_views(struct st_texture_object *stObj);
|
||||
|
||||
@@ -139,7 +139,7 @@ st_vdpau_map_surface(struct gl_context *ctx, GLenum target, GLenum access,
|
||||
texFormat);
|
||||
|
||||
pipe_resource_reference(&stObj->pt, res);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
pipe_resource_reference(&stImage->pt, res);
|
||||
|
||||
u_sampler_view_default_template(&templ, res, res->format);
|
||||
@@ -172,7 +172,7 @@ st_vdpau_unmap_surface(struct gl_context *ctx, GLenum target, GLenum access,
|
||||
struct st_texture_image *stImage = st_texture_image(texImage);
|
||||
|
||||
pipe_resource_reference(&stObj->pt, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
pipe_resource_reference(&stImage->pt, NULL);
|
||||
|
||||
_mesa_dirty_texobj(ctx, texObj);
|
||||
|
||||
Reference in New Issue
Block a user