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

Reply via email to