Mesa (main): st/mesa: sink refcounting from st_get_sampler_views into st_sampler_view.c

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Jun 27 13:07:33 UTC 2021


Module: Mesa
Branch: main
Commit: 798518e510084e6b9582af5e0d52bcd9282c3d2c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=798518e510084e6b9582af5e0d52bcd9282c3d2c

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Sun Jun  6 05:23:30 2021 -0400

st/mesa: sink refcounting from st_get_sampler_views into st_sampler_view.c

Do it deeper in the sampler view return path. It minimizes the deltas
for the next commit.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11428>

---

 src/mesa/state_tracker/st_atom_texture.c | 12 +++++------
 src/mesa/state_tracker/st_cb_texture.c   |  5 +++--
 src/mesa/state_tracker/st_sampler_view.c | 34 +++++++++++++++++++++++++-------
 src/mesa/state_tracker/st_sampler_view.h |  6 ++++--
 src/mesa/state_tracker/st_texture.c      |  3 ++-
 src/mesa/state_tracker/st_texture.h      |  2 +-
 6 files changed, 42 insertions(+), 20 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
index f6ef7fa7ed3..b481f355441 100644
--- a/src/mesa/state_tracker/st_atom_texture.c
+++ b/src/mesa/state_tracker/st_atom_texture.c
@@ -58,7 +58,7 @@
 struct pipe_sampler_view *
 st_update_single_texture(struct st_context *st,
                          GLuint texUnit, bool glsl130_or_later,
-                         bool ignore_srgb_decode)
+                         bool ignore_srgb_decode, bool get_reference)
 {
    struct gl_context *ctx = st->ctx;
    struct gl_texture_object *texObj;
@@ -71,7 +71,7 @@ st_update_single_texture(struct st_context *st,
    GLenum target = texObj->Target;
 
    if (unlikely(target == GL_TEXTURE_BUFFER))
-      return st_get_buffer_sampler_view_from_stobj(st, stObj);
+      return st_get_buffer_sampler_view_from_stobj(st, stObj, get_reference);
 
    if (!st_finalize_texture(ctx, st->pipe, texObj, 0) || !stObj->pt)
       return NULL; /* out of mem */
@@ -83,7 +83,7 @@ st_update_single_texture(struct st_context *st,
    return st_get_texture_sampler_view_from_stobj(st, stObj,
                                                  _mesa_get_samplerobj(ctx, texUnit),
                                                  glsl130_or_later,
-                                                 ignore_srgb_decode);
+                                                 ignore_srgb_decode, get_reference);
 }
 
 
@@ -146,11 +146,9 @@ st_get_sampler_views(struct st_context *st,
        * So we simply ignore the setting entirely for samplers that are
        * (statically) accessed with a texelFetch function.
        */
-      struct pipe_sampler_view *sampler_view =
+      sampler_views[unit] =
          st_update_single_texture(st, prog->SamplerUnits[unit], glsl130,
-                                  texel_fetch_samplers & bit);
-      sampler_views[unit] = NULL;
-      pipe_sampler_view_reference(&sampler_views[unit], sampler_view);
+                                  texel_fetch_samplers & bit, true);
    }
 
    /* For any external samplers with multiplaner YUV, stuff the additional
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 1925e6f194a..a40e0f88ce3 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -3387,9 +3387,10 @@ st_NewTextureHandle(struct gl_context *ctx, struct gl_texture_object *texObj,
       st_convert_sampler(st, texObj, sampObj, 0, &sampler);
 
       /* TODO: Clarify the interaction of ARB_bindless_texture and EXT_texture_sRGB_decode */
-      view = st_get_texture_sampler_view_from_stobj(st, stObj, sampObj, 0, true);
+      view = st_get_texture_sampler_view_from_stobj(st, stObj, sampObj, 0,
+                                                    true, false);
    } else {
-      view = st_get_buffer_sampler_view_from_stobj(st, stObj);
+      view = st_get_buffer_sampler_view_from_stobj(st, stObj, false);
    }
 
    return pipe->create_texture_handle(pipe, view, &sampler);
diff --git a/src/mesa/state_tracker/st_sampler_view.c b/src/mesa/state_tracker/st_sampler_view.c
index 800d4398c5a..8a41eafd2fd 100644
--- a/src/mesa/state_tracker/st_sampler_view.c
+++ b/src/mesa/state_tracker/st_sampler_view.c
@@ -41,6 +41,16 @@
 #include "st_cb_bufferobjects.h"
 #include "st_cb_texture.h"
 
+/* Return a sampler view while incrementing the refcount by 1. */
+static struct pipe_sampler_view *
+get_sampler_view_reference(struct st_sampler_view *sv,
+                           struct pipe_sampler_view *view)
+{
+   struct pipe_sampler_view *ret = NULL;
+
+   pipe_sampler_view_reference(&ret, view);
+   return ret;
+}
 
 /**
  * Set the given view as the current context's view for the texture.
@@ -57,7 +67,8 @@ static struct pipe_sampler_view *
 st_texture_set_sampler_view(struct st_context *st,
                             struct st_texture_object *stObj,
                             struct pipe_sampler_view *view,
-                            bool glsl130_or_later, bool srgb_skip_decode)
+                            bool glsl130_or_later, bool srgb_skip_decode,
+                            bool get_reference)
 {
    struct st_sampler_views *views;
    struct st_sampler_view *free = NULL;
@@ -152,6 +163,9 @@ found:
    sv->view = view;
    sv->st = st;
 
+   if (get_reference)
+      view = get_sampler_view_reference(sv, view);
+
 out:
    simple_mtx_unlock(&stObj->validate_mutex);
    return view;
@@ -582,13 +596,13 @@ st_create_texture_sampler_view_from_stobj(struct st_context *st,
    return st->pipe->create_sampler_view(st->pipe, stObj->pt, &templ);
 }
 
-
 struct pipe_sampler_view *
 st_get_texture_sampler_view_from_stobj(struct st_context *st,
                                        struct st_texture_object *stObj,
                                        const struct gl_sampler_object *samp,
                                        bool glsl130_or_later,
-                                       bool ignore_srgb_decode)
+                                       bool ignore_srgb_decode,
+                                       bool get_reference)
 {
    struct st_sampler_view *sv;
    bool srgb_skip_decode = false;
@@ -619,6 +633,8 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
       assert(stObj->layer_override < 0 ||
              (stObj->layer_override == view->u.tex.first_layer &&
               stObj->layer_override == view->u.tex.last_layer));
+      if (get_reference)
+         view = get_sampler_view_reference(sv, view);
       return view;
    }
 
@@ -630,15 +646,16 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
                                                    glsl130_or_later);
 
    view = st_texture_set_sampler_view(st, stObj, view,
-                                      glsl130_or_later, srgb_skip_decode);
-
+                                      glsl130_or_later, srgb_skip_decode,
+                                      get_reference);
    return view;
 }
 
 
 struct pipe_sampler_view *
 st_get_buffer_sampler_view_from_stobj(struct st_context *st,
-                                      struct st_texture_object *stObj)
+                                      struct st_texture_object *stObj,
+                                      bool get_reference)
 {
    struct st_sampler_view *sv;
    struct st_buffer_object *stBuf =
@@ -667,6 +684,8 @@ st_get_buffer_sampler_view_from_stobj(struct st_context *st,
                            (unsigned) stObj->base.BufferSize);
          assert(view->u.buf.offset == base);
          assert(view->u.buf.size == size);
+         if (get_reference)
+            view = get_sampler_view_reference(sv, view);
          return view;
       }
    }
@@ -699,7 +718,8 @@ st_get_buffer_sampler_view_from_stobj(struct st_context *st,
    struct pipe_sampler_view *view =
       st->pipe->create_sampler_view(st->pipe, buf, &templ);
 
-   view = st_texture_set_sampler_view(st, stObj, view, false, false);
+   view = st_texture_set_sampler_view(st, stObj, view, false, false,
+                                      get_reference);
 
    return view;
 }
diff --git a/src/mesa/state_tracker/st_sampler_view.h b/src/mesa/state_tracker/st_sampler_view.h
index 11c2f7c093e..fa8e26c9b80 100644
--- a/src/mesa/state_tracker/st_sampler_view.h
+++ b/src/mesa/state_tracker/st_sampler_view.h
@@ -78,10 +78,12 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
                                        struct st_texture_object *stObj,
                                        const struct gl_sampler_object *samp,
                                        bool glsl130_or_later,
-                                       bool ignore_srgb_decode);
+                                       bool ignore_srgb_decode,
+                                       bool get_reference);
 
 struct pipe_sampler_view *
 st_get_buffer_sampler_view_from_stobj(struct st_context *st,
-                                      struct st_texture_object *stObj);
+                                      struct st_texture_object *stObj,
+                                      bool get_reference);
 
 #endif /* ST_SAMPLER_VIEW_H */
diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c
index f91310d23ff..e0bed2ded3d 100644
--- a/src/mesa/state_tracker/st_texture.c
+++ b/src/mesa/state_tracker/st_texture.c
@@ -519,7 +519,8 @@ st_create_texture_handle_from_unit(struct st_context *st,
    struct pipe_sampler_state sampler = {0};
 
    /* TODO: Clarify the interaction of ARB_bindless_texture and EXT_texture_sRGB_decode */
-   view = st_update_single_texture(st, texUnit, prog->sh.data->Version >= 130, true);
+   view = st_update_single_texture(st, texUnit, prog->sh.data->Version >= 130,
+                                   true, false);
    if (!view)
       return 0;
 
diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h
index be92ae0ad98..9bf0661c8c1 100644
--- a/src/mesa/state_tracker/st_texture.h
+++ b/src/mesa/state_tracker/st_texture.h
@@ -359,7 +359,7 @@ st_convert_sampler_from_unit(const struct st_context *st,
 struct pipe_sampler_view *
 st_update_single_texture(struct st_context *st,
                          GLuint texUnit, bool glsl130_or_later,
-                         bool ignore_srgb_decode);
+                         bool ignore_srgb_decode, bool get_reference);
 
 unsigned
 st_get_sampler_views(struct st_context *st,



More information about the mesa-commit mailing list