From 52a89fedf2a2811ca5a06199eb171dea94a579e8 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 18 Jul 2017 09:02:53 -0700 Subject: [PATCH] anv: Implement VK_KHR_bind_memory2 Reviewed-by: Lionel Landwerlin --- src/intel/vulkan/anv_device.c | 41 +++++++++++++++++++++++++++++------- src/intel/vulkan/anv_extensions.py | 1 + src/intel/vulkan/anv_image.c | 43 ++++++++++++++++++++++++++++++-------- 3 files changed, 68 insertions(+), 17 deletions(-) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 8e2ed9e..233dd39 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -1863,23 +1863,48 @@ void anv_GetDeviceMemoryCommitment( *pCommittedMemoryInBytes = 0; } -VkResult anv_BindBufferMemory( - VkDevice device, - VkBuffer _buffer, - VkDeviceMemory _memory, - VkDeviceSize memoryOffset) +static void +anv_bind_buffer_memory(const VkBindBufferMemoryInfoKHR *pBindInfo) { - ANV_FROM_HANDLE(anv_device_memory, mem, _memory); - ANV_FROM_HANDLE(anv_buffer, buffer, _buffer); + ANV_FROM_HANDLE(anv_device_memory, mem, pBindInfo->memory); + ANV_FROM_HANDLE(anv_buffer, buffer, pBindInfo->buffer); + + assert(pBindInfo->sType == VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR); if (mem) { assert((buffer->usage & mem->type->valid_buffer_usage) == buffer->usage); buffer->bo = mem->bo; - buffer->offset = memoryOffset; + buffer->offset = pBindInfo->memoryOffset; } else { buffer->bo = NULL; buffer->offset = 0; } +} + +VkResult anv_BindBufferMemory( + VkDevice device, + VkBuffer buffer, + VkDeviceMemory memory, + VkDeviceSize memoryOffset) +{ + anv_bind_buffer_memory( + &(VkBindBufferMemoryInfoKHR) { + .sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR, + .buffer = buffer, + .memory = memory, + .memoryOffset = memoryOffset, + }); + + return VK_SUCCESS; +} + +VkResult anv_BindBufferMemory2KHR( + VkDevice device, + uint32_t bindInfoCount, + const VkBindBufferMemoryInfoKHR* pBindInfos) +{ + for (uint32_t i = 0; i < bindInfoCount; i++) + anv_bind_buffer_memory(&pBindInfos[i]); return VK_SUCCESS; } diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_extensions.py index acec785..cb0e36b 100644 --- a/src/intel/vulkan/anv_extensions.py +++ b/src/intel/vulkan/anv_extensions.py @@ -45,6 +45,7 @@ class Extension: self.enable = enable; EXTENSIONS = [ + Extension('VK_KHR_bind_memory2', 1, True), Extension('VK_KHR_dedicated_allocation', 1, True), Extension('VK_KHR_descriptor_update_template', 1, True), Extension('VK_KHR_external_fence', 1, diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 492b341..982461c 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -421,23 +421,48 @@ anv_DestroyImage(VkDevice _device, VkImage _image, vk_free2(&device->alloc, pAllocator, image); } -VkResult anv_BindImageMemory( - VkDevice _device, - VkImage _image, - VkDeviceMemory _memory, - VkDeviceSize memoryOffset) +static void +anv_bind_image_memory(const VkBindImageMemoryInfoKHR *pBindInfo) { - ANV_FROM_HANDLE(anv_device_memory, mem, _memory); - ANV_FROM_HANDLE(anv_image, image, _image); + ANV_FROM_HANDLE(anv_device_memory, mem, pBindInfo->memory); + ANV_FROM_HANDLE(anv_image, image, pBindInfo->image); + + assert(pBindInfo->sType == VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR); if (mem == NULL) { image->bo = NULL; image->offset = 0; - return VK_SUCCESS; + return; } image->bo = mem->bo; - image->offset = memoryOffset; + image->offset = pBindInfo->memoryOffset; +} + +VkResult anv_BindImageMemory( + VkDevice device, + VkImage image, + VkDeviceMemory memory, + VkDeviceSize memoryOffset) +{ + anv_bind_image_memory( + &(VkBindImageMemoryInfoKHR) { + .sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR, + .image = image, + .memory = memory, + .memoryOffset = memoryOffset, + }); + + return VK_SUCCESS; +} + +VkResult anv_BindImageMemory2KHR( + VkDevice device, + uint32_t bindInfoCount, + const VkBindImageMemoryInfoKHR* pBindInfos) +{ + for (uint32_t i = 0; i < bindInfoCount; i++) + anv_bind_image_memory(&pBindInfos[i]); return VK_SUCCESS; } -- 2.7.4