Module: Mesa
Branch: main
Commit: 888f09eca883ca6428c1c25fcca913e3f188e543
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=888f09eca883ca6428c1c25fcca913e3f188e543

Author: Faith Ekstrand <[email protected]>
Date:   Sun Dec 10 10:02:36 2023 -0600

nvk: Rework the way we set up memory heaps/types

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26627>

---

 src/nouveau/vulkan/nvk_buffer.c          |  2 +-
 src/nouveau/vulkan/nvk_image.c           |  2 +-
 src/nouveau/vulkan/nvk_physical_device.c | 61 ++++++++++++++++++--------------
 src/nouveau/vulkan/nvk_physical_device.h |  4 +--
 4 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/src/nouveau/vulkan/nvk_buffer.c b/src/nouveau/vulkan/nvk_buffer.c
index 38328ea1ec5..578f42c6924 100644
--- a/src/nouveau/vulkan/nvk_buffer.c
+++ b/src/nouveau/vulkan/nvk_buffer.c
@@ -166,7 +166,7 @@ nvk_GetDeviceBufferMemoryRequirements(
    pMemoryRequirements->memoryRequirements = (VkMemoryRequirements) {
       .size = align64(pInfo->pCreateInfo->size, alignment),
       .alignment = alignment,
-      .memoryTypeBits = BITFIELD_MASK(dev->pdev->mem_type_cnt),
+      .memoryTypeBits = BITFIELD_MASK(dev->pdev->mem_type_count),
    };
 
    vk_foreach_struct_const(ext, pMemoryRequirements->pNext) {
diff --git a/src/nouveau/vulkan/nvk_image.c b/src/nouveau/vulkan/nvk_image.c
index 60d9dd8c09c..0d3f77e61a4 100644
--- a/src/nouveau/vulkan/nvk_image.c
+++ b/src/nouveau/vulkan/nvk_image.c
@@ -673,7 +673,7 @@ nvk_get_image_memory_requirements(struct nvk_device *dev,
                                   VkImageAspectFlags aspects,
                                   VkMemoryRequirements2 *pMemoryRequirements)
 {
-   uint32_t memory_types = (1 << dev->pdev->mem_type_cnt) - 1;
+   uint32_t memory_types = (1 << dev->pdev->mem_type_count) - 1;
 
    // TODO hope for the best?
 
diff --git a/src/nouveau/vulkan/nvk_physical_device.c 
b/src/nouveau/vulkan/nvk_physical_device.c
index 01f0a30f49c..c3501f6484b 100644
--- a/src/nouveau/vulkan/nvk_physical_device.c
+++ b/src/nouveau/vulkan/nvk_physical_device.c
@@ -979,10 +979,6 @@ nvk_create_drm_physical_device(struct vk_instance 
*_instance,
 
    nvk_physical_device_init_pipeline_cache(pdev);
 
-   pdev->mem_heaps[0].flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT;
-   pdev->mem_types[0].propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
-   pdev->mem_types[0].heapIndex = 0;
-
    uint64_t sysmem_size_B = 0;
    if (!os_get_available_system_memory(&sysmem_size_B)) {
       result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
@@ -990,26 +986,39 @@ nvk_create_drm_physical_device(struct vk_instance 
*_instance,
       goto fail_disk_cache;
    }
 
-   if (pdev->info.vram_size_B) {
-      pdev->mem_type_cnt = 2;
-      pdev->mem_heap_cnt = 2;
-
-      pdev->mem_heaps[0].size = pdev->info.vram_size_B;
-      pdev->mem_heaps[1].size = sysmem_size_B;
-      pdev->mem_heaps[1].flags = 0;
-      pdev->mem_types[1].heapIndex = 1;
-      pdev->mem_types[1].propertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
-                                         VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
-                                         VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
-   } else {
-      pdev->mem_type_cnt = 1;
-      pdev->mem_heap_cnt = 1;
-
-      pdev->mem_heaps[0].size = sysmem_size_B;
-      pdev->mem_types[0].propertyFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
-                                          VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
+   if (pdev->info.vram_size_B > 0) {
+      uint32_t vram_heap_idx = pdev->mem_heap_count++;
+      pdev->mem_heaps[vram_heap_idx] = (VkMemoryHeap) {
+         .size = pdev->info.vram_size_B,
+         .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT,
+      };
+
+      pdev->mem_types[pdev->mem_type_count++] = (VkMemoryType) {
+         .propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+         .heapIndex = vram_heap_idx,
+      };
    }
 
+   uint32_t sysmem_heap_idx = pdev->mem_heap_count++;
+   pdev->mem_heaps[sysmem_heap_idx] = (VkMemoryHeap) {
+      .size = sysmem_size_B,
+      /* If we don't have any VRAM (iGPU), claim sysmem as DEVICE_LOCAL */
+      .flags = pdev->info.vram_size_B == 0
+               ? VK_MEMORY_HEAP_DEVICE_LOCAL_BIT
+               : 0,
+   };
+
+   pdev->mem_types[pdev->mem_type_count++] = (VkMemoryType) {
+      /* TODO: What's the right thing to do here on Tegra? */
+      .propertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
+                       VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
+                       VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
+      .heapIndex = sysmem_heap_idx,
+   };
+
+   assert(pdev->mem_heap_count <= ARRAY_SIZE(pdev->mem_heaps));
+   assert(pdev->mem_type_count <= ARRAY_SIZE(pdev->mem_types));
+
    unsigned st_idx = 0;
    pdev->syncobj_sync_type = syncobj_sync_type;
    pdev->sync_types[st_idx++] = &pdev->syncobj_sync_type;
@@ -1055,13 +1064,13 @@ nvk_GetPhysicalDeviceMemoryProperties2(
 {
    VK_FROM_HANDLE(nvk_physical_device, pdev, physicalDevice);
 
-   pMemoryProperties->memoryProperties.memoryHeapCount = pdev->mem_heap_cnt;
-   for (int i = 0; i < pdev->mem_heap_cnt; i++) {
+   pMemoryProperties->memoryProperties.memoryHeapCount = pdev->mem_heap_count;
+   for (int i = 0; i < pdev->mem_heap_count; i++) {
       pMemoryProperties->memoryProperties.memoryHeaps[i] = pdev->mem_heaps[i];
    }
 
-   pMemoryProperties->memoryProperties.memoryTypeCount = pdev->mem_type_cnt;
-   for (int i = 0; i < pdev->mem_type_cnt; i++) {
+   pMemoryProperties->memoryProperties.memoryTypeCount = pdev->mem_type_count;
+   for (int i = 0; i < pdev->mem_type_count; i++) {
       pMemoryProperties->memoryProperties.memoryTypes[i] = pdev->mem_types[i];
    }
 
diff --git a/src/nouveau/vulkan/nvk_physical_device.h 
b/src/nouveau/vulkan/nvk_physical_device.h
index e380365b0a1..5bcda67d5dc 100644
--- a/src/nouveau/vulkan/nvk_physical_device.h
+++ b/src/nouveau/vulkan/nvk_physical_device.h
@@ -33,8 +33,8 @@ struct nvk_physical_device {
    // TODO: add mapable VRAM heap if possible
    VkMemoryHeap mem_heaps[2];
    VkMemoryType mem_types[2];
-   uint8_t mem_heap_cnt;
-   uint8_t mem_type_cnt;
+   uint8_t mem_heap_count;
+   uint8_t mem_type_count;
 
    struct vk_sync_type syncobj_sync_type;
    const struct vk_sync_type *sync_types[2];

Reply via email to