[Mesa-dev] [PATCH] anv: Implement VK_KHR_bind_memory2

Lionel Landwerlin lionel.g.landwerlin at intel.com
Sun Sep 17 10:32:11 UTC 2017


I'll rebase my stuff on top of this.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>

On 15/09/17 20:10, Jason Ekstrand wrote:
> ---
>   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;
>   }




More information about the mesa-dev mailing list