radv/winsys: remove the radv_amdgpu_winsys_bo::ws indirection
This saves a 64-bit pointer from radv_amdgpu_winsys_bo and it's also common to pass a winsys pointer as the first parameter. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8859>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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 *
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -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);
|
||||
|
@@ -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])
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user