From 7e029735e65fec5c0d3f611c296ec8747c1f2d4e Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Mon, 19 Feb 2024 01:21:53 +0100 Subject: [PATCH] radv: Implement reserving the VA range on unmap. Part-of: --- src/amd/vulkan/radv_cp_reg_shadowing.c | 2 +- src/amd/vulkan/radv_device_memory.c | 2 +- src/amd/vulkan/radv_queue.c | 4 ++-- src/amd/vulkan/radv_radeon_winsys.h | 2 +- src/amd/vulkan/radv_video.c | 2 +- src/amd/vulkan/si_cmd_buffer.c | 2 +- src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c | 11 ++++++++--- src/amd/vulkan/winsys/null/radv_null_bo.c | 2 +- 8 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/amd/vulkan/radv_cp_reg_shadowing.c b/src/amd/vulkan/radv_cp_reg_shadowing.c index e6f57d768a7..94c3c45451b 100644 --- a/src/amd/vulkan/radv_cp_reg_shadowing.c +++ b/src/amd/vulkan/radv_cp_reg_shadowing.c @@ -84,7 +84,7 @@ radv_create_shadow_regs_preamble(const struct radv_device *device, struct radv_q memcpy(map, cs->buf, cs->cdw * 4); queue_state->shadow_regs_ib_size_dw = cs->cdw; - ws->buffer_unmap(ws, queue_state->shadow_regs_ib); + ws->buffer_unmap(ws, queue_state->shadow_regs_ib, false); ws->cs_destroy(cs); return VK_SUCCESS; fail_map: diff --git a/src/amd/vulkan/radv_device_memory.c b/src/amd/vulkan/radv_device_memory.c index d8af3afb4ed..126527c5b2b 100644 --- a/src/amd/vulkan/radv_device_memory.c +++ b/src/amd/vulkan/radv_device_memory.c @@ -330,7 +330,7 @@ radv_UnmapMemory2KHR(VkDevice _device, const VkMemoryUnmapInfoKHR *pMemoryUnmapI vk_rmv_log_cpu_map(&device->vk, mem->bo->va, true); if (mem->user_ptr == NULL) - device->ws->buffer_unmap(device->ws, mem->bo); + device->ws->buffer_unmap(device->ws, mem->bo, (pMemoryUnmapInfo->flags & VK_MEMORY_UNMAP_RESERVE_BIT_EXT)); return VK_SUCCESS; } diff --git a/src/amd/vulkan/radv_queue.c b/src/amd/vulkan/radv_queue.c index 63fcc9558b2..1567d057567 100644 --- a/src/amd/vulkan/radv_queue.c +++ b/src/amd/vulkan/radv_queue.c @@ -601,7 +601,7 @@ radv_initialise_task_control_buffer(struct radv_device *device, struct radeon_wi ptr[7] = task_draw_ring_va; ptr[8] = task_draw_ring_va >> 32; - device->ws->buffer_unmap(device->ws, task_rings_bo); + device->ws->buffer_unmap(device->ws, task_rings_bo, false); return VK_SUCCESS; } @@ -992,7 +992,7 @@ radv_update_preamble_cs(struct radv_queue_state *queue, struct radv_device *devi gsvs_ring_bo, tess_rings_bo, task_rings_bo, mesh_scratch_ring_bo, needs->attr_ring_size, attr_ring_bo); - ws->buffer_unmap(ws, descriptor_bo); + ws->buffer_unmap(ws, descriptor_bo, false); } for (int i = 0; i < 3; ++i) { diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h index 41ad84a83d9..4f85c6cc39d 100644 --- a/src/amd/vulkan/radv_radeon_winsys.h +++ b/src/amd/vulkan/radv_radeon_winsys.h @@ -264,7 +264,7 @@ struct radeon_winsys { bool (*buffer_get_flags_from_fd)(struct radeon_winsys *ws, int fd, enum radeon_bo_domain *domains, enum radeon_bo_flag *flags); - void (*buffer_unmap)(struct radeon_winsys *ws, struct radeon_winsys_bo *bo); + void (*buffer_unmap)(struct radeon_winsys *ws, struct radeon_winsys_bo *bo, bool replace); void (*buffer_set_metadata)(struct radeon_winsys *ws, struct radeon_winsys_bo *bo, struct radeon_bo_metadata *md); void (*buffer_get_metadata)(struct radeon_winsys *ws, struct radeon_winsys_bo *bo, struct radeon_bo_metadata *md); diff --git a/src/amd/vulkan/radv_video.c b/src/amd/vulkan/radv_video.c index 86fb773995f..49bf91ad9d8 100644 --- a/src/amd/vulkan/radv_video.c +++ b/src/amd/vulkan/radv_video.c @@ -2742,7 +2742,7 @@ radv_vcn_cmd_reset(struct radv_cmd_buffer *cmd_buffer) rvcn_vcn4_av1_default_coef_probs((void *)(ctxptr + i * frame_ctxt_size), i); } } - cmd_buffer->device->ws->buffer_unmap(cmd_buffer->device->ws, vid->ctx.mem->bo); + cmd_buffer->device->ws->buffer_unmap(cmd_buffer->device->ws, vid->ctx.mem->bo, false); } radv_vid_buffer_upload_alloc(cmd_buffer, size, &out_offset, &ptr); diff --git a/src/amd/vulkan/si_cmd_buffer.c b/src/amd/vulkan/si_cmd_buffer.c index 0de2b2a689a..f976c2a6332 100644 --- a/src/amd/vulkan/si_cmd_buffer.c +++ b/src/amd/vulkan/si_cmd_buffer.c @@ -653,7 +653,7 @@ radv_create_gfx_config(struct radv_device *device) } memcpy(map, cs->buf, cs->cdw * 4); - device->ws->buffer_unmap(device->ws, device->gfx_init); + device->ws->buffer_unmap(device->ws, device->gfx_init, false); device->gfx_init_size_dw = cs->cdw; fail: device->ws->cs_destroy(cs); diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c index 0db54a4a813..dd9a32e0f9b 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c @@ -587,15 +587,20 @@ radv_amdgpu_winsys_bo_map(struct radeon_winsys *_ws, struct radeon_winsys_bo *_b } static void -radv_amdgpu_winsys_bo_unmap(struct radeon_winsys *_ws, struct radeon_winsys_bo *_bo) +radv_amdgpu_winsys_bo_unmap(struct radeon_winsys *_ws, struct radeon_winsys_bo *_bo, bool replace) { struct radv_amdgpu_winsys_bo *bo = radv_amdgpu_winsys_bo(_bo); /* Defense in depth against buggy apps. */ - if (!bo->cpu_map) + if (!bo->cpu_map && !replace) return; - munmap(bo->cpu_map, bo->size); + assert(bo->cpu_map); + if (replace) { + (void)mmap(bo->cpu_map, bo->size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + } else { + munmap(bo->cpu_map, bo->size); + } bo->cpu_map = NULL; } diff --git a/src/amd/vulkan/winsys/null/radv_null_bo.c b/src/amd/vulkan/winsys/null/radv_null_bo.c index 38423586ccc..90de8e15df7 100644 --- a/src/amd/vulkan/winsys/null/radv_null_bo.c +++ b/src/amd/vulkan/winsys/null/radv_null_bo.c @@ -61,7 +61,7 @@ radv_null_winsys_bo_map(struct radeon_winsys *_ws, struct radeon_winsys_bo *_bo, } static void -radv_null_winsys_bo_unmap(struct radeon_winsys *_ws, struct radeon_winsys_bo *_bo) +radv_null_winsys_bo_unmap(struct radeon_winsys *_ws, struct radeon_winsys_bo *_bo, bool replace) { }