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];
