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>
This commit is contained in:
Mike Blumenkrantz 2023-02-10 10:29:45 -05:00 committed by Marge Bot
parent e6a55bfc16
commit facb1b7884
2 changed files with 10 additions and 16 deletions

View file

@ -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);
}
}

View file

@ -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;