Mesa (staging/21.3): tegra: Use private reference count for sampler views

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Feb 20 17:40:41 UTC 2022


Module: Mesa
Branch: staging/21.3
Commit: f9d66fb266c8e52ac2bdfd524ea41e43dc389079
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f9d66fb266c8e52ac2bdfd524ea41e43dc389079

Author: Thierry Reding <treding at nvidia.com>
Date:   Wed Oct  6 22:42:36 2021 +0200

tegra: Use private reference count for sampler views

With the recent addition of the shortcuts aiming to avoid atomic
operations, the reference count on sampler views can become unbalanced
in the Tegra driver since they are wrapped and then proxied to the
Nouveau driver.

Fix this by keeping a private reference count.

Fixes: ef5d42741327 ("st/mesa: add a mechanism to bypass atomics when binding sampler views")
Reviewed-by: Karol Herbst <kherbst at redhat.com>
Tested-by: Karol Herbst <kherbst at redhat.com>
(cherry picked from commit e8ce0a335704af54b8269d6e862835703700392b)

---

 .pick_status.json                         |  2 +-
 src/gallium/drivers/tegra/tegra_context.c | 30 ++++++++++++++++++++++++------
 src/gallium/drivers/tegra/tegra_context.h |  1 +
 3 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index ec4d5595c85..d50aecb3d63 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1066,7 +1066,7 @@
         "description": "tegra: Use private reference count for sampler views",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": "ef5d427413274f5a6ccb7d2f729eb78b5af9d947"
     },
diff --git a/src/gallium/drivers/tegra/tegra_context.c b/src/gallium/drivers/tegra/tegra_context.c
index a07c740dc0b..1fae39ffa4b 100644
--- a/src/gallium/drivers/tegra/tegra_context.c
+++ b/src/gallium/drivers/tegra/tegra_context.c
@@ -567,10 +567,22 @@ tegra_set_sampler_views(struct pipe_context *pcontext, unsigned shader,
 {
    struct pipe_sampler_view *views[PIPE_MAX_SHADER_SAMPLER_VIEWS];
    struct tegra_context *context = to_tegra_context(pcontext);
+   struct tegra_sampler_view *view;
    unsigned i;
 
-   for (i = 0; i < num_views; i++)
+   for (i = 0; i < num_views; i++) {
+      /* adjust private reference count */
+      view = to_tegra_sampler_view(pviews[i]);
+      if (view) {
+         view->refcount--;
+         if (!view->refcount) {
+            view->refcount = 100000000;
+            p_atomic_add(&view->gpu->reference.count, view->refcount);
+         }
+      }
+
       views[i] = tegra_sampler_view_unwrap(pviews[i]);
+   }
 
    context->gpu->set_sampler_views(context->gpu, shader, start_slot,
                                    num_views, unbind_num_trailing_slots,
@@ -836,15 +848,19 @@ tegra_create_sampler_view(struct pipe_context *pcontext,
    if (!view)
       return NULL;
 
-   view->gpu = context->gpu->create_sampler_view(context->gpu, resource->gpu,
-                                                 template);
-   memcpy(&view->base, view->gpu, sizeof(*view->gpu));
+   view->base = *template;
+   view->base.context = pcontext;
    /* overwrite to prevent reference from being released */
    view->base.texture = NULL;
-
    pipe_reference_init(&view->base.reference, 1);
    pipe_resource_reference(&view->base.texture, presource);
-   view->base.context = pcontext;
+
+   view->gpu = context->gpu->create_sampler_view(context->gpu, resource->gpu,
+                                                 template);
+
+   /* use private reference count */
+   view->gpu->reference.count += 100000000;
+   view->refcount = 100000000;
 
    return &view->base;
 }
@@ -856,6 +872,8 @@ tegra_sampler_view_destroy(struct pipe_context *pcontext,
    struct tegra_sampler_view *view = to_tegra_sampler_view(pview);
 
    pipe_resource_reference(&view->base.texture, NULL);
+   /* adjust private reference count */
+   p_atomic_add(&view->gpu->reference.count, -view->refcount);
    pipe_sampler_view_reference(&view->gpu, NULL);
    free(view);
 }
diff --git a/src/gallium/drivers/tegra/tegra_context.h b/src/gallium/drivers/tegra/tegra_context.h
index 4869b0913a6..c2d8eb33ca5 100644
--- a/src/gallium/drivers/tegra/tegra_context.h
+++ b/src/gallium/drivers/tegra/tegra_context.h
@@ -47,6 +47,7 @@ tegra_screen_context_create(struct pipe_screen *pscreen, void *priv,
 struct tegra_sampler_view {
    struct pipe_sampler_view base;
    struct pipe_sampler_view *gpu;
+   unsigned int refcount;
 };
 
 static inline struct tegra_sampler_view *



More information about the mesa-commit mailing list