anv: handle errors while allocating new binding table blocks
Also, we had a couple of instances in flush_descriptor_sets() were we were returning a VkResult directly upon error, but the return value of this function is not a VkResult but a uint32_t dirty mask, so simply return 0 in these cases which reduces the amount of work the driver will do after the error has been raised. Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
This commit is contained in:
@@ -665,8 +665,10 @@ anv_cmd_buffer_new_binding_table_block(struct anv_cmd_buffer *cmd_buffer)
|
||||
&cmd_buffer->device->surface_state_block_pool;
|
||||
|
||||
int32_t *offset = u_vector_add(&cmd_buffer->bt_blocks);
|
||||
if (offset == NULL)
|
||||
if (offset == NULL) {
|
||||
anv_batch_set_error(&cmd_buffer->batch, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||
}
|
||||
|
||||
*offset = anv_block_pool_alloc_back(block_pool);
|
||||
cmd_buffer->bt_next = 0;
|
||||
@@ -719,7 +721,9 @@ anv_cmd_buffer_init_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer)
|
||||
goto fail_bt_blocks;
|
||||
cmd_buffer->last_ss_pool_center = 0;
|
||||
|
||||
anv_cmd_buffer_new_binding_table_block(cmd_buffer);
|
||||
result = anv_cmd_buffer_new_binding_table_block(cmd_buffer);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail_bt_blocks;
|
||||
|
||||
return VK_SUCCESS;
|
||||
|
||||
|
@@ -1376,7 +1376,8 @@ flush_descriptor_sets(struct anv_cmd_buffer *cmd_buffer)
|
||||
assert(result == VK_ERROR_OUT_OF_DEVICE_MEMORY);
|
||||
|
||||
result = anv_cmd_buffer_new_binding_table_block(cmd_buffer);
|
||||
assert(result == VK_SUCCESS);
|
||||
if (result != VK_SUCCESS)
|
||||
return 0;
|
||||
|
||||
/* Re-emit state base addresses so we get the new surface state base
|
||||
* address before we start emitting binding tables etc.
|
||||
@@ -1388,11 +1389,11 @@ flush_descriptor_sets(struct anv_cmd_buffer *cmd_buffer)
|
||||
anv_foreach_stage(s, dirty) {
|
||||
result = emit_samplers(cmd_buffer, s, &cmd_buffer->state.samplers[s]);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
return 0;
|
||||
result = emit_binding_table(cmd_buffer, s,
|
||||
&cmd_buffer->state.binding_tables[s]);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1847,8 +1848,10 @@ flush_compute_descriptor_set(struct anv_cmd_buffer *cmd_buffer)
|
||||
result = emit_binding_table(cmd_buffer, MESA_SHADER_COMPUTE, &surfaces);
|
||||
if (result != VK_SUCCESS) {
|
||||
assert(result == VK_ERROR_OUT_OF_DEVICE_MEMORY);
|
||||
|
||||
result = anv_cmd_buffer_new_binding_table_block(cmd_buffer);
|
||||
assert(result == VK_SUCCESS);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
|
||||
/* Re-emit state base addresses so we get the new surface state base
|
||||
* address before we start emitting binding tables etc.
|
||||
|
Reference in New Issue
Block a user