mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 06:50:11 +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;
|
info.pNext = NULL;
|
||||||
struct zink_gfx_program *prog = (struct zink_gfx_program *)pg;
|
struct zink_gfx_program *prog = (struct zink_gfx_program *)pg;
|
||||||
struct zink_shader *shaders[] = {
|
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],
|
prog->shaders[MESA_SHADER_FRAGMENT],
|
||||||
};
|
};
|
||||||
for (unsigned j = 0; j < pg->num_dsl; j++) {
|
for (unsigned j = 0; j < pg->num_dsl; j++) {
|
||||||
if (!(pg->dd.binding_usage & BITFIELD_BIT(j)))
|
if (!shaders[j]->precompile.dsl)
|
||||||
continue;
|
continue;
|
||||||
uint64_t offset = bs->dd.db_offset[use_buffer];
|
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++) {
|
for (unsigned i = 0; i < shaders[j]->precompile.num_bindings; i++) {
|
||||||
info.type = shaders[j]->precompile.bindings[i].descriptorType;
|
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 ||
|
if (screen->info.db_props.combinedImageSamplerDescriptorSingleArray ||
|
||||||
shaders[j]->precompile.bindings[i].descriptorType != VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER ||
|
shaders[j]->precompile.bindings[i].descriptorType != VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER ||
|
||||||
shaders[j]->precompile.bindings[i].descriptorCount == 1) {
|
shaders[j]->precompile.bindings[i].descriptorCount == 1) {
|
||||||
for (unsigned k = 0; k < shaders[j]->precompile.bindings[i].descriptorCount; k++) {
|
for (unsigned k = 0; k < shaders[j]->precompile.bindings[i].descriptorCount; k++) {
|
||||||
/* VkDescriptorDataEXT is a union of pointers; the member doesn't matter */
|
/* 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);
|
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, 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);
|
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 {
|
} else {
|
||||||
assert(shaders[j]->precompile.bindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
|
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;
|
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++) {
|
for (unsigned k = 0; k < shaders[j]->precompile.bindings[i].descriptorCount; k++) {
|
||||||
/* VkDescriptorDataEXT is a union of pointers; the member doesn't matter */
|
/* 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 +
|
info.data.pSampler = (void*)(((uint8_t*)ctx) + shaders[j]->precompile.db_template[i].offset +
|
||||||
k * pg->dd.db_template[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW][i].stride);
|
k * shaders[j]->precompile.db_template[i].stride);
|
||||||
VKSCR(GetDescriptorEXT)(screen->dev, &info, pg->dd.db_template[j][ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW].db_size, buf);
|
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
|
/* drivers that don't support combinedImageSamplerDescriptorSingleArray must have sampler arrays written in memory as
|
||||||
*
|
*
|
||||||
* | array_of_samplers[] | array_of_sampled_images[] |
|
* | 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.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);
|
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) {
|
if (prog->shaders[MESA_SHADER_VERTEX]->precompile.dsl) {
|
||||||
prog->base.dd.binding_usage |= BITFIELD_BIT(0);
|
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.dsl[prog->base.num_dsl] = prog->shaders[MESA_SHADER_VERTEX]->precompile.dsl;
|
||||||
prog->base.num_dsl++;
|
prog->base.num_dsl++;
|
||||||
}
|
}
|
||||||
if (prog->shaders[MESA_SHADER_FRAGMENT]->precompile.dsl) {
|
if (prog->shaders[MESA_SHADER_FRAGMENT]->precompile.dsl) {
|
||||||
prog->base.dd.binding_usage |= BITFIELD_BIT(1);
|
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;
|
prog->base.dsl[prog->base.num_dsl] = prog->shaders[MESA_SHADER_FRAGMENT]->precompile.dsl;
|
||||||
/* guarantee a null dsl if vs doesn't have descriptors */
|
/* guarantee a null dsl if vs doesn't have descriptors */
|
||||||
prog->base.num_dsl = 2;
|
prog->base.num_dsl = 2;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue