Am 02.10.2014 um 22:37 schrieb Alex Deucher:
On Thu, Oct 2, 2014 at 1:51 PM, Christian König <deathsim...@vodafone.de> wrote:
Am 02.10.2014 um 19:34 schrieb Marek Olšák:
From: Marek Olšák <marek.ol...@amd.com>

This fixes a crash when exiting Firefox. I have really no idea how Firefox
does it. It seems to involve multiple contexts and multithreading.

That looks to me like we now release all sampler views with the current
context and not with the context they where originally created with.

If I remember correctly I changed exactly this because it caused a crash
with XBMC.

I think we need to find the root cause here instead of trying to work around
it. To me it sounds like we still have a sampler view around while the
context used to create it is already destroyed.
Maybe related to this old thread?
http://lists.freedesktop.org/archives/mesa-dev/2011-September/011578.html

Yeah, sounds like the problem we have here.

But the proposed solutions simply don't look correct to me. Ok, I'm going to take a look myself.

Thanks for the hint,
Christian.




Regards,
Christian.


Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=81680

Cc: 10.2 10.3 <mesa-sta...@lists.freedesktop.org>
Tested-by: Benjamin Bellec <b.bel...@gmail.com>
---
   src/mesa/state_tracker/st_cb_eglimage.c |  3 ++-
   src/mesa/state_tracker/st_cb_texture.c  | 13 +++++++------
   src/mesa/state_tracker/st_gen_mipmap.c  |  2 +-
   src/mesa/state_tracker/st_texture.c     |  5 +++--
   src/mesa/state_tracker/st_texture.h     |  3 ++-
   src/mesa/state_tracker/st_vdpau.c       |  4 ++--
   6 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/mesa/state_tracker/st_cb_eglimage.c
b/src/mesa/state_tracker/st_cb_eglimage.c
index 34eb809..8531afb 100644
--- a/src/mesa/state_tracker/st_cb_eglimage.c
+++ b/src/mesa/state_tracker/st_cb_eglimage.c
@@ -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;
diff --git a/src/mesa/state_tracker/st_cb_texture.c
b/src/mesa/state_tracker/st_cb_texture.c
index dfa188a..a8dbb78 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -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;
         }
      }
diff --git a/src/mesa/state_tracker/st_gen_mipmap.c
b/src/mesa/state_tracker/st_gen_mipmap.c
index 18cf504..26e1c21 100644
--- a/src/mesa/state_tracker/st_gen_mipmap.c
+++ b/src/mesa/state_tracker/st_gen_mipmap.c
@@ -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
diff --git a/src/mesa/state_tracker/st_texture.c
b/src/mesa/state_tracker/st_texture.c
index 5996b7d..9334d54 100644
--- a/src/mesa/state_tracker/st_texture.c
+++ b/src/mesa/state_tracker/st_texture.c
@@ -519,12 +519,13 @@ 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;
        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]);
   }
     diff --git a/src/mesa/state_tracker/st_texture.h
b/src/mesa/state_tracker/st_texture.h
index ce1cf8b..d66afcb 100644
--- a/src/mesa/state_tracker/st_texture.h
+++ b/src/mesa/state_tracker/st_texture.h
@@ -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);
diff --git a/src/mesa/state_tracker/st_vdpau.c
b/src/mesa/state_tracker/st_vdpau.c
index 8c10cda..6ccaf3e 100644
--- a/src/mesa/state_tracker/st_vdpau.c
+++ b/src/mesa/state_tracker/st_vdpau.c
@@ -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);

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to