Module: Mesa Branch: master Commit: 4f7d4871a6f85ef51c3660bf673426a820c4e1c6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4f7d4871a6f85ef51c3660bf673426a820c4e1c6
Author: Iago Toral Quiroga <[email protected]> Date: Tue Dec 1 11:52:28 2020 +0100 v3dv: don't log out of pool memory errors for internal driver pools Reviewed-by: Alejandro PiƱeiro <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7848> --- src/broadcom/vulkan/v3dv_descriptor_set.c | 21 +++++++++++++++++---- src/broadcom/vulkan/v3dv_meta_copy.c | 16 ++++++++++++++-- src/broadcom/vulkan/v3dv_private.h | 5 +++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_descriptor_set.c b/src/broadcom/vulkan/v3dv_descriptor_set.c index af232b97821..1cf09f35248 100644 --- a/src/broadcom/vulkan/v3dv_descriptor_set.c +++ b/src/broadcom/vulkan/v3dv_descriptor_set.c @@ -744,6 +744,19 @@ v3dv_DestroyDescriptorSetLayout(VkDevice _device, vk_object_free(&device->vk, pAllocator, set_layout); } +static inline VkResult +out_of_pool_memory(const struct v3dv_device *device, + const struct v3dv_descriptor_pool *pool) +{ + /* Don't log OOPM errors for internal driver pools, we handle these properly + * by allocating a new pool, so they don't point to real issues. + */ + if (!pool->is_driver_internal) + return vk_error(device->instance, VK_ERROR_OUT_OF_POOL_MEMORY) + else + return VK_ERROR_OUT_OF_POOL_MEMORY; +} + static VkResult descriptor_set_create(struct v3dv_device *device, struct v3dv_descriptor_pool *pool, @@ -757,7 +770,7 @@ descriptor_set_create(struct v3dv_device *device, if (pool->host_memory_base) { if (pool->host_memory_end - pool->host_memory_ptr < mem_size) - return vk_error(device->instance, VK_ERROR_OUT_OF_POOL_MEMORY); + return out_of_pool_memory(device, pool); set = (struct v3dv_descriptor_set*)pool->host_memory_ptr; pool->host_memory_ptr += mem_size; @@ -786,7 +799,7 @@ descriptor_set_create(struct v3dv_device *device, if (layout->bo_size) { if (!pool->host_memory_base && pool->entry_count == pool->max_entry_count) { vk_object_free(&device->vk, NULL, set); - return vk_error(device->instance, VK_ERROR_OUT_OF_POOL_MEMORY); + return out_of_pool_memory(device, pool); } /* We first try to allocate linearly fist, so that we don't spend time @@ -810,14 +823,14 @@ descriptor_set_create(struct v3dv_device *device, } if (pool->bo->size - offset < layout->bo_size) { vk_object_free(&device->vk, NULL, set); - return vk_error(device->instance, VK_ERROR_OUT_OF_POOL_MEMORY); + return out_of_pool_memory(device, pool); } memmove(&pool->entries[index + 1], &pool->entries[index], sizeof(pool->entries[0]) * (pool->entry_count - index)); } else { assert(pool->host_memory_base); vk_object_free(&device->vk, NULL, set); - return vk_error(device->instance, VK_ERROR_OUT_OF_POOL_MEMORY); + return out_of_pool_memory(device, pool); } set->base_offset = offset; diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c index 7ec0a108fc9..cb411d8194e 100644 --- a/src/broadcom/vulkan/v3dv_meta_copy.c +++ b/src/broadcom/vulkan/v3dv_meta_copy.c @@ -2913,9 +2913,15 @@ create_texel_buffer_copy_descriptor_pool(struct v3dv_cmd_buffer *cmd_buffer) if (result == VK_SUCCESS) { assert(cmd_buffer->meta.texel_buffer_copy.dspool != VK_NULL_HANDLE); + const VkDescriptorPool _pool = cmd_buffer->meta.texel_buffer_copy.dspool; + v3dv_cmd_buffer_add_private_obj( - cmd_buffer, (uintptr_t)cmd_buffer->meta.texel_buffer_copy.dspool, + cmd_buffer, (uintptr_t) _pool, (v3dv_cmd_buffer_private_obj_destroy_cb)v3dv_DestroyDescriptorPool); + + struct v3dv_descriptor_pool *pool = + v3dv_descriptor_pool_from_handle(_pool); + pool->is_driver_internal = true; } return result; @@ -4946,9 +4952,15 @@ create_blit_descriptor_pool(struct v3dv_cmd_buffer *cmd_buffer) if (result == VK_SUCCESS) { assert(cmd_buffer->meta.blit.dspool != VK_NULL_HANDLE); + const VkDescriptorPool _pool = cmd_buffer->meta.blit.dspool; + v3dv_cmd_buffer_add_private_obj( - cmd_buffer, (uintptr_t)cmd_buffer->meta.blit.dspool, + cmd_buffer, (uintptr_t) _pool, (v3dv_cmd_buffer_private_obj_destroy_cb)v3dv_DestroyDescriptorPool); + + struct v3dv_descriptor_pool *pool = + v3dv_descriptor_pool_from_handle(_pool); + pool->is_driver_internal = true; } return result; diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index a88a8872095..3d806d6d4a1 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -1450,6 +1450,11 @@ struct v3dv_descriptor_pool_entry struct v3dv_descriptor_pool { struct vk_object_base base; + /* If this descriptor pool has been allocated for the driver for internal + * use, typically to implement meta operations. + */ + bool is_driver_internal; + struct v3dv_bo *bo; /* Current offset at the descriptor bo. 0 means that we didn't use it for * any descriptor. If the descriptor bo is NULL, current offset is _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
