Module: Mesa Branch: main Commit: b7f8a9e648ebc4d4fe4a5744b16c1e69375cf68c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b7f8a9e648ebc4d4fe4a5744b16c1e69375cf68c
Author: Faith Ekstrand <[email protected]> Date: Fri Dec 8 22:00:21 2023 -0600 nvk: Add a nvk_min_cbuf_alignment() helper and use it We want to be able to use cbufs for UBOs and descriptor buffers going forward. This also cleans up alignments all over the code-base where just kinda did whatever seemed like a good idea at the time. The result is a lot more flexible and accurate. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26617> --- src/nouveau/vulkan/nvk_buffer.c | 2 +- src/nouveau/vulkan/nvk_cmd_buffer.c | 5 ++++- src/nouveau/vulkan/nvk_descriptor_set.c | 9 +++++++-- src/nouveau/vulkan/nvk_descriptor_set_layout.c | 2 +- src/nouveau/vulkan/nvk_physical_device.c | 8 +++++++- src/nouveau/vulkan/nvk_physical_device.h | 2 ++ src/nouveau/vulkan/nvk_shader.c | 2 +- 7 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/nouveau/vulkan/nvk_buffer.c b/src/nouveau/vulkan/nvk_buffer.c index d2d8862f51e..df991e00949 100644 --- a/src/nouveau/vulkan/nvk_buffer.c +++ b/src/nouveau/vulkan/nvk_buffer.c @@ -17,7 +17,7 @@ nvk_get_buffer_alignment(UNUSED const struct nv_device_info *info, uint32_t alignment = 16; if (usage_flags & VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT_KHR) - alignment = MAX2(alignment, NVK_MIN_UBO_ALIGNMENT); + alignment = MAX2(alignment, nvk_min_cbuf_alignment(info)); if (usage_flags & VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT_KHR) alignment = MAX2(alignment, NVK_MIN_SSBO_ALIGNMENT); diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.c b/src/nouveau/vulkan/nvk_cmd_buffer.c index 20727a004c4..45e29886a50 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.c +++ b/src/nouveau/vulkan/nvk_cmd_buffer.c @@ -682,6 +682,9 @@ void nvk_cmd_buffer_flush_push_descriptors(struct nvk_cmd_buffer *cmd, struct nvk_descriptor_state *desc) { + struct nvk_device *dev = nvk_cmd_buffer_device(cmd); + struct nvk_physical_device *pdev = nvk_device_physical(dev); + const uint32_t min_cbuf_alignment = nvk_min_cbuf_alignment(&pdev->info); VkResult result; if (!desc->push_dirty) @@ -692,7 +695,7 @@ nvk_cmd_buffer_flush_push_descriptors(struct nvk_cmd_buffer *cmd, uint64_t push_set_addr; result = nvk_cmd_buffer_upload_data(cmd, push_set->data, sizeof(push_set->data), - NVK_MIN_UBO_ALIGNMENT, + min_cbuf_alignment, &push_set_addr); if (unlikely(result != VK_SUCCESS)) { vk_command_buffer_set_error(&cmd->vk, result); diff --git a/src/nouveau/vulkan/nvk_descriptor_set.c b/src/nouveau/vulkan/nvk_descriptor_set.c index 59639026e32..e510da663ec 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set.c +++ b/src/nouveau/vulkan/nvk_descriptor_set.c @@ -379,6 +379,7 @@ nvk_CreateDescriptorPool(VkDevice _device, VkDescriptorPool *pDescriptorPool) { VK_FROM_HANDLE(nvk_device, dev, _device); + struct nvk_physical_device *pdev = nvk_device_physical(dev); struct nvk_descriptor_pool *pool; uint64_t size = sizeof(struct nvk_descriptor_pool); uint64_t bo_size = 0; @@ -423,7 +424,7 @@ nvk_CreateDescriptorPool(VkDevice _device, * conservative here.) Allocate enough extra space that we can chop it * into maxSets pieces and align each one of them to 32B. */ - bo_size += NVK_MIN_UBO_ALIGNMENT * pCreateInfo->maxSets; + bo_size += nvk_min_cbuf_alignment(&pdev->info) * pCreateInfo->maxSets; uint64_t entries_size = sizeof(struct nvk_descriptor_pool_entry) * pCreateInfo->maxSets; @@ -462,6 +463,7 @@ nvk_descriptor_set_create(struct nvk_device *dev, uint32_t variable_count, struct nvk_descriptor_set **out_set) { + struct nvk_physical_device *pdev = nvk_device_physical(dev); struct nvk_descriptor_set *set; uint32_t mem_size = sizeof(struct nvk_descriptor_set) + @@ -484,6 +486,8 @@ nvk_descriptor_set_create(struct nvk_device *dev, set->size += stride * variable_count; } + set->size = align64(set->size, nvk_min_cbuf_alignment(&pdev->info)); + if (set->size > 0) { if (pool->current_offset + set->size > pool->size) return VK_ERROR_OUT_OF_POOL_MEMORY; @@ -492,10 +496,11 @@ nvk_descriptor_set_create(struct nvk_device *dev, set->addr = pool->bo->offset + pool->current_offset; } + assert(pool->current_offset % nvk_min_cbuf_alignment(&pdev->info) == 0); pool->entries[pool->entry_count].offset = pool->current_offset; pool->entries[pool->entry_count].size = set->size; pool->entries[pool->entry_count].set = set; - pool->current_offset += ALIGN(set->size, NVK_MIN_UBO_ALIGNMENT); + pool->current_offset += set->size; pool->entry_count++; vk_descriptor_set_layout_ref(&layout->vk); diff --git a/src/nouveau/vulkan/nvk_descriptor_set_layout.c b/src/nouveau/vulkan/nvk_descriptor_set_layout.c index 391760e1da0..bc67dbbaa0e 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set_layout.c +++ b/src/nouveau/vulkan/nvk_descriptor_set_layout.c @@ -57,7 +57,7 @@ nvk_descriptor_stride_align_for_type(const struct nvk_physical_device *pdev, case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK: *stride = 1; /* Array size is bytes */ - *align = NVK_MIN_UBO_ALIGNMENT; + *align = nvk_min_cbuf_alignment(&pdev->info); break; case VK_DESCRIPTOR_TYPE_MUTABLE_EXT: diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index 213fd170076..1f77ca6d725 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -485,6 +485,12 @@ nvk_get_device_features(const struct nv_device_info *info, }; } +uint32_t +nvk_min_cbuf_alignment(const struct nv_device_info *info) +{ + return 256; +} + static void nvk_get_device_properties(const struct nvk_instance *instance, const struct nv_device_info *info, @@ -747,7 +753,7 @@ nvk_get_device_properties(const struct nvk_instance *instance, /* VK_EXT_robustness2 */ .robustStorageBufferAccessSizeAlignment = NVK_SSBO_BOUNDS_CHECK_ALIGNMENT, - .robustUniformBufferAccessSizeAlignment = NVK_MIN_UBO_ALIGNMENT, + .robustUniformBufferAccessSizeAlignment = nvk_min_cbuf_alignment(info), /* VK_EXT_sample_locations */ .sampleLocationSampleCounts = sample_counts, diff --git a/src/nouveau/vulkan/nvk_physical_device.h b/src/nouveau/vulkan/nvk_physical_device.h index 6722cd94c51..e380365b0a1 100644 --- a/src/nouveau/vulkan/nvk_physical_device.h +++ b/src/nouveau/vulkan/nvk_physical_device.h @@ -40,6 +40,8 @@ struct nvk_physical_device { const struct vk_sync_type *sync_types[2]; }; +uint32_t nvk_min_cbuf_alignment(const struct nv_device_info *info); + VK_DEFINE_HANDLE_CASTS(nvk_physical_device, vk.base, VkPhysicalDevice, diff --git a/src/nouveau/vulkan/nvk_shader.c b/src/nouveau/vulkan/nvk_shader.c index af18cbe2ec9..9d5f0b48ea2 100644 --- a/src/nouveau/vulkan/nvk_shader.c +++ b/src/nouveau/vulkan/nvk_shader.c @@ -152,7 +152,7 @@ nvk_physical_device_spirv_options(const struct nvk_physical_device *pdev, .ubo_addr_format = nvk_buffer_addr_format(rs->uniform_buffers), .shared_addr_format = nir_address_format_32bit_offset, .min_ssbo_alignment = NVK_MIN_SSBO_ALIGNMENT, - .min_ubo_alignment = NVK_MIN_UBO_ALIGNMENT, + .min_ubo_alignment = nvk_min_cbuf_alignment(&pdev->info), }; }
