diff options
author | Dave Airlie <airlied@redhat.com> | 2023-07-24 09:38:44 +1000 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2023-08-04 21:32:07 +0000 |
commit | 1a6a198ab54fcf0018bba1f5e3b3bb1ade578383 (patch) | |
tree | 737bd3bd9b65ad40a2754809583c146827edb74c | |
parent | 766a6a5a4d4e2d09780af005bcc39a6dbd8f7e85 (diff) |
nvk: add new internal bo allocation flag.
This is to allow the kernel to use a single resv object, this might
need more work.
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
-rw-r--r-- | src/nouveau/vulkan/nvk_cmd_pool.c | 2 | ||||
-rw-r--r-- | src/nouveau/vulkan/nvk_descriptor_set.c | 2 | ||||
-rw-r--r-- | src/nouveau/vulkan/nvk_descriptor_table.c | 4 | ||||
-rw-r--r-- | src/nouveau/vulkan/nvk_device.c | 15 | ||||
-rw-r--r-- | src/nouveau/vulkan/nvk_device_memory.c | 21 | ||||
-rw-r--r-- | src/nouveau/vulkan/nvk_query_pool.c | 3 | ||||
-rw-r--r-- | src/nouveau/vulkan/nvk_queue.c | 11 | ||||
-rw-r--r-- | src/nouveau/winsys/nouveau_bo.c | 5 | ||||
-rw-r--r-- | src/nouveau/winsys/nouveau_bo.h | 1 |
9 files changed, 48 insertions, 16 deletions
diff --git a/src/nouveau/vulkan/nvk_cmd_pool.c b/src/nouveau/vulkan/nvk_cmd_pool.c index 08a6e9583b7..8252b2be3c3 100644 --- a/src/nouveau/vulkan/nvk_cmd_pool.c +++ b/src/nouveau/vulkan/nvk_cmd_pool.c @@ -14,7 +14,7 @@ nvk_cmd_bo_create(struct nvk_cmd_pool *pool, struct nvk_cmd_bo **bo_out) if (bo == NULL) return vk_error(pool, VK_ERROR_OUT_OF_HOST_MEMORY); - uint32_t flags = NOUVEAU_WS_BO_GART | NOUVEAU_WS_BO_MAP; + uint32_t flags = NOUVEAU_WS_BO_GART | NOUVEAU_WS_BO_MAP | NOUVEAU_WS_BO_NO_SHARE; bo->bo = nouveau_ws_bo_new_mapped(dev->ws_dev, NVK_CMD_BO_SIZE, 0, flags, NOUVEAU_WS_BO_WR, &bo->map); if (bo->bo == NULL) { diff --git a/src/nouveau/vulkan/nvk_descriptor_set.c b/src/nouveau/vulkan/nvk_descriptor_set.c index ecb35555751..27a7920c4a7 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set.c +++ b/src/nouveau/vulkan/nvk_descriptor_set.c @@ -430,7 +430,7 @@ nvk_CreateDescriptorPool(VkDevice _device, return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); if (bo_size) { - uint32_t flags = NOUVEAU_WS_BO_GART | NOUVEAU_WS_BO_MAP; + uint32_t flags = NOUVEAU_WS_BO_GART | NOUVEAU_WS_BO_MAP | NOUVEAU_WS_BO_NO_SHARE; pool->bo = nouveau_ws_bo_new(device->ws_dev, bo_size, 0, flags); if (!pool->bo) { nvk_destroy_descriptor_pool(device, pAllocator, pool); diff --git a/src/nouveau/vulkan/nvk_descriptor_table.c b/src/nouveau/vulkan/nvk_descriptor_table.c index b90b002a1e1..9bce15b8566 100644 --- a/src/nouveau/vulkan/nvk_descriptor_table.c +++ b/src/nouveau/vulkan/nvk_descriptor_table.c @@ -18,7 +18,9 @@ nvk_descriptor_table_grow_locked(struct nvk_device *dev, const uint32_t new_bo_size = new_alloc * table->desc_size; new_bo = nouveau_ws_bo_new(dev->ws_dev, new_bo_size, 256, - NOUVEAU_WS_BO_LOCAL | NOUVEAU_WS_BO_MAP); + NOUVEAU_WS_BO_LOCAL | + NOUVEAU_WS_BO_MAP | + NOUVEAU_WS_BO_NO_SHARE); if (new_bo == NULL) { return vk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, "Failed to allocate the image descriptor table"); diff --git a/src/nouveau/vulkan/nvk_device.c b/src/nouveau/vulkan/nvk_device.c index 060991fd7e8..95848dbc0d4 100644 --- a/src/nouveau/vulkan/nvk_device.c +++ b/src/nouveau/vulkan/nvk_device.c @@ -86,7 +86,8 @@ nvk_slm_area_ensure(struct nvk_device *dev, size = ALIGN(size, 0x20000); struct nouveau_ws_bo *bo = - nouveau_ws_bo_new(dev->ws_dev, size, 0, NOUVEAU_WS_BO_LOCAL); + nouveau_ws_bo_new(dev->ws_dev, size, 0, + NOUVEAU_WS_BO_LOCAL | NOUVEAU_WS_BO_NO_SHARE); if (bo == NULL) return vk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); @@ -192,14 +193,16 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice, * allocate shader BOs by 4K to ensure we don't run past. */ result = nvk_heap_init(dev, &dev->shader_heap, - NOUVEAU_WS_BO_LOCAL, NOUVEAU_WS_BO_WR, + NOUVEAU_WS_BO_LOCAL | NOUVEAU_WS_BO_NO_SHARE, + NOUVEAU_WS_BO_WR, 4096 /* overalloc */, dev->pdev->info.cls_eng3d < VOLTA_A); if (result != VK_SUCCESS) goto fail_samplers; result = nvk_heap_init(dev, &dev->event_heap, - NOUVEAU_WS_BO_LOCAL, NOUVEAU_WS_BO_WR, + NOUVEAU_WS_BO_LOCAL | NOUVEAU_WS_BO_NO_SHARE, + NOUVEAU_WS_BO_WR, 0 /* overalloc */, false /* contiguous */); if (result != VK_SUCCESS) goto fail_shader_heap; @@ -230,7 +233,8 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice, void *zero_map; dev->zero_page = nouveau_ws_bo_new_mapped(dev->ws_dev, 0x1000, 0, - NOUVEAU_WS_BO_LOCAL, + NOUVEAU_WS_BO_LOCAL | + NOUVEAU_WS_BO_NO_SHARE, NOUVEAU_WS_BO_WR, &zero_map); if (dev->zero_page == NULL) goto fail_queue_submit; @@ -242,7 +246,8 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice, dev->pdev->info.cls_eng3d < MAXWELL_A) { /* max size is 256k */ dev->vab_memory = nouveau_ws_bo_new(dev->ws_dev, 1 << 17, 1 << 20, - NOUVEAU_WS_BO_LOCAL); + NOUVEAU_WS_BO_LOCAL | + NOUVEAU_WS_BO_NO_SHARE); if (dev->vab_memory == NULL) goto fail_zero_page; } diff --git a/src/nouveau/vulkan/nvk_device_memory.c b/src/nouveau/vulkan/nvk_device_memory.c index 1310ae7d3b0..2f5af26bae7 100644 --- a/src/nouveau/vulkan/nvk_device_memory.c +++ b/src/nouveau/vulkan/nvk_device_memory.c @@ -93,7 +93,8 @@ zero_vram(struct nvk_device *dev, struct nouveau_ws_bo *bo) } static enum nouveau_ws_bo_flags -nvk_memory_type_flags(const VkMemoryType *type) +nvk_memory_type_flags(const VkMemoryType *type, + VkExternalMemoryHandleTypeFlagBits handle_types) { enum nouveau_ws_bo_flags flags = 0; if (type->propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) @@ -104,6 +105,9 @@ nvk_memory_type_flags(const VkMemoryType *type) if (type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) flags |= NOUVEAU_WS_BO_MAP; + if (handle_types == 0) + flags |= NOUVEAU_WS_BO_NO_SHARE; + return flags; } @@ -131,7 +135,7 @@ nvk_GetMemoryFdPropertiesKHR(VkDevice device, uint32_t type_bits = 0; for (unsigned t = 0; t < ARRAY_SIZE(pdev->mem_types); t++) { const enum nouveau_ws_bo_flags flags = - nvk_memory_type_flags(&pdev->mem_types[t]); + nvk_memory_type_flags(&pdev->mem_types[t], handleType); if (!(flags & ~bo->flags)) type_bits |= (1 << t); } @@ -156,10 +160,19 @@ nvk_allocate_memory(struct nvk_device *dev, const VkImportMemoryFdInfoKHR *fd_info = vk_find_struct_const(pAllocateInfo->pNext, IMPORT_MEMORY_FD_INFO_KHR); - + const VkExportMemoryAllocateInfo *export_info = + vk_find_struct_const(pAllocateInfo->pNext, EXPORT_MEMORY_ALLOCATE_INFO); const VkMemoryType *type = &pdev->mem_types[pAllocateInfo->memoryTypeIndex]; - const enum nouveau_ws_bo_flags flags = nvk_memory_type_flags(type); + + VkExternalMemoryHandleTypeFlagBits handle_types = 0; + if (export_info != NULL) + handle_types |= export_info->handleTypes; + if (fd_info != NULL) + handle_types |= fd_info->handleType; + + const enum nouveau_ws_bo_flags flags = + nvk_memory_type_flags(type, handle_types); uint32_t alignment = (1ULL << 12); if (flags & NOUVEAU_WS_BO_LOCAL) diff --git a/src/nouveau/vulkan/nvk_query_pool.c b/src/nouveau/vulkan/nvk_query_pool.c index cb2dc0a3471..ff5e34e92f4 100644 --- a/src/nouveau/vulkan/nvk_query_pool.c +++ b/src/nouveau/vulkan/nvk_query_pool.c @@ -68,7 +68,8 @@ nvk_CreateQueryPool(VkDevice device, uint32_t bo_size = pool->query_start + pool->query_stride * pool->vk.query_count; pool->bo = nouveau_ws_bo_new_mapped(dev->ws_dev, bo_size, 0, - NOUVEAU_WS_BO_GART, + NOUVEAU_WS_BO_GART | + NOUVEAU_WS_BO_NO_SHARE, NOUVEAU_WS_BO_RDWR, &pool->bo_map); if (!pool->bo) { diff --git a/src/nouveau/vulkan/nvk_queue.c b/src/nouveau/vulkan/nvk_queue.c index 2d5c0c0e864..8b7587118c6 100644 --- a/src/nouveau/vulkan/nvk_queue.c +++ b/src/nouveau/vulkan/nvk_queue.c @@ -124,7 +124,9 @@ nvk_queue_state_update(struct nvk_device *dev, struct nouveau_ws_bo *push_bo; void *push_map; push_bo = nouveau_ws_bo_new_mapped(dev->ws_dev, 256 * 4, 0, - NOUVEAU_WS_BO_GART | NOUVEAU_WS_BO_MAP, + NOUVEAU_WS_BO_GART | + NOUVEAU_WS_BO_MAP | + NOUVEAU_WS_BO_NO_SHARE, NOUVEAU_WS_BO_WR, &push_map); if (push_bo == NULL) return vk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); @@ -330,7 +332,8 @@ nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue, void *empty_push_map; queue->empty_push = nouveau_ws_bo_new_mapped(dev->ws_dev, 4096, 0, NOUVEAU_WS_BO_GART | - NOUVEAU_WS_BO_MAP, + NOUVEAU_WS_BO_MAP | + NOUVEAU_WS_BO_NO_SHARE, NOUVEAU_WS_BO_WR, &empty_push_map); if (queue->empty_push == NULL) { @@ -393,7 +396,9 @@ nvk_queue_submit_simple(struct nvk_queue *queue, void *push_map; push_bo = nouveau_ws_bo_new_mapped(dev->ws_dev, dw_count * 4, 0, - NOUVEAU_WS_BO_GART | NOUVEAU_WS_BO_MAP, + NOUVEAU_WS_BO_GART | + NOUVEAU_WS_BO_MAP | + NOUVEAU_WS_BO_NO_SHARE, NOUVEAU_WS_BO_WR, &push_map); if (push_bo == NULL) return vk_error(queue, VK_ERROR_OUT_OF_DEVICE_MEMORY); diff --git a/src/nouveau/winsys/nouveau_bo.c b/src/nouveau/winsys/nouveau_bo.c index 168234ee0da..ebfb80768b4 100644 --- a/src/nouveau/winsys/nouveau_bo.c +++ b/src/nouveau/winsys/nouveau_bo.c @@ -178,6 +178,11 @@ nouveau_ws_bo_new_tiled(struct nouveau_ws_device *dev, if (flags & NOUVEAU_WS_BO_MAP) req.info.domain |= NOUVEAU_GEM_DOMAIN_MAPPABLE; +#if NVK_NEW_UAPI == 1 + if (flags & NOUVEAU_WS_BO_NO_SHARE) + req.info.domain |= NOUVEAU_GEM_DOMAIN_NO_SHARE; +#endif + #if NVK_NEW_UAPI == 0 assert(pte_kind == 0 || !(flags & NOUVEAU_WS_BO_GART)); assert(tile_mode == 0 || !(flags & NOUVEAU_WS_BO_GART)); diff --git a/src/nouveau/winsys/nouveau_bo.h b/src/nouveau/winsys/nouveau_bo.h index 2191a957909..304aba0ba8f 100644 --- a/src/nouveau/winsys/nouveau_bo.h +++ b/src/nouveau/winsys/nouveau_bo.h @@ -23,6 +23,7 @@ enum nouveau_ws_bo_flags { NOUVEAU_WS_BO_LOCAL = 0 << 0, NOUVEAU_WS_BO_GART = 1 << 0, NOUVEAU_WS_BO_MAP = 1 << 1, + NOUVEAU_WS_BO_NO_SHARE = 1 << 2, }; enum nouveau_ws_bo_map_flags { |