From 20e1474c2cc642061567fdc79ff83f4740b20ea2 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 24 Oct 2022 16:40:32 -0400 Subject: [PATCH] zink: move some descriptor data into a substruct no functional changes Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_context.c | 42 ++++++++++++--------- src/gallium/drivers/zink/zink_descriptors.c | 10 ++--- src/gallium/drivers/zink/zink_types.h | 11 ++++-- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index fa5a60e7284..f382865c7bd 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -562,15 +562,15 @@ update_descriptor_state_ubo(struct zink_context *ctx, gl_shader_stage shader, un bool have_null_descriptors = screen->info.rb2_feats.nullDescriptor; const enum zink_descriptor_type type = ZINK_DESCRIPTOR_TYPE_UBO; ctx->di.descriptor_res[type][shader][slot] = res; - ctx->di.ubos[shader][slot].offset = ctx->ubos[shader][slot].buffer_offset; + ctx->di.t.ubos[shader][slot].offset = ctx->ubos[shader][slot].buffer_offset; if (res) { - ctx->di.ubos[shader][slot].buffer = res->obj->buffer; - ctx->di.ubos[shader][slot].range = ctx->ubos[shader][slot].buffer_size; - assert(ctx->di.ubos[shader][slot].range <= screen->info.props.limits.maxUniformBufferRange); + ctx->di.t.ubos[shader][slot].buffer = res->obj->buffer; + ctx->di.t.ubos[shader][slot].range = ctx->ubos[shader][slot].buffer_size; + assert(ctx->di.t.ubos[shader][slot].range <= screen->info.props.limits.maxUniformBufferRange); } else { VkBuffer null_buffer = zink_resource(ctx->dummy_vertex_buffer)->obj->buffer; - ctx->di.ubos[shader][slot].buffer = have_null_descriptors ? VK_NULL_HANDLE : null_buffer; - ctx->di.ubos[shader][slot].range = VK_WHOLE_SIZE; + ctx->di.t.ubos[shader][slot].buffer = have_null_descriptors ? VK_NULL_HANDLE : null_buffer; + ctx->di.t.ubos[shader][slot].range = VK_WHOLE_SIZE; } if (!slot) { if (res) @@ -588,14 +588,14 @@ update_descriptor_state_ssbo(struct zink_context *ctx, gl_shader_stage shader, u bool have_null_descriptors = screen->info.rb2_feats.nullDescriptor; const enum zink_descriptor_type type = ZINK_DESCRIPTOR_TYPE_SSBO; ctx->di.descriptor_res[type][shader][slot] = res; - ctx->di.ssbos[shader][slot].offset = ctx->ssbos[shader][slot].buffer_offset; + ctx->di.t.ssbos[shader][slot].offset = ctx->ssbos[shader][slot].buffer_offset; if (res) { - ctx->di.ssbos[shader][slot].buffer = res->obj->buffer; - ctx->di.ssbos[shader][slot].range = ctx->ssbos[shader][slot].buffer_size; + ctx->di.t.ssbos[shader][slot].buffer = res->obj->buffer; + ctx->di.t.ssbos[shader][slot].range = ctx->ssbos[shader][slot].buffer_size; } else { VkBuffer null_buffer = zink_resource(ctx->dummy_vertex_buffer)->obj->buffer; - ctx->di.ssbos[shader][slot].buffer = have_null_descriptors ? VK_NULL_HANDLE : null_buffer; - ctx->di.ssbos[shader][slot].range = VK_WHOLE_SIZE; + ctx->di.t.ssbos[shader][slot].buffer = have_null_descriptors ? VK_NULL_HANDLE : null_buffer; + ctx->di.t.ssbos[shader][slot].range = VK_WHOLE_SIZE; } return res; } @@ -610,7 +610,7 @@ update_descriptor_state_sampler(struct zink_context *ctx, gl_shader_stage shader if (res) { if (res->obj->is_buffer) { struct zink_buffer_view *bv = get_bufferview_for_binding(ctx, shader, type, slot); - ctx->di.tbos[shader][slot] = bv->buffer_view; + ctx->di.t.tbos[shader][slot] = bv->buffer_view; } else { struct zink_surface *surface = get_imageview_for_binding(ctx, shader, type, slot); ctx->di.textures[shader][slot].imageLayout = get_layout_for_binding(ctx, res, type, shader == MESA_SHADER_COMPUTE); @@ -632,13 +632,13 @@ update_descriptor_state_sampler(struct zink_context *ctx, gl_shader_stage shader if (likely(have_null_descriptors)) { ctx->di.textures[shader][slot].imageView = VK_NULL_HANDLE; ctx->di.textures[shader][slot].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; - ctx->di.tbos[shader][slot] = VK_NULL_HANDLE; + ctx->di.t.tbos[shader][slot] = VK_NULL_HANDLE; } else { struct zink_surface *null_surface = zink_get_dummy_surface(ctx, 0); struct zink_buffer_view *null_bufferview = ctx->dummy_bufferview; ctx->di.textures[shader][slot].imageView = null_surface->image_view; ctx->di.textures[shader][slot].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - ctx->di.tbos[shader][slot] = null_bufferview->buffer_view; + ctx->di.t.tbos[shader][slot] = null_bufferview->buffer_view; } } return res; @@ -654,7 +654,7 @@ update_descriptor_state_image(struct zink_context *ctx, gl_shader_stage shader, if (res) { if (res->obj->is_buffer) { struct zink_buffer_view *bv = get_bufferview_for_binding(ctx, shader, type, slot); - ctx->di.texel_images[shader][slot] = bv->buffer_view; + ctx->di.t.texel_images[shader][slot] = bv->buffer_view; } else { struct zink_surface *surface = get_imageview_for_binding(ctx, shader, type, slot); ctx->di.images[shader][slot].imageLayout = VK_IMAGE_LAYOUT_GENERAL; @@ -663,13 +663,13 @@ update_descriptor_state_image(struct zink_context *ctx, gl_shader_stage shader, } else { if (likely(have_null_descriptors)) { memset(&ctx->di.images[shader][slot], 0, sizeof(ctx->di.images[shader][slot])); - ctx->di.texel_images[shader][slot] = VK_NULL_HANDLE; + ctx->di.t.texel_images[shader][slot] = VK_NULL_HANDLE; } else { struct zink_surface *null_surface = zink_get_dummy_surface(ctx, 0); struct zink_buffer_view *null_bufferview = ctx->dummy_bufferview; ctx->di.images[shader][slot].imageView = null_surface->image_view; ctx->di.images[shader][slot].imageLayout = VK_IMAGE_LAYOUT_GENERAL; - ctx->di.texel_images[shader][slot] = null_bufferview->buffer_view; + ctx->di.t.texel_images[shader][slot] = null_bufferview->buffer_view; } } return res; @@ -4913,10 +4913,16 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) if (!is_copy_only) { for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { /* need to update these based on screen config for null descriptors */ - for (unsigned j = 0; j < 32; j++) { + for (unsigned j = 0; j < ARRAY_SIZE(ctx->di.t.ubos[i]); j++) { update_descriptor_state_ubo(ctx, i, j, NULL); + } + for (unsigned j = 0; j < ARRAY_SIZE(ctx->di.textures[i]); j++) { update_descriptor_state_sampler(ctx, i, j, NULL); + } + for (unsigned j = 0; j < ARRAY_SIZE(ctx->di.t.ssbos[i]); j++) { update_descriptor_state_ssbo(ctx, i, j, NULL); + } + for (unsigned j = 0; j < ARRAY_SIZE(ctx->di.images[i]); j++) { update_descriptor_state_image(ctx, i, j, NULL); } } diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c index 6f5762b622a..9a64a3e9715 100644 --- a/src/gallium/drivers/zink/zink_descriptors.c +++ b/src/gallium/drivers/zink/zink_descriptors.c @@ -321,7 +321,7 @@ init_template_entry(struct zink_shader *shader, enum zink_descriptor_type type, switch (shader->bindings[type][idx].type) { case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: - entry->offset = offsetof(struct zink_context, di.ubos[stage][index]); + entry->offset = offsetof(struct zink_context, di.t.ubos[stage][index]); entry->stride = sizeof(VkDescriptorBufferInfo); break; case VK_DESCRIPTOR_TYPE_SAMPLER: @@ -331,11 +331,11 @@ init_template_entry(struct zink_shader *shader, enum zink_descriptor_type type, entry->stride = sizeof(VkDescriptorImageInfo); break; case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: - entry->offset = offsetof(struct zink_context, di.tbos[stage][index]); + entry->offset = offsetof(struct zink_context, di.t.tbos[stage][index]); entry->stride = sizeof(VkBufferView); break; case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: - entry->offset = offsetof(struct zink_context, di.ssbos[stage][index]); + entry->offset = offsetof(struct zink_context, di.t.ssbos[stage][index]); entry->stride = sizeof(VkDescriptorBufferInfo); break; case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: @@ -343,7 +343,7 @@ init_template_entry(struct zink_shader *shader, enum zink_descriptor_type type, entry->stride = sizeof(VkDescriptorImageInfo); break; case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: - entry->offset = offsetof(struct zink_context, di.texel_images[stage][index]); + entry->offset = offsetof(struct zink_context, di.t.texel_images[stage][index]); entry->stride = sizeof(VkBufferView); break; default: @@ -1108,7 +1108,7 @@ init_push_template_entry(VkDescriptorUpdateTemplateEntry *entry, unsigned i) entry->dstBinding = i; entry->descriptorCount = 1; entry->descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - entry->offset = offsetof(struct zink_context, di.ubos[i][0]); + entry->offset = offsetof(struct zink_context, di.t.ubos[i][0]); entry->stride = sizeof(VkDescriptorBufferInfo); } diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 5ff3d44dc5b..76e5da49391 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -1632,24 +1632,27 @@ struct zink_context { struct { /* descriptor info */ - VkDescriptorBufferInfo ubos[MESA_SHADER_STAGES][PIPE_MAX_CONSTANT_BUFFERS]; uint32_t push_valid; uint8_t num_ubos[MESA_SHADER_STAGES]; - VkDescriptorBufferInfo ssbos[MESA_SHADER_STAGES][PIPE_MAX_SHADER_BUFFERS]; uint8_t num_ssbos[MESA_SHADER_STAGES]; VkDescriptorImageInfo textures[MESA_SHADER_STAGES][PIPE_MAX_SAMPLERS]; - VkBufferView tbos[MESA_SHADER_STAGES][PIPE_MAX_SAMPLERS]; uint32_t emulate_nonseamless[MESA_SHADER_STAGES]; uint32_t cubes[MESA_SHADER_STAGES]; uint8_t num_samplers[MESA_SHADER_STAGES]; uint8_t num_sampler_views[MESA_SHADER_STAGES]; VkDescriptorImageInfo images[MESA_SHADER_STAGES][ZINK_MAX_SHADER_IMAGES]; - VkBufferView texel_images[MESA_SHADER_STAGES][ZINK_MAX_SHADER_IMAGES]; uint8_t num_images[MESA_SHADER_STAGES]; + struct { + VkDescriptorBufferInfo ubos[MESA_SHADER_STAGES][PIPE_MAX_CONSTANT_BUFFERS]; + VkDescriptorBufferInfo ssbos[MESA_SHADER_STAGES][PIPE_MAX_SHADER_BUFFERS]; + VkBufferView tbos[MESA_SHADER_STAGES][PIPE_MAX_SAMPLERS]; + VkBufferView texel_images[MESA_SHADER_STAGES][ZINK_MAX_SHADER_IMAGES]; + } t; + VkDescriptorImageInfo fbfetch; struct zink_resource *descriptor_res[ZINK_DESCRIPTOR_BASE_TYPES][MESA_SHADER_STAGES][PIPE_MAX_SAMPLERS];