Mesa (main): zink: add an input attachment to the gfx push set layout to handle fbfetch

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Aug 31 19:56:28 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue Jul 27 14:03:23 2021 -0400

zink: add an input attachment to the gfx push set layout to handle fbfetch

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12603>

---

 src/gallium/drivers/zink/zink_descriptors.c      | 35 ++++++++++++++++------
 src/gallium/drivers/zink/zink_descriptors_lazy.c | 38 ++++++++++++++++--------
 2 files changed, 52 insertions(+), 21 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c
index f950c3298c5..ca0ef1ca7c4 100644
--- a/src/gallium/drivers/zink/zink_descriptors.c
+++ b/src/gallium/drivers/zink/zink_descriptors.c
@@ -478,6 +478,12 @@ zink_descriptor_util_push_layouts_get(struct zink_context *ctx, struct zink_desc
    for (unsigned i = 0; i < ZINK_SHADER_COUNT; i++)
       init_push_binding(&bindings[i], i, vktype);
    init_push_binding(&compute_binding, PIPE_SHADER_COMPUTE, vktype);
+   /* fbfetch */
+   bindings[ZINK_SHADER_COUNT].binding = ZINK_FBFETCH_BINDING;
+   bindings[ZINK_SHADER_COUNT].descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+   bindings[ZINK_SHADER_COUNT].descriptorCount = 1;
+   bindings[ZINK_SHADER_COUNT].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
+   bindings[ZINK_SHADER_COUNT].pImmutableSamplers = NULL;
    enum zink_descriptor_type dsl_type = screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_LAZY &&
                                         screen->info.have_KHR_push_descriptor ? ZINK_DESCRIPTOR_TYPES : ZINK_DESCRIPTOR_TYPE_UBO;
    dsls[0] = create_layout(ctx, dsl_type, bindings, ARRAY_SIZE(bindings), &layout_keys[0]);
@@ -1086,12 +1092,14 @@ zink_descriptor_pool_init(struct zink_context *ctx)
          return false;
    }
    struct zink_screen *screen = zink_screen(ctx->base.screen);
-   VkDescriptorPoolSize sizes;
-   sizes.type = screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_LAZY ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
-   sizes.descriptorCount = ZINK_SHADER_COUNT * ZINK_DEFAULT_MAX_DESCS;
-   ctx->dd->push_pool[0] = descriptor_pool_get(ctx, 0, ctx->dd->push_layout_keys[0], &sizes, 1);
-   sizes.descriptorCount = ZINK_DEFAULT_MAX_DESCS;
-   ctx->dd->push_pool[1] = descriptor_pool_get(ctx, 0, ctx->dd->push_layout_keys[1], &sizes, 1);
+   VkDescriptorPoolSize sizes[2];
+   sizes[0].type = screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_LAZY ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
+   sizes[0].descriptorCount = ZINK_SHADER_COUNT * ZINK_DEFAULT_MAX_DESCS;
+   sizes[1].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+   sizes[1].descriptorCount = ZINK_DEFAULT_MAX_DESCS;
+   ctx->dd->push_pool[0] = descriptor_pool_get(ctx, 0, ctx->dd->push_layout_keys[0], sizes, 2);
+   sizes[0].descriptorCount = ZINK_DEFAULT_MAX_DESCS;
+   ctx->dd->push_pool[1] = descriptor_pool_get(ctx, 0, ctx->dd->push_layout_keys[1], sizes, 1);
    return ctx->dd->push_pool[0] && ctx->dd->push_pool[1];
 }
 
@@ -1174,7 +1182,8 @@ init_write_descriptor(struct zink_shader *shader, struct zink_descriptor_set *zd
     wd->dstBinding = shader ? shader->bindings[type][idx].binding : idx;
     wd->dstArrayElement = 0;
     wd->descriptorCount = shader ? shader->bindings[type][idx].size : 1;
-    wd->descriptorType = shader ? shader->bindings[type][idx].type : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
+    wd->descriptorType = shader ? shader->bindings[type][idx].type :
+                                  idx == ZINK_FBFETCH_BINDING ? VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
     wd->dstSet = zds->desc_set;
     return num_wds + 1;
 }
@@ -1184,9 +1193,10 @@ update_push_ubo_descriptors(struct zink_context *ctx, struct zink_descriptor_set
                             bool is_compute, bool cache_hit, uint32_t *dynamic_offsets)
 {
    struct zink_screen *screen = zink_screen(ctx->base.screen);
-   VkWriteDescriptorSet wds[ZINK_SHADER_COUNT];
+   VkWriteDescriptorSet wds[ZINK_SHADER_COUNT + 1];
    VkDescriptorBufferInfo buffer_infos[ZINK_SHADER_COUNT];
    struct zink_shader **stages;
+   bool fbfetch = false;
 
    unsigned num_stages = is_compute ? 1 : ZINK_SHADER_COUNT;
    struct zink_program *pg = is_compute ? &ctx->curr_compute->base : &ctx->curr_program->base;
@@ -1230,9 +1240,16 @@ update_push_ubo_descriptors(struct zink_context *ctx, struct zink_descriptor_set
          wds[i].pBufferInfo = &buffer_infos[i];
       }
    }
+   if (unlikely(!cache_hit && !is_compute && ctx->fbfetch_outputs)) {
+      struct zink_resource *res = zink_resource(ctx->fb_state.cbufs[0]->texture);
+      init_write_descriptor(NULL, zds, 0, MESA_SHADER_STAGES, &wds[ZINK_SHADER_COUNT], 0);
+      desc_set_res_add(zds, res, ZINK_SHADER_COUNT, cache_hit);
+      wds[ZINK_SHADER_COUNT].pImageInfo = &ctx->di.fbfetch;
+      fbfetch = true;
+   }
 
    if (!cache_hit)
-      vkUpdateDescriptorSets(screen->dev, num_stages, wds, 0, NULL);
+      vkUpdateDescriptorSets(screen->dev, num_stages + !!fbfetch, wds, 0, NULL);
    return num_stages;
 }
 
diff --git a/src/gallium/drivers/zink/zink_descriptors_lazy.c b/src/gallium/drivers/zink/zink_descriptors_lazy.c
index 7f05a86552f..fde735c4917 100644
--- a/src/gallium/drivers/zink/zink_descriptors_lazy.c
+++ b/src/gallium/drivers/zink/zink_descriptors_lazy.c
@@ -36,7 +36,8 @@
 
 struct zink_descriptor_data_lazy {
    struct zink_descriptor_data base;
-   VkDescriptorUpdateTemplateEntry push_entries[PIPE_SHADER_TYPES];
+   VkDescriptorUpdateTemplateEntry push_entries[PIPE_SHADER_TYPES]; //gfx+fbfetch
+   VkDescriptorUpdateTemplateEntry compute_push_entry;
    bool push_state_changed[2]; //gfx, compute
    uint8_t state_changed[2]; //gfx, compute
 };
@@ -129,19 +130,22 @@ zink_descriptor_program_init_lazy(struct zink_context *ctx, struct zink_program
    VkDescriptorUpdateTemplateEntry entries[ZINK_DESCRIPTOR_TYPES][PIPE_SHADER_TYPES * 32];
    unsigned num_bindings[ZINK_DESCRIPTOR_TYPES] = {0};
    uint8_t has_bindings = 0;
+   unsigned push_count = 0;
 
    struct zink_shader **stages;
    if (pg->is_compute)
       stages = &((struct zink_compute_program*)pg)->shader;
-   else
+   else {
       stages = ((struct zink_gfx_program*)pg)->shaders;
+      if (stages[PIPE_SHADER_FRAGMENT]->nir->info.fs.uses_fbfetch_output)
+         push_count = 1;
+   }
 
    if (!pg->dd)
       pg->dd = (void*)rzalloc(pg, struct zink_program_descriptor_data);
    if (!pg->dd)
       return false;
 
-   unsigned push_count = 0;
    unsigned entry_idx[ZINK_DESCRIPTOR_TYPES] = {0};
 
    unsigned num_shaders = pg->is_compute ? 1 : ZINK_SHADER_COUNT;
@@ -238,13 +242,13 @@ zink_descriptor_program_init_lazy(struct zink_context *ctx, struct zink_program
    /* number of descriptors in template */
    unsigned wd_count[ZINK_DESCRIPTOR_TYPES + 1];
    if (push_count)
-      wd_count[0] = pg->is_compute ? 1 : ZINK_SHADER_COUNT;
+      wd_count[0] = pg->is_compute ? 1 : (ZINK_SHADER_COUNT + 1);
    for (unsigned i = 0; i < ZINK_DESCRIPTOR_TYPES; i++)
       wd_count[i + 1] = pg->dd->layout_key[i] ? pg->dd->layout_key[i]->num_descriptors : 0;
 
    VkDescriptorUpdateTemplateEntry *push_entries[2] = {
       dd_lazy(ctx)->push_entries,
-      &dd_lazy(ctx)->push_entries[PIPE_SHADER_COMPUTE],
+      &dd_lazy(ctx)->compute_push_entry,
    };
    for (unsigned i = 0; i < pg->num_dsl; i++) {
       bool is_push = i == 0;
@@ -334,13 +338,16 @@ static struct zink_descriptor_pool *
 create_push_pool(struct zink_screen *screen, struct zink_batch_descriptor_data_lazy *bdd, bool is_compute)
 {
    struct zink_descriptor_pool *pool = rzalloc(bdd, struct zink_descriptor_pool);
-   VkDescriptorPoolSize sizes;
-   sizes.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+   VkDescriptorPoolSize sizes[2];
+   sizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
    if (is_compute)
-      sizes.descriptorCount = ZINK_DEFAULT_MAX_DESCS;
-   else
-      sizes.descriptorCount = ZINK_SHADER_COUNT * ZINK_DEFAULT_MAX_DESCS;
-   pool->pool = create_pool(screen, 1, &sizes, 0);
+      sizes[0].descriptorCount = ZINK_DEFAULT_MAX_DESCS;
+   else {
+      sizes[0].descriptorCount = ZINK_SHADER_COUNT * ZINK_DEFAULT_MAX_DESCS;
+      sizes[1].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+      sizes[1].descriptorCount = ZINK_DEFAULT_MAX_DESCS;
+   }
+   pool->pool = create_pool(screen, 1 + !is_compute, sizes, 0);
    return pool;
 }
 
@@ -625,10 +632,17 @@ zink_descriptors_init_lazy(struct zink_context *ctx)
    if (screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_NOTEMPLATES)
       printf("ZINK: CACHED/NOTEMPLATES DESCRIPTORS\n");
    else if (screen->info.have_KHR_descriptor_update_template) {
-      for (unsigned i = 0; i < PIPE_SHADER_TYPES; i++) {
+      for (unsigned i = 0; i < ZINK_SHADER_COUNT; i++) {
          VkDescriptorUpdateTemplateEntry *entry = &dd_lazy(ctx)->push_entries[i];
          init_push_template_entry(entry, i);
       }
+      init_push_template_entry(&dd_lazy(ctx)->compute_push_entry, PIPE_SHADER_COMPUTE);
+      VkDescriptorUpdateTemplateEntry *entry = &dd_lazy(ctx)->push_entries[ZINK_SHADER_COUNT]; //fbfetch
+      entry->dstBinding = ZINK_FBFETCH_BINDING;
+      entry->descriptorCount = 1;
+      entry->descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+      entry->offset = offsetof(struct zink_context, di.fbfetch);
+      entry->stride = sizeof(VkDescriptorImageInfo);
       if (screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_LAZY)
          printf("ZINK: USING LAZY DESCRIPTORS\n");
    }



More information about the mesa-commit mailing list