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),
    };
 }
 

Reply via email to