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;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
VkResult
|
uint32_t
|
||||||
vn_android_get_ahb_buffer_memory_type_bits(struct vn_device *dev,
|
vn_android_get_ahb_buffer_memory_type_bits(struct vn_device *dev)
|
||||||
uint32_t *out_mem_type_bits)
|
|
||||||
{
|
{
|
||||||
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 */
|
/* ensure dma_buf_memory_type_bits covers host visible usage */
|
||||||
const uint64_t usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER |
|
static const uint64_t usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER |
|
||||||
AHARDWAREBUFFER_USAGE_CPU_READ_RARELY |
|
AHARDWAREBUFFER_USAGE_CPU_READ_RARELY |
|
||||||
AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY;
|
AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY;
|
||||||
AHardwareBuffer *ahb = NULL;
|
AHardwareBuffer *ahb = vn_android_ahb_allocate(4096, 1, 1, format, usage);
|
||||||
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);
|
|
||||||
if (!ahb)
|
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));
|
vn_android_gralloc_get_dma_buf_fd(AHardwareBuffer_getNativeHandle(ahb));
|
||||||
if (dma_buf_fd < 0) {
|
if (dma_buf_fd < 0) {
|
||||||
AHardwareBuffer_release(ahb);
|
AHardwareBuffer_release(ahb);
|
||||||
return VK_ERROR_INVALID_EXTERNAL_HANDLE;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = vn_get_memory_dma_buf_properties(dev, dma_buf_fd, &alloc_size,
|
uint64_t alloc_size = 0;
|
||||||
&mem_type_bits);
|
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);
|
AHardwareBuffer_release(ahb);
|
||||||
|
|
||||||
if (result != VK_SUCCESS)
|
if (ret != VK_SUCCESS) {
|
||||||
return result;
|
vn_log(dev->instance, "AHB buffer mem type bits query failed %d", ret);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
*out_mem_type_bits = mem_type_bits;
|
return mem_type_bits;
|
||||||
|
|
||||||
return VK_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
@@ -61,9 +61,8 @@ vn_android_release_ahb(struct AHardwareBuffer *ahb);
|
|||||||
VkFormat
|
VkFormat
|
||||||
vn_android_drm_format_to_vk_format(uint32_t format);
|
vn_android_drm_format_to_vk_format(uint32_t format);
|
||||||
|
|
||||||
VkResult
|
uint32_t
|
||||||
vn_android_get_ahb_buffer_memory_type_bits(struct vn_device *dev,
|
vn_android_get_ahb_buffer_memory_type_bits(struct vn_device *dev);
|
||||||
uint32_t *out_mem_type_bits);
|
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
vn_android_gralloc_get_shared_present_usage(void);
|
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;
|
return VK_FORMAT_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline VkResult
|
static inline uint32_t
|
||||||
vn_android_get_ahb_buffer_memory_type_bits(UNUSED struct vn_device *dev,
|
vn_android_get_ahb_buffer_memory_type_bits(UNUSED struct vn_device *dev)
|
||||||
UNUSED uint32_t *out_mem_type_bits)
|
|
||||||
{
|
{
|
||||||
return VK_ERROR_FEATURE_NOT_PRESENT;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t
|
static inline uint32_t
|
||||||
|
@@ -49,19 +49,6 @@ vn_buffer_get_max_buffer_size(struct vn_physical_device *physical_dev)
|
|||||||
VkResult
|
VkResult
|
||||||
vn_buffer_cache_init(struct vn_device *dev)
|
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 =
|
dev->buffer_cache.max_buffer_size =
|
||||||
vn_buffer_get_max_buffer_size(dev->physical_device);
|
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);
|
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
|
static inline VkDeviceSize
|
||||||
vn_buffer_get_aligned_memory_requirement_size(VkDeviceSize size,
|
vn_buffer_get_aligned_memory_requirement_size(VkDeviceSize size,
|
||||||
const VkMemoryRequirements *req)
|
const VkMemoryRequirements *req)
|
||||||
@@ -363,7 +365,7 @@ vn_CreateBuffer(VkDevice device,
|
|||||||
* and renderer external memory properties.
|
* and renderer external memory properties.
|
||||||
*/
|
*/
|
||||||
buf->requirements.memory.memoryRequirements.memoryTypeBits &=
|
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);
|
assert(buf->requirements.memory.memoryRequirements.memoryTypeBits);
|
||||||
}
|
}
|
||||||
|
@@ -24,13 +24,16 @@ struct vn_buffer_cache_entry {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct vn_buffer_cache {
|
struct vn_buffer_cache {
|
||||||
|
uint64_t max_buffer_size;
|
||||||
|
|
||||||
/* cache memory type requirement for AHB backed VkBuffer */
|
/* cache memory type requirement for AHB backed VkBuffer */
|
||||||
uint32_t ahb_mem_type_bits;
|
uint32_t ahb_mem_type_bits;
|
||||||
|
atomic_bool ahb_mem_type_bits_valid;
|
||||||
uint64_t max_buffer_size;
|
|
||||||
|
|
||||||
/* lazily cache memory requirements for native buffer infos */
|
/* lazily cache memory requirements for native buffer infos */
|
||||||
struct util_sparse_array entries;
|
struct util_sparse_array entries;
|
||||||
|
|
||||||
|
/* protect both entries and ahb_mem_type_bits */
|
||||||
simple_mtx_t mutex;
|
simple_mtx_t mutex;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
Reference in New Issue
Block a user