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"); } }