radv: Implement reserving the VA range on unmap.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27689>
This commit is contained in:
Bas Nieuwenhuizen 2024-02-19 01:21:53 +01:00 committed by Marge Bot
parent a6a31538c5
commit 7e029735e6
8 changed files with 16 additions and 11 deletions

View file

@ -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:

View file

@ -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;
}

View file

@ -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) {

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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;
}

View file

@ -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)
{
}