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:
committed by
Marge Bot
parent
1cee0c9cb7
commit
2689760e38
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user