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

Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Feb 10 10:29:45 2023 -0500

zink: rework separate shader descriptor iterating

using the shader struct members is a bit more natural here and
avoids some confusion when one of the stages has no descriptors

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21246>

---

 src/gallium/drivers/zink/zink_descriptors.c | 20 ++++++++++----------
 src/gallium/drivers/zink/zink_program.c     |  6 ------
 2 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_descriptors.c 
b/src/gallium/drivers/zink/zink_descriptors.c
index a8782cab657..f562fc8975d 100644
--- a/src/gallium/drivers/zink/zink_descriptors.c
+++ b/src/gallium/drivers/zink/zink_descriptors.c
@@ -1053,24 +1053,24 @@ update_separable(struct zink_context *ctx, struct 
zink_program *pg)
    info.pNext = NULL;
    struct zink_gfx_program *prog = (struct zink_gfx_program *)pg;
    struct zink_shader *shaders[] = {
-      prog->shaders[MESA_SHADER_VERTEX]->precompile.num_bindings ? 
prog->shaders[MESA_SHADER_VERTEX] : prog->shaders[MESA_SHADER_FRAGMENT],
+      prog->shaders[MESA_SHADER_VERTEX],
       prog->shaders[MESA_SHADER_FRAGMENT],
    };
    for (unsigned j = 0; j < pg->num_dsl; j++) {
-      if (!(pg->dd.binding_usage & BITFIELD_BIT(j)))
+      if (!shaders[j]->precompile.dsl)
          continue;
       uint64_t offset = bs->dd.db_offset[use_buffer];
-      assert(bs->dd.db[use_buffer]->obj->size > bs->dd.db_offset[use_buffer] + 
pg->dd.db_size[j]);
+      assert(bs->dd.db[use_buffer]->obj->size > bs->dd.db_offset[use_buffer] + 
shaders[j]->precompile.db_size);
       for (unsigned i = 0; i < shaders[j]->precompile.num_bindings; i++) {
          info.type = shaders[j]->precompile.bindings[i].descriptorType;
-         uint64_t desc_offset = offset + pg->dd.db_offset[j][i];
+         uint64_t desc_offset = offset + shaders[j]->precompile.db_offset[i];
          if (screen->info.db_props.combinedImageSamplerDescriptorSingleArray ||
                shaders[j]->precompile.bindings[i].descriptorType != 
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER ||
                shaders[j]->precompile.bindings[i].descriptorCount == 1) {
             for (unsigned k = 0; k < 
shaders[j]->precompile.bindings[i].descriptorCount; k++) {
                /* VkDescriptorDataEXT is a union of pointers; the member 
doesn't matter */
-               info.data.pSampler = (void*)(((uint8_t*)ctx) + 
pg->dd.db_template[j][i].offset + k * pg->dd.db_template[j][i].stride);
-               VKSCR(GetDescriptorEXT)(screen->dev, &info, 
pg->dd.db_template[j][i].db_size, bs->dd.db_map[use_buffer] + desc_offset + k * 
pg->dd.db_template[j][i].db_size);
+               info.data.pSampler = (void*)(((uint8_t*)ctx) + 
shaders[j]->precompile.db_template[i].offset + k * 
shaders[j]->precompile.db_template[i].stride);
+               VKSCR(GetDescriptorEXT)(screen->dev, &info, 
shaders[j]->precompile.db_template[i].db_size, bs->dd.db_map[use_buffer] + 
desc_offset + k * shaders[j]->precompile.db_template[i].db_size);
             }
          } else {
             assert(shaders[j]->precompile.bindings[i].descriptorType == 
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
@@ -1079,9 +1079,9 @@ update_separable(struct zink_context *ctx, struct 
zink_program *pg)
             uint8_t *samplers = db + 
shaders[j]->precompile.bindings[i].descriptorCount * 
screen->info.db_props.sampledImageDescriptorSize;
             for (unsigned k = 0; k < 
shaders[j]->precompile.bindings[i].descriptorCount; k++) {
                /* VkDescriptorDataEXT is a union of pointers; the member 
doesn't matter */
-               info.data.pSampler = (void*)(((uint8_t*)ctx) + 
pg->dd.db_template[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW][i].offset +
-                                             k * 
pg->dd.db_template[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW][i].stride);
-               VKSCR(GetDescriptorEXT)(screen->dev, &info, 
pg->dd.db_template[j][ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW].db_size, buf);
+               info.data.pSampler = (void*)(((uint8_t*)ctx) + 
shaders[j]->precompile.db_template[i].offset +
+                                             k * 
shaders[j]->precompile.db_template[i].stride);
+               VKSCR(GetDescriptorEXT)(screen->dev, &info, 
shaders[j]->precompile.db_template[i].db_size, buf);
                /* drivers that don't support 
combinedImageSamplerDescriptorSingleArray must have sampler arrays written in 
memory as
                   *
                   *   | array_of_samplers[] | array_of_sampled_images[] |
@@ -1096,7 +1096,7 @@ update_separable(struct zink_context *ctx, struct 
zink_program *pg)
          }
       }
       bs->dd.cur_db_offset[use_buffer] = bs->dd.db_offset[use_buffer];
-      bs->dd.db_offset[use_buffer] += pg->dd.db_size[j];
+      bs->dd.db_offset[use_buffer] += shaders[j]->precompile.db_size;
       VKCTX(CmdSetDescriptorBufferOffsetsEXT)(bs->cmdbuf, 
VK_PIPELINE_BIND_POINT_GRAPHICS, pg->layout, j, 1, &use_buffer, &offset);
    }
 }
diff --git a/src/gallium/drivers/zink/zink_program.c 
b/src/gallium/drivers/zink/zink_program.c
index 9ac3af03dce..edd4a540d1b 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -1145,17 +1145,11 @@ create_gfx_program_separable(struct zink_context *ctx, 
struct zink_shader **stag
 
    if (prog->shaders[MESA_SHADER_VERTEX]->precompile.dsl) {
       prog->base.dd.binding_usage |= BITFIELD_BIT(0);
-      prog->base.dd.db_template[prog->base.num_dsl] = 
prog->shaders[MESA_SHADER_VERTEX]->precompile.db_template;
-      prog->base.dd.db_size[prog->base.num_dsl] = 
prog->shaders[MESA_SHADER_VERTEX]->precompile.db_size;
-      prog->base.dd.db_offset[prog->base.num_dsl] = 
prog->shaders[MESA_SHADER_VERTEX]->precompile.db_offset;
       prog->base.dsl[prog->base.num_dsl] = 
prog->shaders[MESA_SHADER_VERTEX]->precompile.dsl;
       prog->base.num_dsl++;
    }
    if (prog->shaders[MESA_SHADER_FRAGMENT]->precompile.dsl) {
       prog->base.dd.binding_usage |= BITFIELD_BIT(1);
-      prog->base.dd.db_template[prog->base.num_dsl] = 
prog->shaders[MESA_SHADER_FRAGMENT]->precompile.db_template;
-      prog->base.dd.db_size[prog->base.num_dsl] = 
prog->shaders[MESA_SHADER_FRAGMENT]->precompile.db_size;
-      prog->base.dd.db_offset[prog->base.num_dsl] = 
prog->shaders[MESA_SHADER_FRAGMENT]->precompile.db_offset;
       prog->base.dsl[prog->base.num_dsl] = 
prog->shaders[MESA_SHADER_FRAGMENT]->precompile.dsl;
       /* guarantee a null dsl if vs doesn't have descriptors */
       prog->base.num_dsl = 2;

Reply via email to