mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-20 05:40:39 +02:00
venus: use vk_device_memory tracked memory_type_index
Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25184>
This commit is contained in:
parent
99b716c64d
commit
38deb97d10
2 changed files with 22 additions and 29 deletions
|
|
@ -80,8 +80,10 @@ vn_device_memory_bo_init(struct vn_device *dev, struct vn_device_memory *mem)
|
|||
return result;
|
||||
|
||||
const struct vk_device_memory *mem_vk = &mem->base.base;
|
||||
const VkMemoryType *mem_type = &dev->physical_device->memory_properties
|
||||
.memoryTypes[mem_vk->memory_type_index];
|
||||
return vn_renderer_bo_create_from_device_memory(
|
||||
dev->renderer, mem_vk->size, mem->base.id, mem->type.propertyFlags,
|
||||
dev->renderer, mem_vk->size, mem->base.id, mem_type->propertyFlags,
|
||||
mem_vk->export_handle_types, &mem->base_bo);
|
||||
}
|
||||
|
||||
|
|
@ -112,9 +114,6 @@ vn_device_memory_pool_grow_alloc(struct vn_device *dev,
|
|||
|
||||
vn_object_set_id(mem, (uintptr_t)mem, VK_OBJECT_TYPE_DEVICE_MEMORY);
|
||||
|
||||
mem->type =
|
||||
dev->physical_device->memory_properties.memoryTypes[mem_type_index];
|
||||
|
||||
VkResult result = vn_device_memory_alloc_simple(dev, mem, &alloc_info);
|
||||
if (result != VK_SUCCESS)
|
||||
goto obj_fini;
|
||||
|
|
@ -202,8 +201,7 @@ vn_device_memory_pool_grow_locked(struct vn_device *dev,
|
|||
|
||||
static VkResult
|
||||
vn_device_memory_pool_suballocate(struct vn_device *dev,
|
||||
struct vn_device_memory *mem,
|
||||
uint32_t mem_type_index)
|
||||
struct vn_device_memory *mem)
|
||||
{
|
||||
static const VkDeviceSize pool_size = 16 * 1024 * 1024;
|
||||
/* TODO fix https://gitlab.freedesktop.org/mesa/mesa/-/issues/9351
|
||||
|
|
@ -215,15 +213,16 @@ vn_device_memory_pool_suballocate(struct vn_device *dev,
|
|||
VK_DRIVER_ID_ARM_PROPRIETARY;
|
||||
const VkDeviceSize pool_align = is_renderer_mali ? 4096 : 64 * 1024;
|
||||
const struct vk_device_memory *mem_vk = &mem->base.base;
|
||||
struct vn_device_memory_pool *pool = &dev->memory_pools[mem_type_index];
|
||||
struct vn_device_memory_pool *pool =
|
||||
&dev->memory_pools[mem_vk->memory_type_index];
|
||||
|
||||
assert(mem_vk->size <= pool_size);
|
||||
|
||||
mtx_lock(&pool->mutex);
|
||||
|
||||
if (!pool->memory || pool->used + mem_vk->size > pool_size) {
|
||||
VkResult result =
|
||||
vn_device_memory_pool_grow_locked(dev, mem_type_index, pool_size);
|
||||
VkResult result = vn_device_memory_pool_grow_locked(
|
||||
dev, mem_vk->memory_type_index, pool_size);
|
||||
if (result != VK_SUCCESS) {
|
||||
mtx_unlock(&pool->mutex);
|
||||
return result;
|
||||
|
|
@ -244,16 +243,12 @@ vn_device_memory_pool_suballocate(struct vn_device *dev,
|
|||
|
||||
static bool
|
||||
vn_device_memory_should_suballocate(const struct vn_device *dev,
|
||||
const VkMemoryAllocateInfo *alloc_info,
|
||||
const VkMemoryPropertyFlags flags)
|
||||
const VkMemoryAllocateInfo *alloc_info)
|
||||
{
|
||||
const struct vn_instance *instance = dev->physical_device->instance;
|
||||
const struct vn_renderer_info *renderer = &instance->renderer->info;
|
||||
|
||||
if (VN_PERF(NO_MEMORY_SUBALLOC))
|
||||
return false;
|
||||
|
||||
if (renderer->has_guest_vram)
|
||||
if (dev->renderer->info.has_guest_vram)
|
||||
return false;
|
||||
|
||||
/* We should not support suballocations because apps can do better. But
|
||||
|
|
@ -263,7 +258,10 @@ vn_device_memory_should_suballocate(const struct vn_device *dev,
|
|||
*/
|
||||
|
||||
/* consider host-visible memory only */
|
||||
if (!(flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT))
|
||||
const VkMemoryType *mem_type =
|
||||
&dev->physical_device->memory_properties
|
||||
.memoryTypes[alloc_info->memoryTypeIndex];
|
||||
if (!(mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT))
|
||||
return false;
|
||||
|
||||
/* reject larger allocations */
|
||||
|
|
@ -346,9 +344,11 @@ vn_device_memory_alloc_guest_vram(struct vn_device *dev,
|
|||
const VkMemoryAllocateInfo *alloc_info)
|
||||
{
|
||||
const struct vk_device_memory *mem_vk = &mem->base.base;
|
||||
const VkMemoryType *mem_type = &dev->physical_device->memory_properties
|
||||
.memoryTypes[mem_vk->memory_type_index];
|
||||
|
||||
VkResult result = vn_renderer_bo_create_from_device_memory(
|
||||
dev->renderer, mem_vk->size, 0, mem->type.propertyFlags,
|
||||
dev->renderer, mem_vk->size, 0, mem_type->propertyFlags,
|
||||
mem_vk->export_handle_types, &mem->base_bo);
|
||||
if (result != VK_SUCCESS) {
|
||||
return result;
|
||||
|
|
@ -518,9 +518,11 @@ vn_device_memory_emit_report(struct vn_device *dev,
|
|||
(mem_vk->import_handle_type | mem_vk->export_handle_types)
|
||||
? mem->base_bo->res_id
|
||||
: mem->base.id;
|
||||
const VkMemoryType *mem_type = &dev->physical_device->memory_properties
|
||||
.memoryTypes[mem_vk->memory_type_index];
|
||||
vn_device_emit_device_memory_report(dev, type, mem_obj_id, mem_vk->size,
|
||||
VK_OBJECT_TYPE_DEVICE_MEMORY,
|
||||
mem->base.id, mem->type.heapIndex);
|
||||
mem->base.id, mem_type->heapIndex);
|
||||
}
|
||||
|
||||
VkResult
|
||||
|
|
@ -563,19 +565,14 @@ vn_AllocateMemory(VkDevice device,
|
|||
|
||||
vn_object_set_id(mem, (uintptr_t)mem, VK_OBJECT_TYPE_DEVICE_MEMORY);
|
||||
|
||||
mem->type = dev->physical_device->memory_properties
|
||||
.memoryTypes[pAllocateInfo->memoryTypeIndex];
|
||||
|
||||
VkResult result;
|
||||
if (mem->base.base.ahardware_buffer) {
|
||||
result = vn_android_device_import_ahb(dev, mem, dedicated_info);
|
||||
} else if (import_fd_info) {
|
||||
result = vn_device_memory_import_dma_buf(dev, mem, pAllocateInfo, false,
|
||||
import_fd_info->fd);
|
||||
} else if (vn_device_memory_should_suballocate(dev, pAllocateInfo,
|
||||
mem->type.propertyFlags)) {
|
||||
result = vn_device_memory_pool_suballocate(
|
||||
dev, mem, pAllocateInfo->memoryTypeIndex);
|
||||
} else if (vn_device_memory_should_suballocate(dev, pAllocateInfo)) {
|
||||
result = vn_device_memory_pool_suballocate(dev, mem);
|
||||
} else {
|
||||
result = vn_device_memory_alloc(dev, mem, pAllocateInfo);
|
||||
}
|
||||
|
|
@ -649,8 +646,6 @@ vn_MapMemory(VkDevice device,
|
|||
void *ptr = NULL;
|
||||
VkResult result;
|
||||
|
||||
assert(mem->type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
|
||||
|
||||
/* We don't want to blindly create a bo for each HOST_VISIBLE memory as
|
||||
* that has a cost. By deferring bo creation until now, we can avoid the
|
||||
* cost unless a bo is really needed. However, that means
|
||||
|
|
|
|||
|
|
@ -22,8 +22,6 @@ struct vn_device_memory_pool {
|
|||
struct vn_device_memory {
|
||||
struct vn_device_memory_base base;
|
||||
|
||||
VkMemoryType type;
|
||||
|
||||
/* non-NULL when suballocated */
|
||||
struct vn_device_memory *base_memory;
|
||||
/* non-NULL when mappable or external */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue