Mesa (master): radv/winsys: Distinguish device/host memory errors.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 24 13:08:49 UTC 2020


Module: Mesa
Branch: master
Commit: 64a92ef7a26d33ca193a8a9eb5c00e2765a01837
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=64a92ef7a26d33ca193a8a9eb5c00e2765a01837

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Sun Jun 21 19:36:16 2020 +0200

radv/winsys: Distinguish device/host memory errors.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5578>

---

 src/amd/vulkan/radv_cmd_buffer.c              |  5 +++--
 src/amd/vulkan/radv_radeon_winsys.h           |  2 +-
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 26 ++++++++++++++------------
 src/amd/vulkan/winsys/null/radv_null_cs.c     |  4 ++--
 4 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index afc90b74f7d..247029cb701 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -3786,8 +3786,9 @@ VkResult radv_EndCommandBuffer(
 	vk_free(&cmd_buffer->pool->alloc, cmd_buffer->state.attachments);
 	vk_free(&cmd_buffer->pool->alloc, cmd_buffer->state.subpass_sample_locs);
 
-	if (!cmd_buffer->device->ws->cs_finalize(cmd_buffer->cs))
-		return vk_error(cmd_buffer->device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY);
+	VkResult result = cmd_buffer->device->ws->cs_finalize(cmd_buffer->cs);
+	if (result != VK_SUCCESS)
+		return vk_error(cmd_buffer->device->instance, result);
 
 	cmd_buffer->status = RADV_CMD_BUFFER_STATUS_EXECUTABLE;
 
diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h
index fc6ec2594b4..802dbdb1783 100644
--- a/src/amd/vulkan/radv_radeon_winsys.h
+++ b/src/amd/vulkan/radv_radeon_winsys.h
@@ -273,7 +273,7 @@ struct radeon_winsys {
 
 	void (*cs_reset)(struct radeon_cmdbuf *cs);
 
-	bool (*cs_finalize)(struct radeon_cmdbuf *cs);
+	VkResult (*cs_finalize)(struct radeon_cmdbuf *cs);
 
 	void (*cs_grow)(struct radeon_cmdbuf * cs, size_t min_size);
 
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
index fca2e53aa8a..65b6bb4187d 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -57,7 +57,7 @@ struct radv_amdgpu_cs {
 	unsigned                    num_old_ib_buffers;
 	unsigned                    max_num_old_ib_buffers;
 	unsigned                    *ib_size_ptr;
-	bool                        failed;
+	VkResult                    status;
 	bool                        is_chained;
 
 	int                         buffer_hash_table[1024];
@@ -361,7 +361,7 @@ static void radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size)
 {
 	struct radv_amdgpu_cs *cs = radv_amdgpu_cs(_cs);
 
-	if (cs->failed) {
+	if (cs->status != VK_SUCCESS) {
 		cs->base.cdw = 0;
 		return;
 	}
@@ -381,7 +381,7 @@ static void radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size)
 				realloc(cs->old_cs_buffers,
 				        (cs->num_old_cs_buffers + 1) * sizeof(*cs->old_cs_buffers));
 			if (!cs->old_cs_buffers) {
-				cs->failed = true;
+				cs->status = VK_ERROR_OUT_OF_HOST_MEMORY;
 				cs->base.cdw = 0;
 				return;
 			}
@@ -402,7 +402,7 @@ static void radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size)
 			if (ib_dws > limit_dws) {
 				fprintf(stderr, "amdgpu: Too high number of "
 						"dwords to allocate\n");
-				cs->failed = true;
+				cs->status = VK_ERROR_OUT_OF_HOST_MEMORY;
 				return;
 			}
 		}
@@ -412,7 +412,7 @@ static void radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size)
 			cs->base.buf = new_buf;
 			cs->base.max_dw = ib_dws;
 		} else {
-			cs->failed = true;
+			cs->status = VK_ERROR_OUT_OF_HOST_MEMORY;
 			cs->base.cdw = 0;
 		}
 		return;
@@ -445,7 +445,7 @@ static void radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size)
 
 	if (!cs->ib_buffer) {
 		cs->base.cdw = 0;
-		cs->failed = true;
+		cs->status = VK_ERROR_OUT_OF_DEVICE_MEMORY;
 		cs->ib_buffer = cs->old_ib_buffers[--cs->num_old_ib_buffers];
 	}
 
@@ -453,7 +453,9 @@ static void radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size)
 	if (!cs->ib_mapped) {
 		cs->ws->base.buffer_destroy(cs->ib_buffer);
 		cs->base.cdw = 0;
-		cs->failed = true;
+
+		/* VK_ERROR_MEMORY_MAP_FAILED is not valid for vkEndCommandBuffer. */
+		cs->status = VK_ERROR_OUT_OF_DEVICE_MEMORY;
 		cs->ib_buffer = cs->old_ib_buffers[--cs->num_old_ib_buffers];
 	}
 
@@ -472,7 +474,7 @@ static void radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size)
 
 }
 
-static bool radv_amdgpu_cs_finalize(struct radeon_cmdbuf *_cs)
+static VkResult radv_amdgpu_cs_finalize(struct radeon_cmdbuf *_cs)
 {
 	struct radv_amdgpu_cs *cs = radv_amdgpu_cs(_cs);
 
@@ -485,14 +487,14 @@ static bool radv_amdgpu_cs_finalize(struct radeon_cmdbuf *_cs)
 		cs->is_chained = false;
 	}
 
-	return !cs->failed;
+	return cs->status;
 }
 
 static void radv_amdgpu_cs_reset(struct radeon_cmdbuf *_cs)
 {
 	struct radv_amdgpu_cs *cs = radv_amdgpu_cs(_cs);
 	cs->base.cdw = 0;
-	cs->failed = false;
+	cs->status = VK_SUCCESS;
 
 	for (unsigned i = 0; i < cs->num_buffers; ++i) {
 		unsigned hash = cs->handles[i].bo_handle &
@@ -558,7 +560,7 @@ static void radv_amdgpu_cs_add_buffer_internal(struct radv_amdgpu_cs *cs,
 	unsigned hash;
 	int index = radv_amdgpu_cs_find_buffer(cs, bo);
 
-	if (index != -1 || cs->failed)
+	if (index != -1 || cs->status != VK_SUCCESS)
 		return;
 
 	if (cs->num_buffers == cs->max_num_buffers) {
@@ -569,7 +571,7 @@ static void radv_amdgpu_cs_add_buffer_internal(struct radv_amdgpu_cs *cs,
 			cs->max_num_buffers = new_count;
 			cs->handles = new_entries;
 		} else {
-			cs->failed = true;
+			cs->status = VK_ERROR_OUT_OF_HOST_MEMORY;
 			return;
 		}
 	}
diff --git a/src/amd/vulkan/winsys/null/radv_null_cs.c b/src/amd/vulkan/winsys/null/radv_null_cs.c
index f549357e694..5788cbf92cb 100644
--- a/src/amd/vulkan/winsys/null/radv_null_cs.c
+++ b/src/amd/vulkan/winsys/null/radv_null_cs.c
@@ -78,9 +78,9 @@ radv_null_cs_create(struct radeon_winsys *ws,
 	return &cs->base;
 }
 
-static bool radv_null_cs_finalize(struct radeon_cmdbuf *_cs)
+static VkResult radv_null_cs_finalize(struct radeon_cmdbuf *_cs)
 {
-	return true;
+	return VK_SUCCESS;
 }
 
 static void radv_null_cs_destroy(struct radeon_cmdbuf *rcs)



More information about the mesa-commit mailing list