Mesa (master): v3dv: don't log out of pool memory errors for internal driver pools
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Dec 1 12:17:55 UTC 2020
Module: Mesa
Branch: master
Commit: 4f7d4871a6f85ef51c3660bf673426a820c4e1c6
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4f7d4871a6f85ef51c3660bf673426a820c4e1c6
Author: Iago Toral Quiroga <itoral at igalia.com>
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 <apinheiro at igalia.com>
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
More information about the mesa-commit
mailing list