From 432ffaf10a5720e6a254da64d438ae9efe0f69bb Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Wed, 28 Jun 2023 15:55:09 -0700 Subject: [PATCH] venus: refactor ahb buffer mem type bits cache to be lazy Signed-off-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_android.c | 45 +++++++++++++++------------------- src/virtio/vulkan/vn_android.h | 12 ++++----- src/virtio/vulkan/vn_buffer.c | 30 ++++++++++++----------- src/virtio/vulkan/vn_buffer.h | 7 ++++-- 4 files changed, 46 insertions(+), 48 deletions(-) diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c index 1057146f729..375b837c5bd 100644 --- a/src/virtio/vulkan/vn_android.c +++ b/src/virtio/vulkan/vn_android.c @@ -1319,41 +1319,36 @@ vn_GetMemoryAndroidHardwareBufferANDROID( return VK_SUCCESS; } -VkResult -vn_android_get_ahb_buffer_memory_type_bits(struct vn_device *dev, - uint32_t *out_mem_type_bits) +uint32_t +vn_android_get_ahb_buffer_memory_type_bits(struct vn_device *dev) { - const uint32_t format = AHARDWAREBUFFER_FORMAT_BLOB; + static const uint32_t format = AHARDWAREBUFFER_FORMAT_BLOB; /* ensure dma_buf_memory_type_bits covers host visible usage */ - const uint64_t usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER | - AHARDWAREBUFFER_USAGE_CPU_READ_RARELY | - AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY; - AHardwareBuffer *ahb = NULL; - int dma_buf_fd = -1; - uint64_t alloc_size = 0; - uint32_t mem_type_bits = 0; - VkResult result; - - ahb = vn_android_ahb_allocate(4096, 1, 1, format, usage); + static const uint64_t usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER | + AHARDWAREBUFFER_USAGE_CPU_READ_RARELY | + AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY; + AHardwareBuffer *ahb = vn_android_ahb_allocate(4096, 1, 1, format, usage); if (!ahb) - return VK_ERROR_OUT_OF_HOST_MEMORY; + return 0; - dma_buf_fd = + int dma_buf_fd = vn_android_gralloc_get_dma_buf_fd(AHardwareBuffer_getNativeHandle(ahb)); if (dma_buf_fd < 0) { AHardwareBuffer_release(ahb); - return VK_ERROR_INVALID_EXTERNAL_HANDLE; + return 0; } - result = vn_get_memory_dma_buf_properties(dev, dma_buf_fd, &alloc_size, - &mem_type_bits); - + uint64_t alloc_size = 0; + uint32_t mem_type_bits = 0; + VkResult ret = vn_get_memory_dma_buf_properties( + dev, dma_buf_fd, &alloc_size, &mem_type_bits); + /* release ahb first as below no longer needs it */ AHardwareBuffer_release(ahb); - if (result != VK_SUCCESS) - return result; + if (ret != VK_SUCCESS) { + vn_log(dev->instance, "AHB buffer mem type bits query failed %d", ret); + return 0; + } - *out_mem_type_bits = mem_type_bits; - - return VK_SUCCESS; + return mem_type_bits; } diff --git a/src/virtio/vulkan/vn_android.h b/src/virtio/vulkan/vn_android.h index 3330ae9a165..3659a3b582a 100644 --- a/src/virtio/vulkan/vn_android.h +++ b/src/virtio/vulkan/vn_android.h @@ -61,9 +61,8 @@ vn_android_release_ahb(struct AHardwareBuffer *ahb); VkFormat vn_android_drm_format_to_vk_format(uint32_t format); -VkResult -vn_android_get_ahb_buffer_memory_type_bits(struct vn_device *dev, - uint32_t *out_mem_type_bits); +uint32_t +vn_android_get_ahb_buffer_memory_type_bits(struct vn_device *dev); uint32_t vn_android_gralloc_get_shared_present_usage(void); @@ -134,11 +133,10 @@ vn_android_drm_format_to_vk_format(UNUSED uint32_t format) return VK_FORMAT_UNDEFINED; } -static inline VkResult -vn_android_get_ahb_buffer_memory_type_bits(UNUSED struct vn_device *dev, - UNUSED uint32_t *out_mem_type_bits) +static inline uint32_t +vn_android_get_ahb_buffer_memory_type_bits(UNUSED struct vn_device *dev) { - return VK_ERROR_FEATURE_NOT_PRESENT; + return 0; } static inline uint32_t diff --git a/src/virtio/vulkan/vn_buffer.c b/src/virtio/vulkan/vn_buffer.c index 2d1a387dca8..0e96c71aa0d 100644 --- a/src/virtio/vulkan/vn_buffer.c +++ b/src/virtio/vulkan/vn_buffer.c @@ -49,19 +49,6 @@ vn_buffer_get_max_buffer_size(struct vn_physical_device *physical_dev) VkResult vn_buffer_cache_init(struct vn_device *dev) { - uint32_t ahb_mem_type_bits = 0; - VkResult result; - - /* TODO lazily initialize ahb buffer cache */ - if (dev->base.base.enabled_extensions - .ANDROID_external_memory_android_hardware_buffer) { - result = - vn_android_get_ahb_buffer_memory_type_bits(dev, &ahb_mem_type_bits); - if (result != VK_SUCCESS) - return result; - } - - dev->buffer_cache.ahb_mem_type_bits = ahb_mem_type_bits; dev->buffer_cache.max_buffer_size = vn_buffer_get_max_buffer_size(dev->physical_device); @@ -91,6 +78,21 @@ vn_buffer_cache_fini(struct vn_device *dev) vn_buffer_cache_debug_dump(&dev->buffer_cache); } +static inline uint32_t +vn_buffer_get_ahb_memory_type_bits(struct vn_device *dev) +{ + struct vn_buffer_cache *cache = &dev->buffer_cache; + if (unlikely(!cache->ahb_mem_type_bits_valid)) { + simple_mtx_lock(&cache->mutex); + cache->ahb_mem_type_bits = + vn_android_get_ahb_buffer_memory_type_bits(dev); + cache->ahb_mem_type_bits_valid = true; + simple_mtx_unlock(&cache->mutex); + } + + return cache->ahb_mem_type_bits; +} + static inline VkDeviceSize vn_buffer_get_aligned_memory_requirement_size(VkDeviceSize size, const VkMemoryRequirements *req) @@ -363,7 +365,7 @@ vn_CreateBuffer(VkDevice device, * and renderer external memory properties. */ buf->requirements.memory.memoryRequirements.memoryTypeBits &= - dev->buffer_cache.ahb_mem_type_bits; + vn_buffer_get_ahb_memory_type_bits(dev); assert(buf->requirements.memory.memoryRequirements.memoryTypeBits); } diff --git a/src/virtio/vulkan/vn_buffer.h b/src/virtio/vulkan/vn_buffer.h index 82f70be439b..0ce605d2fbd 100644 --- a/src/virtio/vulkan/vn_buffer.h +++ b/src/virtio/vulkan/vn_buffer.h @@ -24,13 +24,16 @@ struct vn_buffer_cache_entry { }; struct vn_buffer_cache { + uint64_t max_buffer_size; + /* cache memory type requirement for AHB backed VkBuffer */ uint32_t ahb_mem_type_bits; - - uint64_t max_buffer_size; + atomic_bool ahb_mem_type_bits_valid; /* lazily cache memory requirements for native buffer infos */ struct util_sparse_array entries; + + /* protect both entries and ahb_mem_type_bits */ simple_mtx_t mutex; struct {