nvk/nvkmd: Flip the script on NO_SHARED

It's a positive flag in the kernel interface because it enables an
optimization and adds restrictions to the BO.  But from a userspace PoV,
NO_SHARE shoudd be the default with import/export being something we
expressly have to ask for.  This also reduces the number of flags we're
setting everywhere.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30033>
This commit is contained in:
Faith Ekstrand
2024-07-06 09:24:45 -05:00
committed by Marge Bot
parent 1cee0c9cb7
commit 2689760e38
10 changed files with 22 additions and 32 deletions
+1 -1
View File
@@ -21,7 +21,7 @@ nvk_cmd_mem_create(struct nvk_cmd_pool *pool, bool force_gart, struct nvk_cmd_me
if (mem == NULL)
return vk_error(pool, VK_ERROR_OUT_OF_HOST_MEMORY);
uint32_t flags = NVKMD_MEM_GART | NVKMD_MEM_CAN_MAP | NVKMD_MEM_NO_SHARE;
uint32_t flags = NVKMD_MEM_GART;
if (force_gart)
assert(flags & NVKMD_MEM_GART);
result = nvkmd_dev_alloc_mapped_mem(dev->nvkmd, &pool->vk.base,
+1 -2
View File
@@ -540,8 +540,7 @@ nvk_CreateDescriptorPool(VkDevice _device,
if (mem_size) {
result = nvkmd_dev_alloc_mapped_mem(dev->nvkmd, &dev->vk.base,
mem_size, 0,
NVKMD_MEM_GART | NVKMD_MEM_NO_SHARE,
mem_size, 0, NVKMD_MEM_GART,
NVKMD_MEM_MAP_WR, &pool->mem);
if (result != VK_SUCCESS) {
nvk_destroy_descriptor_pool(dev, pAllocator, pool);
+1 -2
View File
@@ -23,8 +23,7 @@ nvk_descriptor_table_grow_locked(struct nvk_device *dev,
const uint32_t new_mem_size = new_alloc * table->desc_size;
result = nvkmd_dev_alloc_mapped_mem(dev->nvkmd, &dev->vk.base,
new_mem_size, 256,
NVKMD_MEM_LOCAL | NVKMD_MEM_NO_SHARE,
NVKMD_MEM_MAP_WR,
NVKMD_MEM_LOCAL, NVKMD_MEM_MAP_WR,
&new_mem);
if (result != VK_SUCCESS)
return result;
+5 -9
View File
@@ -96,7 +96,7 @@ nvk_slm_area_ensure(struct nvk_device *dev,
struct nvkmd_mem *mem;
result = nvkmd_dev_alloc_mem(dev->nvkmd, &dev->vk.base, size, 0,
NVKMD_MEM_LOCAL | NVKMD_MEM_NO_SHARE, &mem);
NVKMD_MEM_LOCAL, &mem);
if (result != VK_SUCCESS)
return result;
@@ -190,16 +190,14 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice,
if (pdev->info.bar_size_B >= pdev->info.vram_size_B)
shader_map_flags = NVKMD_MEM_MAP_WR;
result = nvk_heap_init(dev, &dev->shader_heap,
NVKMD_MEM_LOCAL | NVKMD_MEM_NO_SHARE,
shader_map_flags,
NVKMD_MEM_LOCAL, shader_map_flags,
4096 /* overalloc */,
pdev->info.cls_eng3d < VOLTA_A);
if (result != VK_SUCCESS)
goto fail_samplers;
result = nvk_heap_init(dev, &dev->event_heap,
NVKMD_MEM_LOCAL | NVKMD_MEM_NO_SHARE,
NVKMD_MEM_MAP_WR,
NVKMD_MEM_LOCAL, NVKMD_MEM_MAP_WR,
0 /* overalloc */, false /* contiguous */);
if (result != VK_SUCCESS)
goto fail_shader_heap;
@@ -207,8 +205,7 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice,
nvk_slm_area_init(&dev->slm);
result = nvkmd_dev_alloc_mapped_mem(dev->nvkmd, &pdev->vk.base,
0x1000, 0,
NVKMD_MEM_LOCAL | NVKMD_MEM_NO_SHARE,
0x1000, 0, NVKMD_MEM_LOCAL,
NVKMD_MEM_MAP_WR, &dev->zero_page);
if (result != VK_SUCCESS)
goto fail_slm;
@@ -220,8 +217,7 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice,
pdev->info.cls_eng3d < MAXWELL_A) {
/* max size is 256k */
result = nvkmd_dev_alloc_mem(dev->nvkmd, &pdev->vk.base,
1 << 17, 1 << 20,
NVKMD_MEM_LOCAL | NVKMD_MEM_NO_SHARE,
1 << 17, 1 << 20, NVKMD_MEM_LOCAL,
&dev->vab_memory);
if (result != VK_SUCCESS)
goto fail_zero_page;
+2 -2
View File
@@ -58,8 +58,8 @@ nvk_memory_type_flags(const VkMemoryType *type,
if (handle_types & VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT)
flags |= NVKMD_MEM_GART;
if (handle_types == 0)
flags |= NVKMD_MEM_NO_SHARE;
if (handle_types != 0)
flags |= NVKMD_MEM_SHARED;
return flags;
}
+1 -1
View File
@@ -78,7 +78,7 @@ nvk_CreateQueryPool(VkDevice device,
pool->query_stride * pool->vk.query_count;
result = nvkmd_dev_alloc_mapped_mem(dev->nvkmd, &dev->vk.base,
mem_size, 0 /* align_B */,
NVKMD_MEM_GART | NVKMD_MEM_NO_SHARE,
NVKMD_MEM_GART,
NVKMD_MEM_MAP_RDWR,
&pool->mem);
if (result != VK_SUCCESS) {
+3 -6
View File
@@ -114,9 +114,7 @@ nvk_queue_state_update(struct nvk_device *dev,
struct nvkmd_mem *push_mem;
VkResult result = nvkmd_dev_alloc_mapped_mem(dev->nvkmd, &dev->vk.base,
256 * 4, 0,
NVKMD_MEM_GART |
NVKMD_MEM_NO_SHARE,
256 * 4, 0, NVKMD_MEM_GART,
NVKMD_MEM_MAP_WR, &push_mem);
if (result != VK_SUCCESS)
return result;
@@ -421,7 +419,7 @@ nvk_queue_submit_simple(struct nvk_queue *queue,
struct nvkmd_mem *push_mem;
result = nvkmd_dev_alloc_mapped_mem(dev->nvkmd, &dev->vk.base,
dw_count * 4, 0,
NVKMD_MEM_GART | NVKMD_MEM_NO_SHARE,
NVKMD_MEM_GART,
NVKMD_MEM_MAP_WR, &push_mem);
if (result != VK_SUCCESS)
return result;
@@ -533,8 +531,7 @@ nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue,
goto fail_init;
result = nvkmd_dev_alloc_mem(dev->nvkmd, &dev->vk.base,
4096, 0,
NVKMD_MEM_LOCAL | NVKMD_MEM_NO_SHARE,
4096, 0, NVKMD_MEM_LOCAL,
&queue->draw_cb0);
if (result != VK_SUCCESS)
goto fail_exec_ctx;
+2 -3
View File
@@ -37,10 +37,9 @@ nvk_upload_mem_create(struct nvk_device *dev,
if (mem == NULL)
return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
uint32_t flags = NVKMD_MEM_GART | NVKMD_MEM_CAN_MAP | NVKMD_MEM_NO_SHARE;
result = nvkmd_dev_alloc_mapped_mem(dev->nvkmd, &dev->vk.base,
NVK_UPLOAD_MEM_SIZE, 0,
flags, NVKMD_MEM_MAP_WR, &mem->mem);
NVK_UPLOAD_MEM_SIZE, 0, NVKMD_MEM_GART,
NVKMD_MEM_MAP_WR, &mem->mem);
if (result != VK_SUCCESS) {
vk_free(&dev->vk.alloc, mem);
return result;
@@ -90,7 +90,8 @@ nvkmd_nouveau_alloc_tiled_mem(struct nvkmd_dev *_dev,
nouveau_flags |= NOUVEAU_WS_BO_GART;
if (flags & NVKMD_MEM_CAN_MAP)
nouveau_flags |= NOUVEAU_WS_BO_MAP;
if (flags & NVKMD_MEM_NO_SHARE)
if (!(flags & NVKMD_MEM_SHARED))
nouveau_flags |= NOUVEAU_WS_BO_NO_SHARE;
struct nouveau_ws_bo *bo = nouveau_ws_bo_new_tiled(dev->ws_dev,
@@ -115,15 +116,13 @@ nvkmd_nouveau_import_dma_buf(struct nvkmd_dev *_dev,
if (bo == NULL)
return vk_errorf(log_obj, VK_ERROR_INVALID_EXTERNAL_HANDLE, "%m");
enum nvkmd_mem_flags flags = 0;
enum nvkmd_mem_flags flags = NVKMD_MEM_SHARED;
if (bo->flags & NOUVEAU_WS_BO_LOCAL)
flags |= NVKMD_MEM_LOCAL;
if (bo->flags & NOUVEAU_WS_BO_GART)
flags |= NVKMD_MEM_GART;
if (bo->flags & NOUVEAU_WS_BO_MAP)
flags |= NVKMD_MEM_CAN_MAP;
if (bo->flags & NOUVEAU_WS_BO_NO_SHARE)
flags |= NVKMD_MEM_NO_SHARE;
return create_mem_or_close_bo(dev, log_obj,
0 /* align_B */,
+3 -2
View File
@@ -39,7 +39,8 @@ enum nvkmd_mem_flags {
/** This memory object may be mapped */
NVKMD_MEM_CAN_MAP = 1 << 2,
NVKMD_MEM_NO_SHARE = 1 << 3,
/** This memory object may be shared with other processes */
NVKMD_MEM_SHARED = 1 << 3,
};
enum nvkmd_mem_map_flags {
@@ -452,7 +453,7 @@ nvkmd_mem_export_dma_buf(struct nvkmd_mem *mem,
struct vk_object_base *log_obj,
int *fd_out)
{
assert(!(mem->flags & NVKMD_MEM_NO_SHARE));
assert(mem->flags & NVKMD_MEM_SHARED);
return mem->ops->export_dma_buf(mem, log_obj, fd_out);
}