summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2023-07-24 09:38:44 +1000
committerMarge Bot <emma+marge@anholt.net>2023-08-04 21:32:07 +0000
commit1a6a198ab54fcf0018bba1f5e3b3bb1ade578383 (patch)
tree737bd3bd9b65ad40a2754809583c146827edb74c
parent766a6a5a4d4e2d09780af005bcc39a6dbd8f7e85 (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.c2
-rw-r--r--src/nouveau/vulkan/nvk_descriptor_set.c2
-rw-r--r--src/nouveau/vulkan/nvk_descriptor_table.c4
-rw-r--r--src/nouveau/vulkan/nvk_device.c15
-rw-r--r--src/nouveau/vulkan/nvk_device_memory.c21
-rw-r--r--src/nouveau/vulkan/nvk_query_pool.c3
-rw-r--r--src/nouveau/vulkan/nvk_queue.c11
-rw-r--r--src/nouveau/winsys/nouveau_bo.c5
-rw-r--r--src/nouveau/winsys/nouveau_bo.h1
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 {