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