From d65363b6b64de92e16719a151a5b64f2d0a6b835 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 22 Jan 2021 03:45:02 +0100 Subject: [PATCH] vkd3d: Add VA map to memory allocator. Signed-off-by: Philip Rebohle --- libs/vkd3d/memory.c | 19 +++++++++++++++---- libs/vkd3d/vkd3d_private.h | 2 ++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/libs/vkd3d/memory.c b/libs/vkd3d/memory.c index c2c7dc01..d852cb9b 100644 --- a/libs/vkd3d/memory.c +++ b/libs/vkd3d/memory.c @@ -228,12 +228,15 @@ static HRESULT vkd3d_allocation_assign_gpu_address(struct vkd3d_memory_allocatio if (device->device_info.buffer_device_address_features.bufferDeviceAddress) allocation->resource.va = vkd3d_get_buffer_device_address(device, allocation->resource.vk_buffer); else + allocation->resource.va = vkd3d_va_map_alloc_fake_va(&allocator->va_map, allocation->resource.size); + + if (!allocation->resource.va) { - /* TODO implement */ + ERR("Failed to get GPU address for allocation.\n"); + return E_OUTOFMEMORY; } - /* TODO register GPU address */ - + vkd3d_va_map_insert(&allocator->va_map, &allocation->resource); return S_OK; } @@ -241,7 +244,13 @@ static void vkd3d_memory_allocation_free(const struct vkd3d_memory_allocation *a { const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs; - /* TODO unregister GPU address */ + if ((allocation->flags & VKD3D_ALLOCATION_FLAG_GPU_ADDRESS) && allocation->resource.va) + { + vkd3d_va_map_remove(&allocator->va_map, &allocation->resource); + + if (!device->device_info.buffer_device_address_features.bufferDeviceAddress) + vkd3d_va_map_free_fake_va(&allocator->va_map, allocation->resource.va, allocation->resource.size); + } if (allocation->flags & VKD3D_ALLOCATION_FLAG_GLOBAL_BUFFER) VK_CALL(vkDestroyBuffer(device->vk_device, allocation->resource.vk_buffer, NULL)); @@ -387,6 +396,7 @@ HRESULT vkd3d_memory_allocator_init(struct vkd3d_memory_allocator *allocator, st if ((rc = pthread_mutex_init(&allocator->mutex, NULL))) return hresult_from_errno(rc); + vkd3d_va_map_init(&allocator->va_map); return S_OK; } @@ -398,6 +408,7 @@ void vkd3d_memory_allocator_cleanup(struct vkd3d_memory_allocator *allocator, st vkd3d_memory_chunk_destroy(allocator->chunks[i], device, allocator); vkd3d_free(allocator->chunks); + vkd3d_va_map_cleanup(&allocator->va_map); pthread_mutex_destroy(&allocator->mutex); } diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 86b26460..e0f8adb2 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -560,6 +560,8 @@ struct vkd3d_memory_allocator struct vkd3d_memory_chunk **chunks; size_t chunks_size; size_t chunks_count; + + struct vkd3d_va_map va_map; }; void vkd3d_free_memory_2(struct d3d12_device *device, struct vkd3d_memory_allocator *allocator,