diff --git a/src/amd/vulkan/radv_android.c b/src/amd/vulkan/radv_android.c index abc8b86e76d..76ab39ca480 100644 --- a/src/amd/vulkan/radv_android.c +++ b/src/amd/vulkan/radv_android.c @@ -169,7 +169,7 @@ radv_image_from_gralloc(VkDevice device_h, return result; struct radeon_bo_metadata md; - device->ws->buffer_get_metadata(radv_device_memory_from_handle(memory_h)->bo, &md); + device->ws->buffer_get_metadata(device->ws, radv_device_memory_from_handle(memory_h)->bo, &md); VkImageCreateInfo updated_base_info = *base_info; @@ -742,7 +742,7 @@ radv_import_ahb_memory(struct radv_device *device, if (mem->image) { struct radeon_bo_metadata metadata; - device->ws->buffer_get_metadata(mem->bo, &metadata); + device->ws->buffer_get_metadata(device->ws, mem->bo, &metadata); struct radv_image_create_info create_info = { .no_metadata_planes = true, @@ -751,19 +751,19 @@ radv_import_ahb_memory(struct radv_device *device, VkResult result = radv_image_create_layout(device, create_info, NULL, mem->image); if (result != VK_SUCCESS) { - device->ws->buffer_destroy(mem->bo); + device->ws->buffer_destroy(device->ws, mem->bo); mem->bo = NULL; return result; } if (alloc_size < mem->image->size) { - device->ws->buffer_destroy(mem->bo); + device->ws->buffer_destroy(device->ws, mem->bo); mem->bo = NULL; return VK_ERROR_INVALID_EXTERNAL_HANDLE; } } else if (mem->buffer) { if (alloc_size < mem->buffer->size) { - device->ws->buffer_destroy(mem->bo); + device->ws->buffer_destroy(device->ws, mem->bo); mem->bo = NULL; return VK_ERROR_INVALID_EXTERNAL_HANDLE; } diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index a1bb8c5b212..c3af2b0df55 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -358,13 +358,13 @@ radv_destroy_cmd_buffer(struct radv_cmd_buffer *cmd_buffer) list_for_each_entry_safe(struct radv_cmd_buffer_upload, up, &cmd_buffer->upload.list, list) { - cmd_buffer->device->ws->buffer_destroy(up->upload_bo); + cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, up->upload_bo); list_del(&up->list); free(up); } if (cmd_buffer->upload.upload_bo) - cmd_buffer->device->ws->buffer_destroy(cmd_buffer->upload.upload_bo); + cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, cmd_buffer->upload.upload_bo); if (cmd_buffer->cs) cmd_buffer->device->ws->cs_destroy(cmd_buffer->cs); @@ -421,7 +421,7 @@ radv_reset_cmd_buffer(struct radv_cmd_buffer *cmd_buffer) list_for_each_entry_safe(struct radv_cmd_buffer_upload, up, &cmd_buffer->upload.list, list) { - cmd_buffer->device->ws->buffer_destroy(up->upload_bo); + cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, up->upload_bo); list_del(&up->list); free(up); } @@ -525,7 +525,7 @@ radv_cmd_buffer_resize_upload_buf(struct radv_cmd_buffer *cmd_buffer, if (!upload) { cmd_buffer->record_result = VK_ERROR_OUT_OF_HOST_MEMORY; - device->ws->buffer_destroy(bo); + device->ws->buffer_destroy(device->ws, bo); return false; } diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c index 6975159640b..c1b1f52e715 100644 --- a/src/amd/vulkan/radv_debug.c +++ b/src/amd/vulkan/radv_debug.c @@ -873,7 +873,7 @@ radv_trap_handler_finish(struct radv_device *device) radv_shader_variant_destroy(device, device->trap_handler_shader); if (unlikely(device->tma_bo)) - ws->buffer_destroy(device->tma_bo); + ws->buffer_destroy(ws, device->tma_bo); } static struct radv_shader_variant * diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c index a7dd239a003..8a07ea9b0f8 100644 --- a/src/amd/vulkan/radv_descriptor_set.c +++ b/src/amd/vulkan/radv_descriptor_set.c @@ -710,7 +710,7 @@ static void radv_destroy_descriptor_pool(struct radv_device *device, } if (pool->bo) - device->ws->buffer_destroy(pool->bo); + device->ws->buffer_destroy(device->ws, pool->bo); if (pool->host_bo) vk_free2(&device->vk.alloc, pAllocator, pool->host_bo); diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 15a509af261..fe4cba21f4c 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -2426,21 +2426,21 @@ radv_queue_finish(struct radv_queue *queue) if (queue->continue_preamble_cs) queue->device->ws->cs_destroy(queue->continue_preamble_cs); if (queue->descriptor_bo) - queue->device->ws->buffer_destroy(queue->descriptor_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->descriptor_bo); if (queue->scratch_bo) - queue->device->ws->buffer_destroy(queue->scratch_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->scratch_bo); if (queue->esgs_ring_bo) - queue->device->ws->buffer_destroy(queue->esgs_ring_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->esgs_ring_bo); if (queue->gsvs_ring_bo) - queue->device->ws->buffer_destroy(queue->gsvs_ring_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->gsvs_ring_bo); if (queue->tess_rings_bo) - queue->device->ws->buffer_destroy(queue->tess_rings_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->tess_rings_bo); if (queue->gds_bo) - queue->device->ws->buffer_destroy(queue->gds_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->gds_bo); if (queue->gds_oa_bo) - queue->device->ws->buffer_destroy(queue->gds_oa_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->gds_oa_bo); if (queue->compute_scratch_bo) - queue->device->ws->buffer_destroy(queue->compute_scratch_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->compute_scratch_bo); vk_object_base_finish(&queue->base); } @@ -2594,7 +2594,7 @@ static VkResult radv_device_init_border_color(struct radv_device *device) static void radv_device_finish_border_color(struct radv_device *device) { if (device->border_color_data.bo) { - device->ws->buffer_destroy(device->border_color_data.bo); + device->ws->buffer_destroy(device->ws, device->border_color_data.bo); mtx_destroy(&device->border_color_data.mutex); } @@ -2966,10 +2966,10 @@ fail: radv_trap_handler_finish(device); if (device->trace_bo) - device->ws->buffer_destroy(device->trace_bo); + device->ws->buffer_destroy(device->ws, device->trace_bo); if (device->gfx_init) - device->ws->buffer_destroy(device->gfx_init); + device->ws->buffer_destroy(device->ws, device->gfx_init); radv_device_finish_border_color(device); @@ -2995,10 +2995,10 @@ void radv_DestroyDevice( return; if (device->trace_bo) - device->ws->buffer_destroy(device->trace_bo); + device->ws->buffer_destroy(device->ws, device->trace_bo); if (device->gfx_init) - device->ws->buffer_destroy(device->gfx_init); + device->ws->buffer_destroy(device->ws, device->gfx_init); radv_device_finish_border_color(device); @@ -3904,7 +3904,7 @@ radv_get_preamble_cs(struct radv_queue *queue, if (scratch_bo != queue->scratch_bo) { if (queue->scratch_bo) - queue->device->ws->buffer_destroy(queue->scratch_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->scratch_bo); queue->scratch_bo = scratch_bo; } queue->scratch_size_per_wave = scratch_size_per_wave; @@ -3912,7 +3912,7 @@ radv_get_preamble_cs(struct radv_queue *queue, if (compute_scratch_bo != queue->compute_scratch_bo) { if (queue->compute_scratch_bo) - queue->device->ws->buffer_destroy(queue->compute_scratch_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->compute_scratch_bo); queue->compute_scratch_bo = compute_scratch_bo; } queue->compute_scratch_size_per_wave = compute_scratch_size_per_wave; @@ -3920,14 +3920,14 @@ radv_get_preamble_cs(struct radv_queue *queue, if (esgs_ring_bo != queue->esgs_ring_bo) { if (queue->esgs_ring_bo) - queue->device->ws->buffer_destroy(queue->esgs_ring_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->esgs_ring_bo); queue->esgs_ring_bo = esgs_ring_bo; queue->esgs_ring_size = esgs_ring_size; } if (gsvs_ring_bo != queue->gsvs_ring_bo) { if (queue->gsvs_ring_bo) - queue->device->ws->buffer_destroy(queue->gsvs_ring_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->gsvs_ring_bo); queue->gsvs_ring_bo = gsvs_ring_bo; queue->gsvs_ring_size = gsvs_ring_size; } @@ -3949,7 +3949,7 @@ radv_get_preamble_cs(struct radv_queue *queue, if (descriptor_bo != queue->descriptor_bo) { if (queue->descriptor_bo) - queue->device->ws->buffer_destroy(queue->descriptor_bo); + queue->device->ws->buffer_destroy(queue->device->ws, queue->descriptor_bo); queue->descriptor_bo = descriptor_bo; } @@ -3968,21 +3968,21 @@ fail: if (dest_cs[i]) queue->device->ws->cs_destroy(dest_cs[i]); if (descriptor_bo && descriptor_bo != queue->descriptor_bo) - queue->device->ws->buffer_destroy(descriptor_bo); + queue->device->ws->buffer_destroy(queue->device->ws, descriptor_bo); if (scratch_bo && scratch_bo != queue->scratch_bo) - queue->device->ws->buffer_destroy(scratch_bo); + queue->device->ws->buffer_destroy(queue->device->ws, scratch_bo); if (compute_scratch_bo && compute_scratch_bo != queue->compute_scratch_bo) - queue->device->ws->buffer_destroy(compute_scratch_bo); + queue->device->ws->buffer_destroy(queue->device->ws, compute_scratch_bo); if (esgs_ring_bo && esgs_ring_bo != queue->esgs_ring_bo) - queue->device->ws->buffer_destroy(esgs_ring_bo); + queue->device->ws->buffer_destroy(queue->device->ws, esgs_ring_bo); if (gsvs_ring_bo && gsvs_ring_bo != queue->gsvs_ring_bo) - queue->device->ws->buffer_destroy(gsvs_ring_bo); + queue->device->ws->buffer_destroy(queue->device->ws, gsvs_ring_bo); if (tess_rings_bo && tess_rings_bo != queue->tess_rings_bo) - queue->device->ws->buffer_destroy(tess_rings_bo); + queue->device->ws->buffer_destroy(queue->device->ws, tess_rings_bo); if (gds_bo && gds_bo != queue->gds_bo) - queue->device->ws->buffer_destroy(gds_bo); + queue->device->ws->buffer_destroy(queue->device->ws, gds_bo); if (gds_oa_bo && gds_oa_bo != queue->gds_oa_bo) - queue->device->ws->buffer_destroy(gds_oa_bo); + queue->device->ws->buffer_destroy(queue->device->ws, gds_oa_bo); return vk_error(queue->device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY); } @@ -4199,7 +4199,8 @@ radv_sparse_buffer_bind_memory(struct radv_device *device, if (bind->pBinds[i].memory != VK_NULL_HANDLE) mem = radv_device_memory_from_handle(bind->pBinds[i].memory); - result = device->ws->buffer_virtual_bind(buffer->bo, + result = device->ws->buffer_virtual_bind(device->ws, + buffer->bo, bind->pBinds[i].resourceOffset, bind->pBinds[i].size, mem ? mem->bo : NULL, @@ -4224,7 +4225,8 @@ radv_sparse_image_opaque_bind_memory(struct radv_device *device, if (bind->pBinds[i].memory != VK_NULL_HANDLE) mem = radv_device_memory_from_handle(bind->pBinds[i].memory); - result = device->ws->buffer_virtual_bind(image->bo, + result = device->ws->buffer_virtual_bind(device->ws, + image->bo, bind->pBinds[i].resourceOffset, bind->pBinds[i].size, mem ? mem->bo : NULL, @@ -4287,7 +4289,8 @@ radv_sparse_image_bind_memory(struct radv_device *device, surface->prt_tile_height); uint32_t size = aligned_extent_width * aligned_extent_height * bs; - result = device->ws->buffer_virtual_bind(image->bo, + result = device->ws->buffer_virtual_bind(device->ws, + image->bo, offset, size, mem ? mem->bo : NULL, @@ -4299,7 +4302,8 @@ radv_sparse_image_bind_memory(struct radv_device *device, uint32_t mem_increment = aligned_extent_width * bs; uint32_t size = mem_increment * surface->prt_tile_height; for (unsigned y = 0; y < bind_extent.height; y += surface->prt_tile_height) { - result = device->ws->buffer_virtual_bind(image->bo, + result = device->ws->buffer_virtual_bind(device->ws, + image->bo, offset + img_increment * y, size, mem ? mem->bo : NULL, @@ -5179,7 +5183,7 @@ bool radv_get_memory_fd(struct radv_device *device, if (memory->image && memory->image->offset == 0) { struct radeon_bo_metadata metadata; radv_init_metadata(device, memory->image, &metadata); - device->ws->buffer_set_metadata(memory->bo, &metadata); + device->ws->buffer_set_metadata(device->ws, memory->bo, &metadata); } return device->ws->buffer_get_fd(device->ws, memory->bo, @@ -5208,7 +5212,7 @@ radv_free_memory(struct radv_device *device, } radv_bo_list_remove(device, mem->bo); - device->ws->buffer_destroy(mem->bo); + device->ws->buffer_destroy(device->ws, mem->bo); mem->bo = NULL; } @@ -5313,7 +5317,7 @@ static VkResult radv_alloc_memory(struct radv_device *device, mem->image->info.samples == 1 && mem->image->tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) { struct radeon_bo_metadata metadata; - device->ws->buffer_get_metadata(mem->bo, &metadata); + device->ws->buffer_get_metadata(device->ws, mem->bo, &metadata); struct radv_image_create_info create_info = { .no_metadata_planes = true, @@ -5326,7 +5330,7 @@ static VkResult radv_alloc_memory(struct radv_device *device, result = radv_image_create_layout(device, create_info, NULL, mem->image); if (result != VK_SUCCESS) { - device->ws->buffer_destroy(mem->bo); + device->ws->buffer_destroy(device->ws, mem->bo); goto fail; } } @@ -6456,7 +6460,7 @@ static void radv_destroy_event(struct radv_device *device, struct radv_event *event) { if (event->bo) - device->ws->buffer_destroy(event->bo); + device->ws->buffer_destroy(device->ws, event->bo); vk_object_base_finish(&event->base); vk_free2(&device->vk.alloc, pAllocator, event); @@ -6553,7 +6557,7 @@ radv_destroy_buffer(struct radv_device *device, struct radv_buffer *buffer) { if ((buffer->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) && buffer->bo) - device->ws->buffer_destroy(buffer->bo); + device->ws->buffer_destroy(device->ws, buffer->bo); vk_object_base_finish(&buffer->base); vk_free2(&device->vk.alloc, pAllocator, buffer); diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index f03e6bb31bd..c3654950789 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -1447,7 +1447,7 @@ radv_destroy_image(struct radv_device *device, struct radv_image *image) { if ((image->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) && image->bo) - device->ws->buffer_destroy(image->bo); + device->ws->buffer_destroy(device->ws, image->bo); if (image->owned_memory != VK_NULL_HANDLE) { RADV_FROM_HANDLE(radv_device_memory, mem, image->owned_memory); diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c index a2c062c4c9e..cef6c900ea4 100644 --- a/src/amd/vulkan/radv_query.c +++ b/src/amd/vulkan/radv_query.c @@ -1006,7 +1006,7 @@ radv_destroy_query_pool(struct radv_device *device, struct radv_query_pool *pool) { if (pool->bo) - device->ws->buffer_destroy(pool->bo); + device->ws->buffer_destroy(device->ws, pool->bo); vk_object_base_finish(&pool->base); vk_free2(&device->vk.alloc, pAllocator, pool); } diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h index 2350efaafb3..29437d94870 100644 --- a/src/amd/vulkan/radv_radeon_winsys.h +++ b/src/amd/vulkan/radv_radeon_winsys.h @@ -231,7 +231,8 @@ struct radeon_winsys { enum radeon_bo_flag flags, unsigned priority); - void (*buffer_destroy)(struct radeon_winsys_bo *bo); + void (*buffer_destroy)(struct radeon_winsys *ws, + struct radeon_winsys_bo *bo); void *(*buffer_map)(struct radeon_winsys_bo *bo); struct radeon_winsys_bo *(*buffer_from_ptr)(struct radeon_winsys *ws, @@ -254,12 +255,15 @@ struct radeon_winsys { void (*buffer_unmap)(struct radeon_winsys_bo *bo); - void (*buffer_set_metadata)(struct radeon_winsys_bo *bo, + 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_bo *bo, + void (*buffer_get_metadata)(struct radeon_winsys *ws, + struct radeon_winsys_bo *bo, struct radeon_bo_metadata *md); - VkResult (*buffer_virtual_bind)(struct radeon_winsys_bo *parent, + VkResult (*buffer_virtual_bind)(struct radeon_winsys *ws, + struct radeon_winsys_bo *parent, uint64_t offset, uint64_t size, struct radeon_winsys_bo *bo, uint64_t bo_offset); VkResult (*ctx_create)(struct radeon_winsys *ws, diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index c25af07df93..2c64c9a7f4a 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -857,7 +857,7 @@ radv_alloc_shader_memory(struct radv_device *device, slab->ptr = (char*)device->ws->buffer_map(slab->bo); if (!slab->ptr) { - device->ws->buffer_destroy(slab->bo); + device->ws->buffer_destroy(device->ws, slab->bo); free(slab); return NULL; } @@ -878,7 +878,7 @@ void radv_destroy_shader_slabs(struct radv_device *device) { list_for_each_entry_safe(struct radv_shader_slab, slab, &device->shader_slabs, slabs) { - device->ws->buffer_destroy(slab->bo); + device->ws->buffer_destroy(device->ws, slab->bo); free(slab); } mtx_destroy(&device->shader_slab_mutex); diff --git a/src/amd/vulkan/radv_sqtt.c b/src/amd/vulkan/radv_sqtt.c index abd0a624231..4f1c5bca4ff 100644 --- a/src/amd/vulkan/radv_sqtt.c +++ b/src/amd/vulkan/radv_sqtt.c @@ -539,7 +539,7 @@ radv_thread_trace_finish(struct radv_device *device) struct radeon_winsys *ws = device->ws; if (unlikely(device->thread_trace.bo)) - ws->buffer_destroy(device->thread_trace.bo); + ws->buffer_destroy(ws, device->thread_trace.bo); for (unsigned i = 0; i < 2; i++) { if (device->thread_trace.start_cs[i]) diff --git a/src/amd/vulkan/si_cmd_buffer.c b/src/amd/vulkan/si_cmd_buffer.c index fc613fe01b7..a103d1545e3 100644 --- a/src/amd/vulkan/si_cmd_buffer.c +++ b/src/amd/vulkan/si_cmd_buffer.c @@ -638,7 +638,7 @@ cik_create_gfx_config(struct radv_device *device) void *map = device->ws->buffer_map(device->gfx_init); if (!map) { - device->ws->buffer_destroy(device->gfx_init); + device->ws->buffer_destroy(device->ws, device->gfx_init); device->gfx_init = NULL; goto fail; } diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c index 049191873b2..e5060b2994f 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c @@ -41,7 +41,8 @@ #include "util/u_math.h" #include "util/os_time.h" -static void radv_amdgpu_winsys_bo_destroy(struct radeon_winsys_bo *_bo); +static void radv_amdgpu_winsys_bo_destroy(struct radeon_winsys *_ws, + struct radeon_winsys_bo *_bo); static int radv_amdgpu_bo_va_op(struct radv_amdgpu_winsys *ws, @@ -73,21 +74,22 @@ radv_amdgpu_bo_va_op(struct radv_amdgpu_winsys *ws, } static void -radv_amdgpu_winsys_virtual_map(struct radv_amdgpu_winsys_bo *bo, +radv_amdgpu_winsys_virtual_map(struct radv_amdgpu_winsys *ws, + struct radv_amdgpu_winsys_bo *bo, const struct radv_amdgpu_map_range *range) { uint64_t internal_flags = 0; assert(range->size); if (!range->bo) { - if (!bo->ws->info.has_sparse_vm_mappings) + if (!ws->info.has_sparse_vm_mappings) return; internal_flags |= AMDGPU_VM_PAGE_PRT; } else p_atomic_inc(&range->bo->ref_count); - int r = radv_amdgpu_bo_va_op(bo->ws, range->bo ? range->bo->bo : NULL, + int r = radv_amdgpu_bo_va_op(ws, range->bo ? range->bo->bo : NULL, range->bo_offset, range->size, range->offset + bo->base.va, 0, internal_flags, AMDGPU_VA_OP_MAP); @@ -96,14 +98,15 @@ radv_amdgpu_winsys_virtual_map(struct radv_amdgpu_winsys_bo *bo, } static void -radv_amdgpu_winsys_virtual_unmap(struct radv_amdgpu_winsys_bo *bo, +radv_amdgpu_winsys_virtual_unmap(struct radv_amdgpu_winsys *ws, + struct radv_amdgpu_winsys_bo *bo, const struct radv_amdgpu_map_range *range) { uint64_t internal_flags = 0; assert(range->size); if (!range->bo) { - if(!bo->ws->info.has_sparse_vm_mappings) + if(!ws->info.has_sparse_vm_mappings) return; /* Even though this is an unmap, if we don't set this flag, @@ -111,7 +114,7 @@ radv_amdgpu_winsys_virtual_unmap(struct radv_amdgpu_winsys_bo *bo, internal_flags |= AMDGPU_VM_PAGE_PRT; } - int r = radv_amdgpu_bo_va_op(bo->ws, range->bo ? range->bo->bo : NULL, + int r = radv_amdgpu_bo_va_op(ws, range->bo ? range->bo->bo : NULL, range->bo_offset, range->size, range->offset + bo->base.va, 0, internal_flags, AMDGPU_VA_OP_UNMAP); @@ -119,7 +122,7 @@ radv_amdgpu_winsys_virtual_unmap(struct radv_amdgpu_winsys_bo *bo, abort(); if (range->bo) - radv_amdgpu_winsys_bo_destroy((struct radeon_winsys_bo *)range->bo); + ws->base.buffer_destroy(&ws->base, (struct radeon_winsys_bo *)range->bo); } static int bo_comparator(const void *ap, const void *bp) { @@ -159,10 +162,12 @@ radv_amdgpu_winsys_rebuild_bo_list(struct radv_amdgpu_winsys_bo *bo) } static VkResult -radv_amdgpu_winsys_bo_virtual_bind(struct radeon_winsys_bo *_parent, +radv_amdgpu_winsys_bo_virtual_bind(struct radeon_winsys *_ws, + struct radeon_winsys_bo *_parent, uint64_t offset, uint64_t size, struct radeon_winsys_bo *_bo, uint64_t bo_offset) { + struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws); struct radv_amdgpu_winsys_bo *parent = (struct radv_amdgpu_winsys_bo *)_parent; struct radv_amdgpu_winsys_bo *bo = (struct radv_amdgpu_winsys_bo*)_bo; int range_count_delta, new_idx; @@ -227,7 +232,7 @@ radv_amdgpu_winsys_bo_virtual_bind(struct radeon_winsys_bo *_parent, /* Any range between first and last is going to be entirely covered by the new range so just unmap them. */ for (int i = first + 1; i < last; ++i) - radv_amdgpu_winsys_virtual_unmap(parent, parent->ranges + i); + radv_amdgpu_winsys_virtual_unmap(ws, parent, parent->ranges + i); /* If the first/last range are not left alone we unmap then and optionally map * them again after modifications. Not that this implicitly can do the splitting @@ -236,24 +241,24 @@ radv_amdgpu_winsys_bo_virtual_bind(struct radeon_winsys_bo *_parent, new_last = parent->ranges[last]; if (parent->ranges[first].offset + parent->ranges[first].size > offset || remove_first) { - radv_amdgpu_winsys_virtual_unmap(parent, parent->ranges + first); + radv_amdgpu_winsys_virtual_unmap(ws, parent, parent->ranges + first); unmapped_first = true; if (!remove_first) { new_first.size = offset - new_first.offset; - radv_amdgpu_winsys_virtual_map(parent, &new_first); + radv_amdgpu_winsys_virtual_map(ws, parent, &new_first); } } if (parent->ranges[last].offset < offset + size || remove_last) { if (first != last || !unmapped_first) - radv_amdgpu_winsys_virtual_unmap(parent, parent->ranges + last); + radv_amdgpu_winsys_virtual_unmap(ws, parent, parent->ranges + last); if (!remove_last) { new_last.size -= offset + size - new_last.offset; new_last.bo_offset += (offset + size - new_last.offset); new_last.offset = offset + size; - radv_amdgpu_winsys_virtual_map(parent, &new_last); + radv_amdgpu_winsys_virtual_map(ws, parent, &new_last); } } @@ -273,7 +278,7 @@ radv_amdgpu_winsys_bo_virtual_bind(struct radeon_winsys_bo *_parent, parent->ranges[new_idx].bo = bo; parent->ranges[new_idx].bo_offset = bo_offset; - radv_amdgpu_winsys_virtual_map(parent, parent->ranges + new_idx); + radv_amdgpu_winsys_virtual_map(ws, parent, parent->ranges + new_idx); parent->range_count += range_count_delta; @@ -293,13 +298,13 @@ struct radv_amdgpu_winsys_bo_log { uint8_t destroyed : 1; }; -static void radv_amdgpu_log_bo(struct radv_amdgpu_winsys_bo *bo, +static void radv_amdgpu_log_bo(struct radv_amdgpu_winsys *ws, + struct radv_amdgpu_winsys_bo *bo, bool destroyed) { - struct radv_amdgpu_winsys *ws = bo->ws; struct radv_amdgpu_winsys_bo_log *bo_log = NULL; - if (!bo->ws->debug_log_bos) + if (!ws->debug_log_bos) return; bo_log = malloc(sizeof(*bo_log)); @@ -317,10 +322,9 @@ static void radv_amdgpu_log_bo(struct radv_amdgpu_winsys_bo *bo, u_rwlock_wrunlock(&ws->log_bo_list_lock); } -static int radv_amdgpu_global_bo_list_add(struct radv_amdgpu_winsys_bo *bo) +static int radv_amdgpu_global_bo_list_add(struct radv_amdgpu_winsys *ws, + struct radv_amdgpu_winsys_bo *bo) { - struct radv_amdgpu_winsys *ws = bo->ws; - if (!ws->debug_all_bos) return VK_SUCCESS; @@ -343,10 +347,9 @@ static int radv_amdgpu_global_bo_list_add(struct radv_amdgpu_winsys_bo *bo) return VK_SUCCESS; } -static void radv_amdgpu_global_bo_list_del(struct radv_amdgpu_winsys_bo *bo) +static void radv_amdgpu_global_bo_list_del(struct radv_amdgpu_winsys *ws, + struct radv_amdgpu_winsys_bo *bo) { - struct radv_amdgpu_winsys *ws = bo->ws; - if (!ws->debug_all_bos) return; @@ -361,25 +364,26 @@ static void radv_amdgpu_global_bo_list_del(struct radv_amdgpu_winsys_bo *bo) u_rwlock_wrunlock(&ws->global_bo_list.lock); } -static void radv_amdgpu_winsys_bo_destroy(struct radeon_winsys_bo *_bo) +static void radv_amdgpu_winsys_bo_destroy(struct radeon_winsys *_ws, + struct radeon_winsys_bo *_bo) { + struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws); struct radv_amdgpu_winsys_bo *bo = radv_amdgpu_winsys_bo(_bo); - struct radv_amdgpu_winsys *ws = bo->ws; if (p_atomic_dec_return(&bo->ref_count)) return; - radv_amdgpu_log_bo(bo, true); + radv_amdgpu_log_bo(ws, bo, true); if (bo->is_virtual) { for (uint32_t i = 0; i < bo->range_count; ++i) { - radv_amdgpu_winsys_virtual_unmap(bo, bo->ranges + i); + radv_amdgpu_winsys_virtual_unmap(ws, bo, bo->ranges + i); } free(bo->bos); free(bo->ranges); } else { - radv_amdgpu_global_bo_list_del(bo); - radv_amdgpu_bo_va_op(bo->ws, bo->bo, 0, bo->size, bo->base.va, + radv_amdgpu_global_bo_list_del(ws, bo); + radv_amdgpu_bo_va_op(ws, bo->bo, 0, bo->size, bo->base.va, 0, 0, AMDGPU_VA_OP_UNMAP); amdgpu_bo_free(bo->bo); } @@ -437,7 +441,6 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, bo->base.va = va; bo->va_handle = va_handle; bo->size = size; - bo->ws = ws; bo->is_virtual = !!(flags & RADEON_FLAG_VIRTUAL); bo->ref_count = 1; @@ -455,8 +458,8 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, bo->ranges[0].bo = NULL; bo->ranges[0].bo_offset = 0; - radv_amdgpu_winsys_virtual_map(bo, bo->ranges); - radv_amdgpu_log_bo(bo, false); + radv_amdgpu_winsys_virtual_map(ws, bo, bo->ranges); + radv_amdgpu_log_bo(ws, bo, false); return (struct radeon_winsys_bo *)bo; } @@ -559,8 +562,8 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, p_atomic_add(&ws->allocated_gtt, align64(bo->size, ws->info.gart_page_size)); - radv_amdgpu_global_bo_list_add(bo); - radv_amdgpu_log_bo(bo, false); + radv_amdgpu_global_bo_list_add(ws, bo); + radv_amdgpu_log_bo(ws, bo, false); return (struct radeon_winsys_bo *)bo; error_va_map: @@ -657,7 +660,6 @@ radv_amdgpu_winsys_bo_from_ptr(struct radeon_winsys *_ws, bo->va_handle = va_handle; bo->size = size; bo->ref_count = 1; - bo->ws = ws; bo->bo = buf_handle; bo->base.initial_domain = RADEON_DOMAIN_GTT; bo->priority = priority; @@ -668,8 +670,8 @@ radv_amdgpu_winsys_bo_from_ptr(struct radeon_winsys *_ws, p_atomic_add(&ws->allocated_gtt, align64(bo->size, ws->info.gart_page_size)); - radv_amdgpu_global_bo_list_add(bo); - radv_amdgpu_log_bo(bo, false); + radv_amdgpu_global_bo_list_add(ws, bo); + radv_amdgpu_log_bo(ws, bo, false); return (struct radeon_winsys_bo *)bo; @@ -736,7 +738,6 @@ radv_amdgpu_winsys_bo_from_fd(struct radeon_winsys *_ws, bo->base.initial_domain = initial; bo->size = result.alloc_size; bo->is_shared = true; - bo->ws = ws; bo->priority = priority; bo->ref_count = 1; @@ -750,8 +751,8 @@ radv_amdgpu_winsys_bo_from_fd(struct radeon_winsys *_ws, p_atomic_add(&ws->allocated_gtt, align64(bo->size, ws->info.gart_page_size)); - radv_amdgpu_global_bo_list_add(bo); - radv_amdgpu_log_bo(bo, false); + radv_amdgpu_global_bo_list_add(ws, bo); + radv_amdgpu_log_bo(ws, bo, false); return (struct radeon_winsys_bo *)bo; error_va_map: @@ -859,14 +860,16 @@ static unsigned radv_eg_tile_split_rev(unsigned eg_tile_split) } static void -radv_amdgpu_winsys_bo_set_metadata(struct radeon_winsys_bo *_bo, +radv_amdgpu_winsys_bo_set_metadata(struct radeon_winsys *_ws, + struct radeon_winsys_bo *_bo, struct radeon_bo_metadata *md) { + struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws); struct radv_amdgpu_winsys_bo *bo = radv_amdgpu_winsys_bo(_bo); struct amdgpu_bo_metadata metadata = {0}; uint64_t tiling_flags = 0; - if (bo->ws->info.chip_class >= GFX9) { + if (ws->info.chip_class >= GFX9) { tiling_flags |= AMDGPU_TILING_SET(SWIZZLE_MODE, md->u.gfx9.swizzle_mode); tiling_flags |= AMDGPU_TILING_SET(SCANOUT, md->u.gfx9.scanout); } else { @@ -899,9 +902,11 @@ radv_amdgpu_winsys_bo_set_metadata(struct radeon_winsys_bo *_bo, } static void -radv_amdgpu_winsys_bo_get_metadata(struct radeon_winsys_bo *_bo, +radv_amdgpu_winsys_bo_get_metadata(struct radeon_winsys *_ws, + struct radeon_winsys_bo *_bo, struct radeon_bo_metadata *md) { + struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws); struct radv_amdgpu_winsys_bo *bo = radv_amdgpu_winsys_bo(_bo); struct amdgpu_bo_info info = {0}; @@ -911,7 +916,7 @@ radv_amdgpu_winsys_bo_get_metadata(struct radeon_winsys_bo *_bo, uint64_t tiling_flags = info.metadata.tiling_info; - if (bo->ws->info.chip_class >= GFX9) { + if (ws->info.chip_class >= GFX9) { md->u.gfx9.swizzle_mode = AMDGPU_TILING_GET(tiling_flags, SWIZZLE_MODE); md->u.gfx9.scanout = AMDGPU_TILING_GET(tiling_flags, SCANOUT); } else { diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.h b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.h index 2aa5732ecab..6284484261d 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.h +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.h @@ -43,7 +43,6 @@ struct radv_amdgpu_winsys_bo { struct radeon_winsys_bo base; amdgpu_va_handle va_handle; uint64_t size; - struct radv_amdgpu_winsys *ws; bool is_virtual; uint8_t priority; int ref_count; diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c index 34f2d95febb..74cf4e4cd5e 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c @@ -280,12 +280,12 @@ static void radv_amdgpu_cs_destroy(struct radeon_cmdbuf *rcs) struct radv_amdgpu_cs *cs = radv_amdgpu_cs(rcs); if (cs->ib_buffer) - cs->ws->base.buffer_destroy(cs->ib_buffer); + cs->ws->base.buffer_destroy(&cs->ws->base, cs->ib_buffer); else free(cs->base.buf); for (unsigned i = 0; i < cs->num_old_ib_buffers; ++i) - cs->ws->base.buffer_destroy(cs->old_ib_buffers[i]); + cs->ws->base.buffer_destroy(&cs->ws->base, cs->old_ib_buffers[i]); for (unsigned i = 0; i < cs->num_old_cs_buffers; ++i) { free(cs->old_cs_buffers[i].buf); @@ -336,7 +336,7 @@ radv_amdgpu_cs_create(struct radeon_winsys *ws, cs->ib_mapped = ws->buffer_map(cs->ib_buffer); if (!cs->ib_mapped) { - ws->buffer_destroy(cs->ib_buffer); + ws->buffer_destroy(ws, cs->ib_buffer); free(cs); return NULL; } @@ -465,7 +465,7 @@ static void radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size) cs->ib_mapped = cs->ws->base.buffer_map(cs->ib_buffer); if (!cs->ib_mapped) { - cs->ws->base.buffer_destroy(cs->ib_buffer); + cs->ws->base.buffer_destroy(&cs->ws->base, cs->ib_buffer); cs->base.cdw = 0; /* VK_ERROR_MEMORY_MAP_FAILED is not valid for vkEndCommandBuffer. */ @@ -528,7 +528,7 @@ static void radv_amdgpu_cs_reset(struct radeon_cmdbuf *_cs) cs->ws->base.cs_add_buffer(&cs->base, cs->ib_buffer); for (unsigned i = 0; i < cs->num_old_ib_buffers; ++i) - cs->ws->base.buffer_destroy(cs->old_ib_buffers[i]); + cs->ws->base.buffer_destroy(&cs->ws->base, cs->old_ib_buffers[i]); cs->num_old_ib_buffers = 0; cs->ib.ib_mc_address = radv_amdgpu_winsys_bo(cs->ib_buffer)->base.va; @@ -1239,7 +1239,7 @@ radv_amdgpu_winsys_cs_submit_sysmem(struct radeon_winsys_ctx *_ctx, u_rwlock_rdunlock(&aws->global_bo_list.lock); for (unsigned j = 0; j < number_of_ibs; j++) { - ws->buffer_destroy(bos[j]); + ws->buffer_destroy(ws, bos[j]); } free(ibs); @@ -1403,7 +1403,7 @@ static VkResult radv_amdgpu_ctx_create(struct radeon_winsys *_ws, return VK_SUCCESS; fail_map: - ws->base.buffer_destroy(ctx->fence_bo); + ws->base.buffer_destroy(&ws->base, ctx->fence_bo); fail_alloc: amdgpu_cs_ctx_free(ctx->ctx); fail_create: @@ -1414,7 +1414,7 @@ fail_create: static void radv_amdgpu_ctx_destroy(struct radeon_winsys_ctx *rwctx) { struct radv_amdgpu_ctx *ctx = (struct radv_amdgpu_ctx *)rwctx; - ctx->ws->base.buffer_destroy(ctx->fence_bo); + ctx->ws->base.buffer_destroy(&ctx->ws->base, ctx->fence_bo); amdgpu_cs_ctx_free(ctx->ctx); FREE(ctx); } diff --git a/src/amd/vulkan/winsys/null/radv_null_bo.c b/src/amd/vulkan/winsys/null/radv_null_bo.c index da6b59d578e..318b498a23c 100644 --- a/src/amd/vulkan/winsys/null/radv_null_bo.c +++ b/src/amd/vulkan/winsys/null/radv_null_bo.c @@ -64,7 +64,8 @@ radv_null_winsys_bo_unmap(struct radeon_winsys_bo *_bo) { } -static void radv_null_winsys_bo_destroy(struct radeon_winsys_bo *_bo) +static void radv_null_winsys_bo_destroy(struct radeon_winsys *_ws, + struct radeon_winsys_bo *_bo) { struct radv_null_winsys_bo *bo = radv_null_winsys_bo(_bo); FREE(bo->ptr);