Module: Mesa
Branch: staging/23.3
Commit: 9fdc28451d1ef03258ab0322d6800e38254982a5
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9fdc28451d1ef03258ab0322d6800e38254982a5

Author: Juston Li <justo...@google.com>
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 <justo...@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26297>
(cherry picked from commit 746da376e42312034fe4f676eb9d8ee60aaec7e4)

---

 .pick_status.json            |  2 +-
 src/virtio/vulkan/vn_image.c | 36 ++++++++++++++++++++++++++++--------
 2 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 457e73460bf..375420b4b6b 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1534,7 +1534,7 @@
         "description": "venus: implement 
vkGet[Device]ImageSparseMemoryRequirements",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": "a55d26b566f1ba67f770f689e4de9b0f70c0d47b",
         "notes": null
diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c
index 2b71df44319..07a32b55ef2 100644
--- a/src/virtio/vulkan/vn_image.c
+++ b/src/virtio/vulkan/vn_image.c
@@ -514,13 +514,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
@@ -856,11 +866,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