nvk/nvkmd: Split client and internal mappings
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31004>
This commit is contained in:

committed by
Marge Bot

parent
a2c813a6d3
commit
134dfbe524
@@ -279,7 +279,8 @@ nvk_MapMemory2KHR(VkDevice device,
|
|||||||
vk_device_memory_range(&mem->vk, pMemoryMapInfo->offset,
|
vk_device_memory_range(&mem->vk, pMemoryMapInfo->offset,
|
||||||
pMemoryMapInfo->size);
|
pMemoryMapInfo->size);
|
||||||
|
|
||||||
enum nvkmd_mem_map_flags map_flags = NVKMD_MEM_MAP_RDWR;
|
enum nvkmd_mem_map_flags map_flags = NVKMD_MEM_MAP_CLIENT |
|
||||||
|
NVKMD_MEM_MAP_RDWR;
|
||||||
|
|
||||||
void *fixed_addr = NULL;
|
void *fixed_addr = NULL;
|
||||||
if (pMemoryMapInfo->flags & VK_MEMORY_MAP_PLACED_BIT_EXT) {
|
if (pMemoryMapInfo->flags & VK_MEMORY_MAP_PLACED_BIT_EXT) {
|
||||||
@@ -315,7 +316,8 @@ nvk_MapMemory2KHR(VkDevice device,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void *mem_map;
|
void *mem_map;
|
||||||
result = nvkmd_mem_map(mem->mem, &mem->vk.base, map_flags, fixed_addr, &mem_map);
|
result = nvkmd_mem_map(mem->mem, &mem->vk.base, map_flags,
|
||||||
|
fixed_addr, &mem_map);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
@@ -334,9 +336,9 @@ nvk_UnmapMemory2KHR(VkDevice device,
|
|||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
|
|
||||||
if (pMemoryUnmapInfo->flags & VK_MEMORY_UNMAP_RESERVE_BIT_EXT) {
|
if (pMemoryUnmapInfo->flags & VK_MEMORY_UNMAP_RESERVE_BIT_EXT) {
|
||||||
return nvkmd_mem_overmap(mem->mem, &mem->vk.base, 0);
|
return nvkmd_mem_overmap(mem->mem, &mem->vk.base, NVKMD_MEM_MAP_CLIENT);
|
||||||
} else {
|
} else {
|
||||||
nvkmd_mem_unmap(mem->mem, 0);
|
nvkmd_mem_unmap(mem->mem, NVKMD_MEM_MAP_CLIENT);
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -207,6 +207,9 @@ nvkmd_mem_unref(struct nvkmd_mem *mem)
|
|||||||
if (!p_atomic_dec_zero(&mem->refcnt))
|
if (!p_atomic_dec_zero(&mem->refcnt))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (mem->client_map != NULL)
|
||||||
|
mem->ops->unmap(mem, NVKMD_MEM_MAP_CLIENT, mem->client_map);
|
||||||
|
|
||||||
if (mem->map != NULL)
|
if (mem->map != NULL)
|
||||||
mem->ops->unmap(mem, 0, mem->map);
|
mem->ops->unmap(mem, 0, mem->map);
|
||||||
|
|
||||||
@@ -218,14 +221,27 @@ nvkmd_mem_map(struct nvkmd_mem *mem, struct vk_object_base *log_obj,
|
|||||||
enum nvkmd_mem_map_flags flags, void *fixed_addr,
|
enum nvkmd_mem_map_flags flags, void *fixed_addr,
|
||||||
void **map_out)
|
void **map_out)
|
||||||
{
|
{
|
||||||
assert(mem->map == NULL);
|
|
||||||
|
|
||||||
void *map = NULL;
|
void *map = NULL;
|
||||||
VkResult result = mem->ops->map(mem, log_obj, flags, fixed_addr, &map);
|
|
||||||
if (result != VK_SUCCESS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
mem->map = map;
|
if (flags & NVKMD_MEM_MAP_CLIENT) {
|
||||||
|
assert(mem->client_map == NULL);
|
||||||
|
|
||||||
|
VkResult result = mem->ops->map(mem, log_obj, flags, fixed_addr, &map);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
mem->client_map = map;
|
||||||
|
} else {
|
||||||
|
assert(!(flags & NVKMD_MEM_MAP_FIXED));
|
||||||
|
assert(mem->map == NULL);
|
||||||
|
|
||||||
|
VkResult result = mem->ops->map(mem, log_obj, flags, fixed_addr, &map);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
mem->map = map;
|
||||||
|
}
|
||||||
|
|
||||||
if (map_out != NULL)
|
if (map_out != NULL)
|
||||||
*map_out = map;
|
*map_out = map;
|
||||||
|
|
||||||
@@ -235,7 +251,13 @@ nvkmd_mem_map(struct nvkmd_mem *mem, struct vk_object_base *log_obj,
|
|||||||
void
|
void
|
||||||
nvkmd_mem_unmap(struct nvkmd_mem *mem, enum nvkmd_mem_map_flags flags)
|
nvkmd_mem_unmap(struct nvkmd_mem *mem, enum nvkmd_mem_map_flags flags)
|
||||||
{
|
{
|
||||||
assert(mem->map != NULL);
|
if (flags & NVKMD_MEM_MAP_CLIENT) {
|
||||||
mem->ops->unmap(mem, flags, mem->map);
|
assert(mem->client_map != NULL);
|
||||||
mem->map = NULL;
|
mem->ops->unmap(mem, flags, mem->client_map);
|
||||||
|
mem->client_map = NULL;
|
||||||
|
} else {
|
||||||
|
assert(mem->map != NULL);
|
||||||
|
mem->ops->unmap(mem, flags, mem->map);
|
||||||
|
mem->map = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -57,7 +57,16 @@ enum nvkmd_mem_map_flags {
|
|||||||
NVKMD_MEM_MAP_RD = 1 << 0,
|
NVKMD_MEM_MAP_RD = 1 << 0,
|
||||||
NVKMD_MEM_MAP_WR = 1 << 1,
|
NVKMD_MEM_MAP_WR = 1 << 1,
|
||||||
NVKMD_MEM_MAP_RDWR = NVKMD_MEM_MAP_RD | NVKMD_MEM_MAP_WR,
|
NVKMD_MEM_MAP_RDWR = NVKMD_MEM_MAP_RD | NVKMD_MEM_MAP_WR,
|
||||||
NVKMD_MEM_MAP_FIXED = 1 << 2,
|
|
||||||
|
/** Create a client mapping
|
||||||
|
*
|
||||||
|
* This sets nvkmd_mem::client_map instead of nvkmd_mem::map. These
|
||||||
|
* mappings may be different from internal mappings. Only client mappings
|
||||||
|
* can be used with MAP_FIXED or unmapped with nvkmd_mem_overmap().
|
||||||
|
*/
|
||||||
|
NVKMD_MEM_MAP_CLIENT = 1 << 2,
|
||||||
|
|
||||||
|
NVKMD_MEM_MAP_FIXED = 1 << 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum nvkmd_va_flags {
|
enum nvkmd_va_flags {
|
||||||
@@ -222,6 +231,7 @@ struct nvkmd_mem {
|
|||||||
uint64_t size_B;
|
uint64_t size_B;
|
||||||
struct nvkmd_va *va;
|
struct nvkmd_va *va;
|
||||||
void *map;
|
void *map;
|
||||||
|
void *client_map;
|
||||||
};
|
};
|
||||||
|
|
||||||
void nvkmd_mem_init(struct nvkmd_dev *dev,
|
void nvkmd_mem_init(struct nvkmd_dev *dev,
|
||||||
@@ -467,10 +477,13 @@ static inline VkResult MUST_CHECK
|
|||||||
nvkmd_mem_overmap(struct nvkmd_mem *mem, struct vk_object_base *log_obj,
|
nvkmd_mem_overmap(struct nvkmd_mem *mem, struct vk_object_base *log_obj,
|
||||||
enum nvkmd_mem_map_flags flags)
|
enum nvkmd_mem_map_flags flags)
|
||||||
{
|
{
|
||||||
assert(mem->map != NULL);
|
assert(flags & NVKMD_MEM_MAP_CLIENT);
|
||||||
VkResult result = mem->ops->overmap(mem, log_obj, flags, mem->map);
|
assert(mem->client_map != NULL);
|
||||||
|
|
||||||
|
VkResult result = mem->ops->overmap(mem, log_obj, flags, mem->client_map);
|
||||||
if (result == VK_SUCCESS)
|
if (result == VK_SUCCESS)
|
||||||
mem->map = NULL;
|
mem->client_map = NULL;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user