venus: ensure invariance of buffer memory requirement size
authorYiwei Zhang <zzyiwei@chromium.org>
Thu, 2 Mar 2023 07:00:05 +0000 (23:00 -0800)
committerMarge Bot <emma+marge@anholt.net>
Fri, 3 Mar 2023 00:07:23 +0000 (00:07 +0000)
Need to align the size for the initial cache miss.

Fixes: ef255444c19 ("venus: switch to lazy VkBuffer cache")

Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21644>

src/virtio/vulkan/vn_buffer.c

index 5c7e2a1..2d1a387 100644 (file)
@@ -91,6 +91,18 @@ vn_buffer_cache_fini(struct vn_device *dev)
       vn_buffer_cache_debug_dump(&dev->buffer_cache);
 }
 
+static inline VkDeviceSize
+vn_buffer_get_aligned_memory_requirement_size(VkDeviceSize size,
+                                              const VkMemoryRequirements *req)
+{
+   /* TODO remove comment after mandating VK_KHR_maintenance4
+    *
+    * This is based on below implementation defined behavior:
+    *    req.size <= align64(info.size, req.alignment)
+    */
+   return align64(size, req->alignment);
+}
+
 static struct vn_buffer_cache_entry *
 vn_buffer_get_cached_memory_requirements(
    struct vn_buffer_cache *cache,
@@ -118,13 +130,9 @@ vn_buffer_get_cached_memory_requirements(
       if (entry->valid) {
          *out = entry->requirements;
 
-         /* TODO remove comment after mandating VK_KHR_maintenance4
-          *
-          * This is based on below implementation defined behavior:
-          *    req.size <= align64(info.size, req.alignment)
-          */
-         out->memory.memoryRequirements.size = align64(
-            create_info->size, out->memory.memoryRequirements.alignment);
+         out->memory.memoryRequirements.size =
+            vn_buffer_get_aligned_memory_requirement_size(
+               create_info->size, &out->memory.memoryRequirements);
 
          p_atomic_inc(&cache->debug.cache_hit_count);
       } else {
@@ -163,6 +171,12 @@ vn_buffer_cache_entry_init(struct vn_buffer_cache *cache,
 
 unlock:
    simple_mtx_unlock(&cache->mutex);
+
+   /* ensure invariance of the memory requirement size */
+   req->memoryRequirements.size =
+      vn_buffer_get_aligned_memory_requirement_size(
+         req->memoryRequirements.size,
+         &entry->requirements.memory.memoryRequirements);
 }
 
 static void