Mesa (main): zink: delete all non-imageless framebuffer code

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 18 23:55:48 UTC 2022


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue Apr 12 14:59:16 2022 -0400

zink: delete all non-imageless framebuffer code

hooray it's finally gone

Acked-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15904>

---

 src/gallium/drivers/zink/zink_context.c     |  95 +++++-----------
 src/gallium/drivers/zink/zink_framebuffer.c | 171 ----------------------------
 src/gallium/drivers/zink/zink_framebuffer.h |   5 -
 src/gallium/drivers/zink/zink_screen.c      |  27 -----
 src/gallium/drivers/zink/zink_surface.c     |   2 -
 5 files changed, 29 insertions(+), 271 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index d1866b5fc79..aab0473a3b5 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -139,16 +139,8 @@ zink_context_destroy(struct pipe_context *pctx)
       util_dynarray_fini(&ctx->di.bindless[i].resident);
    }
 
-   if (screen->info.have_KHR_imageless_framebuffer) {
-      hash_table_foreach(&ctx->framebuffer_cache, he)
-         zink_destroy_framebuffer(screen, he->data);
-   } else if (ctx->framebuffer) {
-      simple_mtx_lock(&screen->framebuffer_mtx);
-      struct hash_entry *entry = _mesa_hash_table_search(&screen->framebuffer_cache, &ctx->framebuffer->state);
-      if (zink_framebuffer_reference(screen, &ctx->framebuffer, NULL))
-         _mesa_hash_table_remove(&screen->framebuffer_cache, entry);
-      simple_mtx_unlock(&screen->framebuffer_mtx);
-   }
+   hash_table_foreach(&ctx->framebuffer_cache, he)
+      zink_destroy_framebuffer(screen, he->data);
 
    hash_table_foreach(ctx->render_pass_cache, he)
       zink_destroy_render_pass(screen, he->data);
@@ -2137,26 +2129,6 @@ update_framebuffer_state(struct zink_context *ctx, int old_w, int old_h)
     * we're about to use
     */
    struct zink_framebuffer *fb = ctx->get_framebuffer(ctx);
-   struct zink_screen *screen = zink_screen(ctx->base.screen);
-   if (ctx->framebuffer && !screen->info.have_KHR_imageless_framebuffer) {
-      simple_mtx_lock(&screen->framebuffer_mtx);
-      struct hash_entry *he = _mesa_hash_table_search(&screen->framebuffer_cache, &ctx->framebuffer->state);
-      if (ctx->framebuffer && !ctx->framebuffer->state.num_attachments) {
-         /* if this has no attachments then its lifetime has ended */
-         _mesa_hash_table_remove(&screen->framebuffer_cache, he);
-         he = NULL;
-         /* ensure an unflushed fb doesn't get destroyed by deferring it */
-         util_dynarray_append(&ctx->batch.state->dead_framebuffers, struct zink_framebuffer*, ctx->framebuffer);
-         ctx->framebuffer = NULL;
-      }
-      /* a framebuffer loses 1 ref every time we unset it;
-       * we do NOT add refs here, as the ref has already been added in
-       * get_framebuffer()
-       */
-      if (zink_framebuffer_reference(screen, &ctx->framebuffer, NULL) && he)
-         _mesa_hash_table_remove(&screen->framebuffer_cache, he);
-      simple_mtx_unlock(&screen->framebuffer_mtx);
-   }
    ctx->fb_changed |= ctx->framebuffer != fb;
    ctx->framebuffer = fb;
 }
@@ -2355,36 +2327,34 @@ begin_render_pass(struct zink_context *ctx)
    infos.attachmentCount = ctx->framebuffer->state.num_attachments;
    infos.pAttachments = att;
    prep_fb_attachments(ctx, att);
-   if (zink_screen(ctx->base.screen)->info.have_KHR_imageless_framebuffer) {
 #ifndef NDEBUG
-      const unsigned cresolve_offset = ctx->fb_state.nr_cbufs + !!ctx->fb_state.zsbuf;
-      for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) {
-         if (ctx->fb_state.cbufs[i]) {
-            struct zink_surface *surf = zink_csurface(ctx->fb_state.cbufs[i]);
-            struct zink_surface *transient = zink_transient_surface(ctx->fb_state.cbufs[i]);
-            if (surf->base.format == ctx->fb_state.cbufs[i]->format) {
-               if (transient) {
-                  assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage);
-                  assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[cresolve_offset].usage);
-               } else {
-                  assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage);
-               }
+   const unsigned cresolve_offset = ctx->fb_state.nr_cbufs + !!ctx->fb_state.zsbuf;
+   for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) {
+      if (ctx->fb_state.cbufs[i]) {
+         struct zink_surface *surf = zink_csurface(ctx->fb_state.cbufs[i]);
+         struct zink_surface *transient = zink_transient_surface(ctx->fb_state.cbufs[i]);
+         if (surf->base.format == ctx->fb_state.cbufs[i]->format) {
+            if (transient) {
+               assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage);
+               assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[cresolve_offset].usage);
+            } else {
+               assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage);
             }
          }
       }
-      if (ctx->fb_state.zsbuf) {
-         struct zink_surface *surf = zink_csurface(ctx->fb_state.zsbuf);
-         struct zink_surface *transient = zink_transient_surface(ctx->fb_state.zsbuf);
-         if (transient) {
-            assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[ctx->fb_state.nr_cbufs].usage);
-            assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[cresolve_offset].usage);
-         } else {
-            assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[ctx->fb_state.nr_cbufs].usage);
-         }
+   }
+   if (ctx->fb_state.zsbuf) {
+      struct zink_surface *surf = zink_csurface(ctx->fb_state.zsbuf);
+      struct zink_surface *transient = zink_transient_surface(ctx->fb_state.zsbuf);
+      if (transient) {
+         assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[ctx->fb_state.nr_cbufs].usage);
+         assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[cresolve_offset].usage);
+      } else {
+         assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[ctx->fb_state.nr_cbufs].usage);
       }
-#endif
-      rpbi.pNext = &infos;
    }
+#endif
+   rpbi.pNext = &infos;
 
    VKCTX(CmdBeginRenderPass)(batch->state->cmdbuf, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
    batch->in_rp = true;
@@ -3887,11 +3857,9 @@ zink_rebind_framebuffer(struct zink_context *ctx, struct zink_resource *res)
       return;
 
    zink_batch_no_rp(ctx);
-   if (zink_screen(ctx->base.screen)->info.have_KHR_imageless_framebuffer) {
-      struct zink_framebuffer *fb = ctx->get_framebuffer(ctx);
-      ctx->fb_changed |= ctx->framebuffer != fb;
-      ctx->framebuffer = fb;
-   }
+   struct zink_framebuffer *fb = ctx->get_framebuffer(ctx);
+   ctx->fb_changed |= ctx->framebuffer != fb;
+   ctx->framebuffer = fb;
 }
 
 ALWAYS_INLINE static struct zink_resource *
@@ -4247,13 +4215,8 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
    ctx->base.screen = pscreen;
    ctx->base.priv = priv;
 
-   if (screen->info.have_KHR_imageless_framebuffer) {
-      ctx->get_framebuffer = zink_get_framebuffer_imageless;
-      ctx->init_framebuffer = zink_init_framebuffer_imageless;
-   } else {
-      ctx->get_framebuffer = zink_get_framebuffer;
-      ctx->init_framebuffer = zink_init_framebuffer;
-   }
+   ctx->get_framebuffer = zink_get_framebuffer_imageless;
+   ctx->init_framebuffer = zink_init_framebuffer_imageless;
 
    ctx->base.destroy = zink_context_destroy;
    ctx->base.get_device_reset_status = zink_get_device_reset_status;
diff --git a/src/gallium/drivers/zink/zink_framebuffer.c b/src/gallium/drivers/zink/zink_framebuffer.c
index c3eda61c94d..46f44552cfe 100644
--- a/src/gallium/drivers/zink/zink_framebuffer.c
+++ b/src/gallium/drivers/zink/zink_framebuffer.c
@@ -202,179 +202,8 @@ zink_get_framebuffer_imageless(struct zink_context *ctx)
    return fb;
 }
 
-void
-zink_init_framebuffer(struct zink_screen *screen, struct zink_framebuffer *fb, struct zink_render_pass *rp)
-{
-   VkFramebuffer ret;
-
-   if (fb->rp == rp)
-      return;
-
-   uint32_t hash = _mesa_hash_pointer(rp);
-
-   struct hash_entry *he = _mesa_hash_table_search_pre_hashed(&fb->objects, hash, rp);
-   if (he) {
-#if defined(_WIN64) || defined(__x86_64__)
-      ret = (VkFramebuffer)he->data;
-#else
-      VkFramebuffer *ptr = he->data;
-      ret = *ptr;
-#endif
-      goto out;
-   }
-
-   assert(rp->state.num_cbufs + rp->state.have_zsbuf + rp->state.num_cresolves + rp->state.num_zsresolves == fb->state.num_attachments);
-
-   VkFramebufferCreateInfo fci = {0};
-   fci.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
-   fci.renderPass = rp->render_pass;
-   fci.attachmentCount = fb->state.num_attachments;
-   fci.pAttachments = fb->state.attachments;
-   fci.width = fb->state.width;
-   fci.height = fb->state.height;
-   fci.layers = fb->state.layers + 1;
-
-   if (VKSCR(CreateFramebuffer)(screen->dev, &fci, NULL, &ret) != VK_SUCCESS)
-      return;
-#if defined(_WIN64) || defined(__x86_64__)
-   _mesa_hash_table_insert_pre_hashed(&fb->objects, hash, rp, ret);
-#else
-   VkFramebuffer *ptr = ralloc(fb, VkFramebuffer);
-   if (!ptr) {
-      VKSCR(DestroyFramebuffer)(screen->dev, ret, NULL);
-      return;
-   }
-   *ptr = ret;
-   _mesa_hash_table_insert_pre_hashed(&fb->objects, hash, rp, ptr);
-#endif
-out:
-   fb->rp = rp;
-   fb->fb = ret;
-}
-
-static struct zink_framebuffer *
-create_framebuffer(struct zink_context *ctx,
-                   struct zink_framebuffer_state *state,
-                   struct pipe_surface **attachments)
-{
-   struct zink_screen *screen = zink_screen(ctx->base.screen);
-   struct zink_framebuffer *fb = rzalloc(NULL, struct zink_framebuffer);
-   if (!fb)
-      return NULL;
-
-   unsigned num_attachments = 0;
-   for (int i = 0; i < state->num_attachments; i++) {
-      struct zink_surface *surf;
-      if (state->attachments[i]) {
-         surf = zink_csurface(attachments[i]);
-         /* no ref! */
-         fb->surfaces[i] = attachments[i];
-         num_attachments++;
-         util_dynarray_append(&surf->framebuffer_refs, struct zink_framebuffer*, fb);
-      } else {
-         surf = zink_csurface(ctx->dummy_surface[util_logbase2_ceil(state->samples+1)]);
-         state->attachments[i] = surf->image_view;
-      }
-   }
-   pipe_reference_init(&fb->reference, 1 + num_attachments);
-
-   if (!_mesa_hash_table_init(&fb->objects, fb, _mesa_hash_pointer, _mesa_key_pointer_equal))
-      goto fail;
-   memcpy(&fb->state, state, sizeof(struct zink_framebuffer_state));
-
-   return fb;
-fail:
-   zink_destroy_framebuffer(screen, fb);
-   return NULL;
-}
-
 void
 debug_describe_zink_framebuffer(char* buf, const struct zink_framebuffer *ptr)
 {
    sprintf(buf, "zink_framebuffer");
 }
-
-struct zink_framebuffer *
-zink_get_framebuffer(struct zink_context *ctx)
-{
-   struct zink_screen *screen = zink_screen(ctx->base.screen);
-
-   assert(!screen->info.have_KHR_imageless_framebuffer);
-
-   struct pipe_surface *attachments[2 * (PIPE_MAX_COLOR_BUFS + 1)] = {0};
-   const unsigned cresolve_offset = ctx->fb_state.nr_cbufs + !!ctx->fb_state.zsbuf;
-   unsigned num_resolves = 0;
-
-   struct zink_framebuffer_state state = {0};
-   if (!zink_use_dummy_attachments(ctx)) {
-      for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) {
-         struct pipe_surface *psurf = ctx->fb_state.cbufs[i];
-         if (psurf) {
-            struct zink_surface *surf = zink_csurface(psurf);
-            struct zink_surface *transient = zink_transient_surface(psurf);
-            if (transient) {
-               state.attachments[i] = transient->image_view;
-               state.attachments[cresolve_offset + i] = surf->image_view;
-               attachments[cresolve_offset + i] = psurf;
-               psurf = &transient->base;
-               num_resolves++;
-            } else {
-               state.attachments[i] = surf->image_view;
-            }
-         } else {
-            state.attachments[i] = VK_NULL_HANDLE;
-         }
-         attachments[i] = psurf;
-      }
-   }
-
-   state.num_attachments = ctx->fb_state.nr_cbufs;
-   const unsigned zsresolve_offset = cresolve_offset + num_resolves;
-   if (ctx->fb_state.zsbuf) {
-      struct pipe_surface *psurf = ctx->fb_state.zsbuf;
-      if (psurf) {
-         struct zink_surface *surf = zink_csurface(psurf);
-         struct zink_surface *transient = zink_transient_surface(psurf);
-         if (transient) {
-            state.attachments[state.num_attachments] = transient->image_view;
-            state.attachments[zsresolve_offset] = surf->image_view;
-            attachments[zsresolve_offset] = psurf;
-            psurf = &transient->base;
-            num_resolves++;
-         } else {
-            state.attachments[state.num_attachments] = surf->image_view;
-         }
-      } else {
-         state.attachments[state.num_attachments] = VK_NULL_HANDLE;
-      }
-      attachments[state.num_attachments++] = psurf;
-   }
-
-   /* avoid bitfield explosion */
-   assert(state.num_attachments + num_resolves < 16);
-   state.num_attachments += num_resolves;
-   state.width = MAX2(ctx->fb_state.width, 1);
-   state.height = MAX2(ctx->fb_state.height, 1);
-   state.layers = MAX2(util_framebuffer_get_num_layers(&ctx->fb_state), 1) - 1;
-   state.samples = ctx->fb_state.samples - 1;
-
-   struct zink_framebuffer *fb;
-   simple_mtx_lock(&screen->framebuffer_mtx);
-   struct hash_entry *entry = _mesa_hash_table_search(&screen->framebuffer_cache, &state);
-   if (entry) {
-      fb = (void*)entry->data;
-      struct zink_framebuffer *fb_ref = NULL;
-      /* this gains 1 ref every time we reuse it */
-      zink_framebuffer_reference(screen, &fb_ref, fb);
-   } else {
-      /* this adds 1 extra ref on creation because all newly-created framebuffers are
-       * going to be bound; necessary to handle framebuffers which have no "real" attachments
-       * and are only using null surfaces since the only ref they get is the extra one here
-       */
-      fb = create_framebuffer(ctx, &state, attachments);
-      _mesa_hash_table_insert(&screen->framebuffer_cache, &fb->state, fb);
-   }
-   simple_mtx_unlock(&screen->framebuffer_mtx);
-
-   return fb;
-}
diff --git a/src/gallium/drivers/zink/zink_framebuffer.h b/src/gallium/drivers/zink/zink_framebuffer.h
index 4fb8bf67b90..669d3e7b2f4 100644
--- a/src/gallium/drivers/zink/zink_framebuffer.h
+++ b/src/gallium/drivers/zink/zink_framebuffer.h
@@ -61,8 +61,6 @@ struct zink_framebuffer {
    struct hash_table objects;
 };
 
-void
-zink_init_framebuffer(struct zink_screen *screen, struct zink_framebuffer *fb, struct zink_render_pass *rp);
 void
 zink_init_framebuffer_imageless(struct zink_screen *screen, struct zink_framebuffer *fb, struct zink_render_pass *rp);
 
@@ -92,7 +90,4 @@ zink_framebuffer_reference(struct zink_screen *screen,
 
 struct zink_framebuffer *
 zink_get_framebuffer_imageless(struct zink_context *ctx);
-
-struct zink_framebuffer *
-zink_get_framebuffer(struct zink_context *ctx);
 #endif
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index fc16d75ebea..2abbef81df6 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -138,20 +138,6 @@ zink_get_device_uuid(struct pipe_screen *pscreen, char *uuid)
    }
 }
 
-static uint32_t
-hash_framebuffer_state(const void *key)
-{
-   struct zink_framebuffer_state* s = (struct zink_framebuffer_state*)key;
-   return _mesa_hash_data(key, offsetof(struct zink_framebuffer_state, attachments) + sizeof(s->attachments[0]) * s->num_attachments);
-}
-
-static bool
-equals_framebuffer_state(const void *a, const void *b)
-{
-   struct zink_framebuffer_state *s = (struct zink_framebuffer_state*)a;
-   return memcmp(a, b, offsetof(struct zink_framebuffer_state, attachments) + sizeof(s->attachments[0]) * s->num_attachments) == 0;
-}
-
 static VkDeviceSize
 get_video_mem(struct zink_screen *screen)
 {
@@ -1220,14 +1206,6 @@ zink_destroy_screen(struct pipe_screen *pscreen)
       VKSCR(DestroyDebugUtilsMessengerEXT)(screen->instance, screen->debugUtilsCallbackHandle, NULL);
    }
 
-   if (!screen->info.have_KHR_imageless_framebuffer) {
-      hash_table_foreach(&screen->framebuffer_cache, entry) {
-         struct zink_framebuffer* fb = (struct zink_framebuffer*)entry->data;
-         zink_destroy_framebuffer(screen, fb);
-      }
-      simple_mtx_destroy(&screen->framebuffer_mtx);
-   }
-
    u_transfer_helper_destroy(pscreen->transfer_helper);
 #ifdef ENABLE_SHADER_CACHE
    if (screen->disk_cache) {
@@ -2238,11 +2216,6 @@ zink_internal_create_screen(const struct pipe_screen_config *config)
          screen->resizable_bar = true;
    }
 
-   if (!screen->info.have_KHR_imageless_framebuffer) {
-      simple_mtx_init(&screen->framebuffer_mtx, mtx_plain);
-      _mesa_hash_table_init(&screen->framebuffer_cache, screen, hash_framebuffer_state, equals_framebuffer_state);
-   }
-
    simple_mtx_init(&screen->dt_lock, mtx_plain);
 
    zink_screen_init_descriptor_funcs(screen, false);
diff --git a/src/gallium/drivers/zink/zink_surface.c b/src/gallium/drivers/zink/zink_surface.c
index 6cf98a5e337..bdacaf60e32 100644
--- a/src/gallium/drivers/zink/zink_surface.c
+++ b/src/gallium/drivers/zink/zink_surface.c
@@ -336,8 +336,6 @@ zink_destroy_surface(struct zink_screen *screen, struct pipe_surface *psurface)
       _mesa_hash_table_remove(&res->surface_cache, he);
       simple_mtx_unlock(&res->surface_mtx);
    }
-   if (!screen->info.have_KHR_imageless_framebuffer)
-      surface_clear_fb_refs(screen, psurface);
    zink_descriptor_set_refs_clear(&surface->desc_set_refs, surface);
    util_dynarray_fini(&surface->framebuffer_refs);
    if (surface->simage_view)



More information about the mesa-commit mailing list