mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 04:40:09 +01:00
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:
parent
e6a55bfc16
commit
facb1b7884
2 changed files with 10 additions and 16 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue