From fff59a5f4fa71d86dc882dfd0a6da6d2bd138f65 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:11:50 -0600 Subject: [PATCH] nvk: Fix descriptor offset alignment This fixes two bugs. First, we were aligning when setting the bindign offset but not actually applying that alignment to buffer_size so when we incremented by stride * descriptorCount, it incremented starting with the unaligned value. Second, in some cases we return stride = align = 0 and the ALIGN_POT macro will return 0 when something's aligned to 0. Part-of: --- src/nouveau/vulkan/nvk_descriptor_set_layout.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/nouveau/vulkan/nvk_descriptor_set_layout.c b/src/nouveau/vulkan/nvk_descriptor_set_layout.c index 148094f1f2c..a6a4a8fa2af 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set_layout.c +++ b/src/nouveau/vulkan/nvk_descriptor_set_layout.c @@ -183,10 +183,14 @@ nvk_CreateDescriptorSetLayout(VkDevice _device, nvk_descriptor_stride_align_for_type(binding->descriptorType, type_list, &stride, &align); - assert(stride <= UINT8_MAX); - layout->binding[b].offset = ALIGN_POT(buffer_size, align); - layout->binding[b].stride = stride; - buffer_size += stride * binding->descriptorCount; + if (stride > 0) { + assert(stride <= UINT8_MAX); + assert(util_is_power_of_two_nonzero(align)); + buffer_size = ALIGN_POT(buffer_size, align); + layout->binding[b].offset = buffer_size; + layout->binding[b].stride = stride; + buffer_size += stride * binding->descriptorCount; + } if (binding_has_immutable_samplers(binding)) { layout->binding[b].immutable_samplers = samplers;