From cac48876e0772f15d3e71fd08470b56a98c20d0b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 8 May 2026 11:50:43 -0400 Subject: [PATCH] zink: use maintenance5 to more effectively set storage texel usage for bufferviews this simplifies the bufferviews so there is only ever a single buffer/view for the corresponding resource Part-of: --- src/gallium/drivers/zink/zink_context.c | 25 +++++++++++--------- src/gallium/drivers/zink/zink_device_info.py | 3 ++- src/gallium/drivers/zink/zink_resource.c | 3 +-- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 70cca6186bf..c526f1d73b1 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -971,16 +971,10 @@ static VkBufferViewCreateInfo create_bvci(struct zink_context *ctx, struct zink_resource *res, enum pipe_format format, uint32_t offset, uint32_t range) { struct zink_screen *screen = zink_screen(ctx->base.screen); - VkBufferViewCreateInfo bvci; - // Zero whole struct (including alignment holes), so hash_bufferview - // does not access potentially uninitialized data. - memset(&bvci, 0, sizeof(bvci)); - bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO; - bvci.pNext = NULL; - if (zink_get_format_props(screen, format)->bufferFeatures & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) - bvci.buffer = res->obj->storage_buffer ? res->obj->storage_buffer : res->obj->buffer; - else - bvci.buffer = res->obj->buffer; + VkBufferViewCreateInfo bvci = { + VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO, + }; + bvci.buffer = res->obj->buffer; bvci.format = zink_get_format(screen, format); assert(bvci.format); bvci.offset = offset; @@ -995,7 +989,6 @@ create_bvci(struct zink_context *ctx, struct zink_resource *res, enum pipe_forma uint64_t clamp = (uint64_t)blocksize * (uint64_t)screen->info.props.limits.maxTexelBufferElements; if (bvci.range == VK_WHOLE_SIZE && res->base.b.width0 > clamp) bvci.range = clamp; - bvci.flags = 0; return bvci; } @@ -1019,6 +1012,16 @@ get_buffer_view(struct zink_context *ctx, struct zink_resource *res, enum pipe_f buffer_view = (void*)he->key; } else { VkBufferView view; + + VkBufferUsageFlags2CreateInfo usage = { + VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO, + NULL, + VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT + }; + bvci.pNext = &usage; + if (zink_get_format_props(screen, format)->bufferFeatures & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) + usage.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT; + VkResult result = VKSCR(CreateBufferView)(screen->dev, &bvci, NULL, &view); if (result != VK_SUCCESS) { _mesa_set_remove(&res->obj->surface_cache, he); diff --git a/src/gallium/drivers/zink/zink_device_info.py b/src/gallium/drivers/zink/zink_device_info.py index e932ad2400f..879e8baec50 100644 --- a/src/gallium/drivers/zink/zink_device_info.py +++ b/src/gallium/drivers/zink/zink_device_info.py @@ -68,7 +68,8 @@ EXTENSIONS = [ features=True), Extension("VK_KHR_maintenance5", alias="maint5", - features=True, properties=True), + features=True, properties=True, + required=True), Extension("VK_KHR_maintenance6", alias="maint6", features=True, properties=True), diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 106d12697fe..dfc7ef20baa 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -326,8 +326,7 @@ create_bci(struct zink_screen *screen, const struct pipe_resource *templ, unsign if (screen->info.have_KHR_buffer_device_address) bci.usage |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT; - if (bind & PIPE_BIND_SHADER_IMAGE) - bci.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT; + bci.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT; if (bind & PIPE_BIND_QUERY_BUFFER) bci.usage |= VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT;