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:
@@ -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;
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user