Module: Mesa Branch: main Commit: 746da376e42312034fe4f676eb9d8ee60aaec7e4 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=746da376e42312034fe4f676eb9d8ee60aaec7e4
Author: Juston Li <[email protected]> Date: Fri Nov 17 12:59:43 2023 -0800 venus: implement vkGet[Device]ImageSparseMemoryRequirements These were left unimplemented despite sparse support being added back to venus in a55d26b5 ("venus: add back sparse binding support") Same as vn_GetPhysicalDeviceSparseImageFormatProperties2, venus sparse support requires queues that also support transfer so any sparse-only queues are filtered out. If a device only supports sparse with sparse-only queues, sparse features are disabled and these functions return count of 0. Fixes: a55d26b566f ("venus: add back sparse binding support") Signed-off-by: Juston Li <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26297> --- src/virtio/vulkan/vn_image.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c index c8828a83241..47b0f1a19e0 100644 --- a/src/virtio/vulkan/vn_image.c +++ b/src/virtio/vulkan/vn_image.c @@ -505,13 +505,23 @@ vn_GetImageMemoryRequirements2(VkDevice device, void vn_GetImageSparseMemoryRequirements2( - UNUSED VkDevice device, - UNUSED const VkImageSparseMemoryRequirementsInfo2 *pInfo, + VkDevice device, + const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount, - UNUSED VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) + VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) { + struct vn_device *dev = vn_device_from_handle(device); + /* see vn_GetPhysicalDeviceSparseImageFormatProperties2 */ - *pSparseMemoryRequirementCount = 0; + if (dev->physical_device->sparse_binding_disabled) { + *pSparseMemoryRequirementCount = 0; + return; + } + + /* TODO local or per-device cache */ + vn_call_vkGetImageSparseMemoryRequirements2(dev->instance, device, pInfo, + pSparseMemoryRequirementCount, + pSparseMemoryRequirements); } static void @@ -847,11 +857,21 @@ vn_GetDeviceImageMemoryRequirements( void vn_GetDeviceImageSparseMemoryRequirements( - UNUSED VkDevice device, - UNUSED const VkDeviceImageMemoryRequirements *pInfo, + VkDevice device, + const VkDeviceImageMemoryRequirements *pInfo, uint32_t *pSparseMemoryRequirementCount, - UNUSED VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) + VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) { + struct vn_device *dev = vn_device_from_handle(device); + /* see vn_GetPhysicalDeviceSparseImageFormatProperties2 */ - *pSparseMemoryRequirementCount = 0; + if (dev->physical_device->sparse_binding_disabled) { + *pSparseMemoryRequirementCount = 0; + return; + } + + /* TODO per-device cache */ + vn_call_vkGetDeviceImageSparseMemoryRequirements( + dev->instance, device, pInfo, pSparseMemoryRequirementCount, + pSparseMemoryRequirements); }
