From b5e7a22c2e99d76407e35aa6d24ff7d18fd0e656 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Wed, 1 Mar 2023 23:00:05 -0800 Subject: [PATCH] venus: ensure invariance of buffer memory requirement size Need to align the size for the initial cache miss. Fixes: ef255444c19 ("venus: switch to lazy VkBuffer cache") Signed-off-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_buffer.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/virtio/vulkan/vn_buffer.c b/src/virtio/vulkan/vn_buffer.c index 5c7e2a1eed1..2d1a387dca8 100644 --- a/src/virtio/vulkan/vn_buffer.c +++ b/src/virtio/vulkan/vn_buffer.c @@ -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