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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41444>
This commit is contained in:
Mike Blumenkrantz 2026-05-08 11:50:43 -04:00 committed by Marge Bot
parent 3eb50679bb
commit cac48876e0
3 changed files with 17 additions and 14 deletions

View file

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

View file

@ -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),

View file

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