panfrost: Fix set_sampler_views for big GL
authorAlyssa Rosenzweig <alyssa@collabora.com>
Tue, 28 Sep 2021 00:24:38 +0000 (20:24 -0400)
committerMarge Bot <emma+marge@anholt.net>
Thu, 24 Feb 2022 22:48:30 +0000 (22:48 +0000)
Roughly use the freedreno logic to handle all the extra things that will
come up in our Piglit sooner than later.

Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Cc: mesa-stable
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13203>

src/gallium/drivers/panfrost/pan_context.c

index 769f327..5228f9a 100644 (file)
@@ -627,32 +627,35 @@ panfrost_set_sampler_views(
         struct panfrost_context *ctx = pan_context(pctx);
         ctx->dirty_shader[shader] |= PAN_DIRTY_STAGE_TEXTURE;
 
-        unsigned new_nr = 0;
         unsigned i;
 
-        assert(start_slot == 0);
-
-        if (!views)
-                num_views = 0;
-
         for (i = 0; i < num_views; ++i) {
-                if (views[i])
-                        new_nr = i + 1;
+                struct pipe_sampler_view *view = views ? views[i] : NULL;
+                unsigned p = i + start_slot;
+
                 if (take_ownership) {
-                        pipe_sampler_view_reference((struct pipe_sampler_view **)&ctx->sampler_views[shader][i],
+                        pipe_sampler_view_reference((struct pipe_sampler_view **)&ctx->sampler_views[shader][p],
                                                     NULL);
-                        ctx->sampler_views[shader][i] = (struct panfrost_sampler_view *)views[i];
+                        ctx->sampler_views[shader][i] = (struct panfrost_sampler_view *)view;
                 } else {
-                        pipe_sampler_view_reference((struct pipe_sampler_view **)&ctx->sampler_views[shader][i],
-                                                    views[i]);
+                        pipe_sampler_view_reference((struct pipe_sampler_view **)&ctx->sampler_views[shader][p],
+                                                    view);
                 }
         }
 
-        for (; i < ctx->sampler_view_count[shader]; i++) {
-               pipe_sampler_view_reference((struct pipe_sampler_view **)&ctx->sampler_views[shader][i],
+        for (; i < num_views + unbind_num_trailing_slots; i++) {
+                unsigned p = i + start_slot;
+               pipe_sampler_view_reference((struct pipe_sampler_view **)&ctx->sampler_views[shader][p],
                                            NULL);
         }
-        ctx->sampler_view_count[shader] = new_nr;
+
+        /* Recalculate sampler view count */
+        ctx->sampler_view_count[shader] = 0;
+
+        for (i = 0; i < ARRAY_SIZE(ctx->sampler_views[shader]); ++i) {
+                if (ctx->sampler_views[shader][i])
+                        ctx->sampler_view_count[shader] = i + 1;
+        }
 }
 
 static void