Skip to content
Snippets Groups Projects
Commit cfb7e2b8 authored by Dave Airlie's avatar Dave Airlie
Browse files

nvk: add vma support for images/buffers/device memory

parent d60243ed
Loading
......@@ -18,8 +18,14 @@ nvk_CreateBuffer(VkDevice _device,
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
buffer->aligned_size = ALIGN(buffer->vk.size, 4096);
#if NVK_NEW_UAPI == 1
struct nouveau_ws_device *dev = device->pdev->dev;
bool sparse = pCreateInfo->flags & (VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT);
buffer->addr = nouveau_ws_alloc_vma(dev, buffer->aligned_size, 4096, sparse);
#endif
*pBuffer = nvk_buffer_to_handle(buffer);
return VK_SUCCESS;
}
......@@ -33,7 +39,13 @@ nvk_DestroyBuffer(VkDevice _device,
if (!buffer)
return;
#if NVK_NEW_UAPI == 1
if (buffer->mem) {
struct nouveau_ws_device *dev = device->pdev->dev;
nouveau_ws_bo_unbind_vma(dev, buffer->addr, buffer->aligned_size);
nouveau_ws_free_vma(dev, buffer->addr, buffer->aligned_size);
}
#endif
vk_buffer_destroy(&device->vk, pAllocator, &buffer->vk);
}
......@@ -76,7 +88,16 @@ nvk_BindBufferMemory2(VkDevice _device,
VK_FROM_HANDLE(nvk_buffer, buffer, pBindInfos[i].buffer);
buffer->mem = mem;
#if NVK_NEW_UAPI == 0
buffer->addr = mem->bo->offset + pBindInfos[i].memoryOffset;
#else
VK_FROM_HANDLE(nvk_device, device, _device);
nouveau_ws_bo_bind_vma(device->pdev->dev,
mem->bo->handle,
buffer->addr,
buffer->aligned_size,
pBindInfos[i].memoryOffset, 0);
#endif
}
return VK_SUCCESS;
}
......
......@@ -94,6 +94,7 @@ nvk_allocate_memory(struct nvk_device *device,
size = pAllocateInfo->allocationSize;
#if NVK_NEW_UAPI == 1
flags |= NOUVEAU_WS_BO_NO_VMA;
size = ALIGN(size, align);
#endif
mem->map = NULL;
......
......@@ -295,6 +295,7 @@ nvk_CreateImage(VkDevice _device,
return result;
}
#if NVK_NEW_UAPI == 0
if (image->nil.pte_kind) {
assert(device->pdev->mem_heaps[0].flags &
VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
......@@ -320,6 +321,11 @@ nvk_CreateImage(VkDevice _device,
image->mem = image->internal;
image->offset = 0;
}
#else
struct nouveau_ws_device *dev = device->pdev->dev;
bool sparse = pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT);
image->addr = nouveau_ws_alloc_vma(dev, image->nil.size_B, image->nil.align_B, sparse);
#endif
*pImage = nvk_image_to_handle(image);
......@@ -337,8 +343,16 @@ nvk_DestroyImage(VkDevice _device,
if (!image)
return;
#if NVK_NEW_UAPI == 0
if (image->internal)
nvk_free_memory(device, image->internal, pAllocator);
#else
struct nouveau_ws_device *dev = device->pdev->dev;
if (image->mem) {
nouveau_ws_bo_unbind_vma(dev, image->addr, image->nil.size_B);
nouveau_ws_free_vma(dev, image->addr, image->nil.size_B);
}
#endif
nvk_image_finish(image);
vk_free2(&device->vk.alloc, pAllocator, image);
......@@ -414,11 +428,23 @@ nvk_BindImageMemory2(VkDevice _device,
VK_FROM_HANDLE(nvk_device_memory, mem, pBindInfos[i].memory);
VK_FROM_HANDLE(nvk_image, image, pBindInfos[i].image);
#if NVK_NEW_UAPI == 0
if (image->internal)
continue;
#endif
image->mem = mem;
image->offset = pBindInfos[i].memoryOffset;
#if NVK_NEW_UAPI == 1
VK_FROM_HANDLE(nvk_device, device, _device);
nouveau_ws_bo_bind_vma(device->pdev->dev,
mem->bo->handle,
image->addr,
image->nil.size_B,
image->offset,
image->nil.pte_kind);
#endif
}
return VK_SUCCESS;
}
......@@ -17,12 +17,16 @@ nvk_get_image_format_features(struct nvk_physical_device *pdevice,
struct nvk_image {
struct vk_image vk;
#if NVK_NEW_UAPI == 0
/* Used for internal dedicated allocations */
struct nvk_device_memory *internal;
#endif
struct nvk_device_memory *mem;
VkDeviceSize offset;
#if NVK_NEW_UAPI == 1
VkDeviceSize addr;
#endif
struct nil_image nil;
};
......@@ -31,7 +35,11 @@ VK_DEFINE_HANDLE_CASTS(nvk_image, vk.base, VkImage, VK_OBJECT_TYPE_IMAGE)
static inline uint64_t
nvk_image_base_address(const struct nvk_image *image)
{
#if NVK_NEW_UAPI == 0
return image->mem->bo->offset + image->offset;
#else
return image->addr;
#endif
}
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment