anv/blorp: make anv_cmd_buffer_alloc_blorp_binding_table() return a VkResult
Instead of asserting inside the function, and then use use that information to return early from its callers upon failure. v2: - Make sure that clear_color_attachment() and clear_depth_stencil_attachment() get the VkResult as well so they avoid executing the batch if an error happened. (Topi) Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
This commit is contained in:
@@ -912,45 +912,52 @@ void anv_CmdClearDepthStencilImage(
|
|||||||
blorp_batch_finish(&batch);
|
blorp_batch_finish(&batch);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct anv_state
|
VkResult
|
||||||
anv_cmd_buffer_alloc_blorp_binding_table(struct anv_cmd_buffer *cmd_buffer,
|
anv_cmd_buffer_alloc_blorp_binding_table(struct anv_cmd_buffer *cmd_buffer,
|
||||||
uint32_t num_entries,
|
uint32_t num_entries,
|
||||||
uint32_t *state_offset)
|
uint32_t *state_offset,
|
||||||
|
struct anv_state *bt_state)
|
||||||
{
|
{
|
||||||
struct anv_state bt_state =
|
*bt_state = anv_cmd_buffer_alloc_binding_table(cmd_buffer, num_entries,
|
||||||
anv_cmd_buffer_alloc_binding_table(cmd_buffer, num_entries,
|
state_offset);
|
||||||
state_offset);
|
if (bt_state->map == NULL) {
|
||||||
if (bt_state.map == NULL) {
|
|
||||||
/* We ran out of space. Grab a new binding table block. */
|
/* We ran out of space. Grab a new binding table block. */
|
||||||
MAYBE_UNUSED VkResult result =
|
VkResult result = anv_cmd_buffer_new_binding_table_block(cmd_buffer);
|
||||||
anv_cmd_buffer_new_binding_table_block(cmd_buffer);
|
if (result != VK_SUCCESS)
|
||||||
assert(result == VK_SUCCESS);
|
return result;
|
||||||
|
|
||||||
/* Re-emit state base addresses so we get the new surface state base
|
/* Re-emit state base addresses so we get the new surface state base
|
||||||
* address before we start emitting binding tables etc.
|
* address before we start emitting binding tables etc.
|
||||||
*/
|
*/
|
||||||
anv_cmd_buffer_emit_state_base_address(cmd_buffer);
|
anv_cmd_buffer_emit_state_base_address(cmd_buffer);
|
||||||
|
|
||||||
bt_state = anv_cmd_buffer_alloc_binding_table(cmd_buffer, num_entries,
|
*bt_state = anv_cmd_buffer_alloc_binding_table(cmd_buffer, num_entries,
|
||||||
state_offset);
|
state_offset);
|
||||||
assert(bt_state.map != NULL);
|
assert(bt_state->map != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return bt_state;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t
|
static VkResult
|
||||||
binding_table_for_surface_state(struct anv_cmd_buffer *cmd_buffer,
|
binding_table_for_surface_state(struct anv_cmd_buffer *cmd_buffer,
|
||||||
struct anv_state surface_state)
|
struct anv_state surface_state,
|
||||||
|
uint32_t *bt_offset)
|
||||||
{
|
{
|
||||||
uint32_t state_offset;
|
uint32_t state_offset;
|
||||||
struct anv_state bt_state =
|
struct anv_state bt_state;
|
||||||
anv_cmd_buffer_alloc_blorp_binding_table(cmd_buffer, 1, &state_offset);
|
|
||||||
|
VkResult result =
|
||||||
|
anv_cmd_buffer_alloc_blorp_binding_table(cmd_buffer, 1, &state_offset,
|
||||||
|
&bt_state);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
return result;
|
||||||
|
|
||||||
uint32_t *bt_map = bt_state.map;
|
uint32_t *bt_map = bt_state.map;
|
||||||
bt_map[0] = surface_state.offset + state_offset;
|
bt_map[0] = surface_state.offset + state_offset;
|
||||||
|
|
||||||
return bt_state.offset;
|
*bt_offset = bt_state.offset;
|
||||||
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -971,8 +978,12 @@ clear_color_attachment(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
struct anv_attachment_state *att_state =
|
struct anv_attachment_state *att_state =
|
||||||
&cmd_buffer->state.attachments[att_idx];
|
&cmd_buffer->state.attachments[att_idx];
|
||||||
|
|
||||||
uint32_t binding_table =
|
uint32_t binding_table;
|
||||||
binding_table_for_surface_state(cmd_buffer, att_state->color_rt_state);
|
VkResult result =
|
||||||
|
binding_table_for_surface_state(cmd_buffer, att_state->color_rt_state,
|
||||||
|
&binding_table);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
return;
|
||||||
|
|
||||||
union isl_color_value clear_color =
|
union isl_color_value clear_color =
|
||||||
vk_to_isl_color(attachment->clearValue.color);
|
vk_to_isl_color(attachment->clearValue.color);
|
||||||
@@ -1017,9 +1028,13 @@ clear_depth_stencil_attachment(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
VK_IMAGE_TILING_OPTIMAL);
|
VK_IMAGE_TILING_OPTIMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t binding_table =
|
uint32_t binding_table;
|
||||||
|
VkResult result =
|
||||||
binding_table_for_surface_state(cmd_buffer,
|
binding_table_for_surface_state(cmd_buffer,
|
||||||
cmd_buffer->state.null_surface_state);
|
cmd_buffer->state.null_surface_state,
|
||||||
|
&binding_table);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
return;
|
||||||
|
|
||||||
for (uint32_t r = 0; r < rectCount; ++r) {
|
for (uint32_t r = 0; r < rectCount; ++r) {
|
||||||
const VkOffset2D offset = pRects[r].rect.offset;
|
const VkOffset2D offset = pRects[r].rect.offset;
|
||||||
|
@@ -1476,10 +1476,11 @@ void anv_cmd_buffer_resolve_subpass(struct anv_cmd_buffer *cmd_buffer);
|
|||||||
const struct anv_image_view *
|
const struct anv_image_view *
|
||||||
anv_cmd_buffer_get_depth_stencil_view(const struct anv_cmd_buffer *cmd_buffer);
|
anv_cmd_buffer_get_depth_stencil_view(const struct anv_cmd_buffer *cmd_buffer);
|
||||||
|
|
||||||
struct anv_state
|
VkResult
|
||||||
anv_cmd_buffer_alloc_blorp_binding_table(struct anv_cmd_buffer *cmd_buffer,
|
anv_cmd_buffer_alloc_blorp_binding_table(struct anv_cmd_buffer *cmd_buffer,
|
||||||
uint32_t num_entries,
|
uint32_t num_entries,
|
||||||
uint32_t *state_offset);
|
uint32_t *state_offset,
|
||||||
|
struct anv_state *bt_state);
|
||||||
|
|
||||||
void anv_cmd_buffer_dump(struct anv_cmd_buffer *cmd_buffer);
|
void anv_cmd_buffer_dump(struct anv_cmd_buffer *cmd_buffer);
|
||||||
|
|
||||||
|
@@ -89,9 +89,13 @@ blorp_alloc_binding_table(struct blorp_batch *batch, unsigned num_entries,
|
|||||||
struct anv_cmd_buffer *cmd_buffer = batch->driver_batch;
|
struct anv_cmd_buffer *cmd_buffer = batch->driver_batch;
|
||||||
|
|
||||||
uint32_t state_offset;
|
uint32_t state_offset;
|
||||||
struct anv_state bt_state =
|
struct anv_state bt_state;
|
||||||
|
|
||||||
|
VkResult result =
|
||||||
anv_cmd_buffer_alloc_blorp_binding_table(cmd_buffer, num_entries,
|
anv_cmd_buffer_alloc_blorp_binding_table(cmd_buffer, num_entries,
|
||||||
&state_offset);
|
&state_offset, &bt_state);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
return;
|
||||||
|
|
||||||
uint32_t *bt_map = bt_state.map;
|
uint32_t *bt_map = bt_state.map;
|
||||||
*bt_offset = bt_state.offset;
|
*bt_offset = bt_state.offset;
|
||||||
|
Reference in New Issue
Block a user