venus: refactor ahb buffer mem type bits cache to be lazy

Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23916>
This commit is contained in:
Yiwei Zhang
2023-06-28 15:55:09 -07:00
committed by Marge Bot
parent eaab20c58f
commit 432ffaf10a
4 changed files with 46 additions and 48 deletions

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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 {