radv/winsys: Distinguish device/host memory errors.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5578>
This commit is contained in:
Bas Nieuwenhuizen
2020-06-21 19:36:16 +02:00
committed by Marge Bot
parent a5cb88eea4
commit 64a92ef7a2
4 changed files with 20 additions and 17 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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)