nvk: handle alignments in device memory
authorDave Airlie <airlied@redhat.com>
Tue, 10 Jan 2023 22:10:51 +0000 (08:10 +1000)
committerMarge Bot <emma+marge@anholt.net>
Fri, 4 Aug 2023 21:32:06 +0000 (21:32 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>

src/nouveau/vulkan/nvk_device_memory.c

index 3bace05..5608197 100644 (file)
@@ -161,6 +161,13 @@ nvk_allocate_memory(struct nvk_device *dev,
       &pdev->mem_types[pAllocateInfo->memoryTypeIndex];
    const enum nouveau_ws_bo_flags flags = nvk_memory_type_flags(type);
 
+   uint32_t alignment = (1ULL << 12);
+   if (flags & NOUVEAU_WS_BO_LOCAL)
+      alignment = (1ULL << 16);
+
+   const uint64_t aligned_size =
+      ALIGN_POT(pAllocateInfo->allocationSize, alignment);
+
    mem = vk_device_memory_create(&dev->vk, pAllocateInfo,
                                  pAllocator, sizeof(*mem));
    if (!mem)
@@ -191,8 +198,7 @@ nvk_allocate_memory(struct nvk_device *dev,
          goto fail_alloc;
       }
    } else {
-      mem->bo = nouveau_ws_bo_new(pdev->dev,
-                                  pAllocateInfo->allocationSize, 0, flags);
+      mem->bo = nouveau_ws_bo_new(pdev->dev, aligned_size, alignment, flags);
       if (!mem->bo) {
          result = vk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY);
          goto fail_alloc;