Module: Mesa Branch: main Commit: 9d76ed9638139dd792355bdd2070f5e15ea3eab3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9d76ed9638139dd792355bdd2070f5e15ea3eab3
Author: Yiwei Zhang <[email protected]> Date: Sun Feb 12 20:30:53 2023 -0800 venus: replace binary search with hardcode for max buffer size Avoid the couple test buffer creations without maintenance4. Signed-off-by: Yiwei Zhang <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21379> --- src/virtio/vulkan/vn_buffer.c | 63 +++++++++++-------------------------------- 1 file changed, 15 insertions(+), 48 deletions(-) diff --git a/src/virtio/vulkan/vn_buffer.c b/src/virtio/vulkan/vn_buffer.c index 5046ff2baac..2127ec74aa1 100644 --- a/src/virtio/vulkan/vn_buffer.c +++ b/src/virtio/vulkan/vn_buffer.c @@ -30,57 +30,29 @@ vn_buffer_create_info_can_be_cached(const VkBufferCreateInfo *create_info, (create_info->sharingMode == VK_SHARING_MODE_EXCLUSIVE); } -static VkResult -vn_buffer_get_max_buffer_size(struct vn_device *dev, - uint64_t *out_max_buffer_size) +static inline uint64_t +vn_buffer_get_max_buffer_size(struct vn_physical_device *physical_dev) { - const VkAllocationCallbacks *alloc = &dev->base.base.alloc; - struct vn_physical_device *pdev = dev->physical_device; - 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; - - if (pdev->features.vulkan_1_3.maintenance4) { - *out_max_buffer_size = pdev->properties.vulkan_1_3.maxBufferSize; - return VK_SUCCESS; - } - - /* For drivers that don't support VK_KHR_maintenance4, we try to estimate - * the maxBufferSize using binary search. - * TODO remove all the search code after VK_KHR_maintenance4 becomes - * a requirement. + /* Without maintenance4, hardcode the min of supported drivers: + * - anv: 1ull << 30 + * - radv: UINT32_MAX - 4 + * - tu: UINT32_MAX + 1 + * - lvp: UINT32_MAX + * - mali: UINT32_MAX */ - while (begin < end) { - uint8_t mid = (begin + end) >> 1; - create_info.size = 1ull << 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; - } - } - - *out_max_buffer_size = max_buffer_size; - return VK_SUCCESS; + static const uint64_t safe_max_buffer_size = 1ULL << 30; + return physical_dev->features.vulkan_1_3.maintenance4 + ? physical_dev->properties.vulkan_1_3.maxBufferSize + : safe_max_buffer_size; } VkResult vn_buffer_cache_init(struct vn_device *dev) { uint32_t ahb_mem_type_bits = 0; - uint64_t max_buffer_size = 0; VkResult result; + /* TODO lazily initialize ahb buffer cache */ if (dev->base.base.enabled_extensions .ANDROID_external_memory_android_hardware_buffer) { result = @@ -89,14 +61,9 @@ vn_buffer_cache_init(struct vn_device *dev) return result; } - if (!VN_PERF(NO_ASYNC_BUFFER_CREATE)) { - result = vn_buffer_get_max_buffer_size(dev, &max_buffer_size); - if (result != VK_SUCCESS) - return result; - } - dev->buffer_cache.ahb_mem_type_bits = ahb_mem_type_bits; - dev->buffer_cache.max_buffer_size = max_buffer_size; + dev->buffer_cache.max_buffer_size = + vn_buffer_get_max_buffer_size(dev->physical_device); simple_mtx_init(&dev->buffer_cache.mutex, mtx_plain); util_sparse_array_init(&dev->buffer_cache.entries,
