Module: Mesa
Branch: main
Commit: 17081334ab7c59b34660b7f83883c3135e966dbe
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=17081334ab7c59b34660b7f83883c3135e966dbe

Author: Samuel Pitoiset <samuel.pitoi...@gmail.com>
Date:   Mon Sep 18 09:58:18 2023 +0200

radv: add support for VkBindMemoryStatusKHR

Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26757>

---

 src/amd/vulkan/radv_buffer.c | 6 ++++++
 src/amd/vulkan/radv_image.c  | 8 +++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_buffer.c b/src/amd/vulkan/radv_buffer.c
index a9b38fdbfb9..147985eda41 100644
--- a/src/amd/vulkan/radv_buffer.c
+++ b/src/amd/vulkan/radv_buffer.c
@@ -143,6 +143,10 @@ radv_BindBufferMemory2(VkDevice _device, uint32_t 
bindInfoCount, const VkBindBuf
    for (uint32_t i = 0; i < bindInfoCount; ++i) {
       RADV_FROM_HANDLE(radv_device_memory, mem, pBindInfos[i].memory);
       RADV_FROM_HANDLE(radv_buffer, buffer, pBindInfos[i].buffer);
+      VkBindMemoryStatusKHR *status = (void 
*)vk_find_struct_const(&pBindInfos[i], BIND_MEMORY_STATUS_KHR);
+
+      if (status)
+         *status->pResult = VK_SUCCESS;
 
       if (mem->alloc_size) {
          VkBufferMemoryRequirementsInfo2 info = {
@@ -156,6 +160,8 @@ radv_BindBufferMemory2(VkDevice _device, uint32_t 
bindInfoCount, const VkBindBuf
          vk_common_GetBufferMemoryRequirements2(_device, &info, &reqs);
 
          if (pBindInfos[i].memoryOffset + reqs.memoryRequirements.size > 
mem->alloc_size) {
+            if (status)
+               *status->pResult = VK_ERROR_UNKNOWN;
             return vk_errorf(device, VK_ERROR_UNKNOWN, "Device memory object 
too small for the buffer.\n");
          }
       }
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index bb3eb85027a..92eceb8fa12 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -1598,8 +1598,12 @@ radv_BindImageMemory2(VkDevice _device, uint32_t 
bindInfoCount, const VkBindImag
    for (uint32_t i = 0; i < bindInfoCount; ++i) {
       RADV_FROM_HANDLE(radv_device_memory, mem, pBindInfos[i].memory);
       RADV_FROM_HANDLE(radv_image, image, pBindInfos[i].image);
+      VkBindMemoryStatusKHR *status = (void 
*)vk_find_struct_const(&pBindInfos[i], BIND_MEMORY_STATUS_KHR);
 
-      /* Ignore this struct on Android, we cannot access swapchain structures 
there. */
+      if (status)
+         *status->pResult = VK_SUCCESS;
+
+         /* Ignore this struct on Android, we cannot access swapchain 
structures there. */
 #ifdef RADV_USE_WSI_PLATFORM
       const VkBindImageMemorySwapchainInfoKHR *swapchain_info =
          vk_find_struct_const(pBindInfos[i].pNext, 
BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR);
@@ -1626,6 +1630,8 @@ radv_BindImageMemory2(VkDevice _device, uint32_t 
bindInfoCount, const VkBindImag
          radv_GetImageMemoryRequirements2(_device, &info, &reqs);
 
          if (pBindInfos[i].memoryOffset + reqs.memoryRequirements.size > 
mem->alloc_size) {
+            if (status)
+               *status->pResult = VK_ERROR_UNKNOWN;
             return vk_errorf(device, VK_ERROR_UNKNOWN, "Device memory object 
too small for the image.\n");
          }
       }

Reply via email to