Module: Mesa
Branch: main
Commit: fc1ff335d9e23dc294cf2d3666236d0707fb87ca
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=fc1ff335d9e23dc294cf2d3666236d0707fb87ca

Author: Juston Li <[email protected]>
Date:   Wed Sep 14 16:30:56 2022 -0700

venus: use buffer cache for vkGetDeviceBufferMemoryRequirements

Align with vkGetBufferMemoryRequirements2 and utilize the cache for
retrieving memory requirements before trying the host call.

Fixes
dEQP-VK.api.invariance.memory_requirements_matching
dEQP-VK.memory.requirements.create_info.buffer.regular

Signed-off-by: Juston Li <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18603>

---

 src/virtio/vulkan/vn_buffer.c | 62 +++++++++++++++++++++++++++----------------
 1 file changed, 39 insertions(+), 23 deletions(-)

diff --git a/src/virtio/vulkan/vn_buffer.c b/src/virtio/vulkan/vn_buffer.c
index 044fdc6850a..e7772f6ddd7 100644
--- a/src/virtio/vulkan/vn_buffer.c
+++ b/src/virtio/vulkan/vn_buffer.c
@@ -286,6 +286,35 @@ vn_buffer_cache_get_memory_requirements(
    return false;
 }
 
+static void
+vn_copy_cached_memory_requirements(
+   const struct vn_buffer_memory_requirements *cached,
+   VkMemoryRequirements2 *out_mem_req)
+{
+   union {
+      VkBaseOutStructure *pnext;
+      VkMemoryRequirements2 *two;
+      VkMemoryDedicatedRequirements *dedicated;
+   } u = { .two = out_mem_req };
+
+   while (u.pnext) {
+      switch (u.pnext->sType) {
+      case VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2:
+         u.two->memoryRequirements = cached->memory.memoryRequirements;
+         break;
+      case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
+         u.dedicated->prefersDedicatedAllocation =
+            cached->dedicated.prefersDedicatedAllocation;
+         u.dedicated->requiresDedicatedAllocation =
+            cached->dedicated.requiresDedicatedAllocation;
+         break;
+      default:
+         break;
+      }
+      u.pnext = u.pnext->pNext;
+   }
+}
+
 static VkResult
 vn_buffer_init(struct vn_device *dev,
                const VkBufferCreateInfo *create_info,
@@ -431,29 +460,9 @@ vn_GetBufferMemoryRequirements2(VkDevice device,
                                 VkMemoryRequirements2 *pMemoryRequirements)
 {
    const struct vn_buffer *buf = vn_buffer_from_handle(pInfo->buffer);
-   union {
-      VkBaseOutStructure *pnext;
-      VkMemoryRequirements2 *two;
-      VkMemoryDedicatedRequirements *dedicated;
-   } u = { .two = pMemoryRequirements };
 
-   while (u.pnext) {
-      switch (u.pnext->sType) {
-      case VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2:
-         u.two->memoryRequirements =
-            buf->requirements.memory.memoryRequirements;
-         break;
-      case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
-         u.dedicated->prefersDedicatedAllocation =
-            buf->requirements.dedicated.prefersDedicatedAllocation;
-         u.dedicated->requiresDedicatedAllocation =
-            buf->requirements.dedicated.requiresDedicatedAllocation;
-         break;
-      default:
-         break;
-      }
-      u.pnext = u.pnext->pNext;
-   }
+   vn_copy_cached_memory_requirements(&buf->requirements,
+                                      pMemoryRequirements);
 }
 
 VkResult
@@ -551,8 +560,15 @@ vn_GetDeviceBufferMemoryRequirements(
    VkMemoryRequirements2 *pMemoryRequirements)
 {
    struct vn_device *dev = vn_device_from_handle(device);
+   struct vn_buffer_memory_requirements cached;
+
+   if (vn_buffer_cache_get_memory_requirements(&dev->buffer_cache,
+                                               pInfo->pCreateInfo, &cached)) {
+      vn_copy_cached_memory_requirements(&cached, pMemoryRequirements);
+      return;
+   }
 
-   /* TODO per-device cache */
+   /* make the host call if not found in cache */
    vn_call_vkGetDeviceBufferMemoryRequirements(dev->instance, device, pInfo,
                                                pMemoryRequirements);
 }

Reply via email to