From a74f2495ca07bb536e8f1caaa8c2a4ed36c10d67 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Mon, 18 Oct 2021 18:03:11 +0000 Subject: [PATCH] venus: implement vn_buffer_get_max_buffer_size This change estimates the max_buffer_size with quick sort. Try to avoid some traffic upon device creation time, but not worth adding a buffer simple create api to avoid the extra requirement query traffic since this is temporary. Signed-off-by: Yiwei Zhang Reviewed-by: Chia-I Wu Reviewed-by: Ryan Neph Part-of: --- src/virtio/vulkan/vn_buffer.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/virtio/vulkan/vn_buffer.c b/src/virtio/vulkan/vn_buffer.c index 5a5a8d25e5f..00392a9a988 100644 --- a/src/virtio/vulkan/vn_buffer.c +++ b/src/virtio/vulkan/vn_buffer.c @@ -43,7 +43,33 @@ static VkResult vn_buffer_get_max_buffer_size(struct vn_device *dev, uint64_t *out_max_buffer_size) { - *out_max_buffer_size = 0; + /* XXX use VK_KHR_maintenance4 when available */ + const VkAllocationCallbacks *alloc = &dev->base.base.alloc; + VkDevice dev_handle = vn_device_to_handle(dev); + VkBuffer buf_handle; + VkBufferCreateInfo create_info = { + .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + }; + uint64_t max_buffer_size = 0; + uint8_t begin = 0; + uint8_t end = 64; + + while (begin <= end) { + uint8_t mid = (begin + end) >> 1; + create_info.size = 1 << mid; + if (vn_CreateBuffer(dev_handle, &create_info, alloc, &buf_handle) == + VK_SUCCESS) { + vn_DestroyBuffer(dev_handle, buf_handle, alloc); + max_buffer_size = create_info.size; + begin = mid + 1; + } else { + end = mid - 1; + } + } + + *out_max_buffer_size = max_buffer_size; return VK_SUCCESS; }