blorp: handle binding table & surface state allocation failures

The embedding driver could be failing the allocation for whatever
reason, in which case we should skip the surface state writes.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25955>
This commit is contained in:
Lionel Landwerlin
2023-10-18 13:39:20 +03:00
committed by Marge Bot
parent 1cc26e8b66
commit f9753488ec
5 changed files with 19 additions and 9 deletions

View File

@@ -169,7 +169,7 @@ blorp_alloc_general_state(struct blorp_batch *blorp_batch,
return blorp_alloc_dynamic_state(blorp_batch, size, alignment, offset);
}
static void
static bool
blorp_alloc_binding_table(struct blorp_batch *blorp_batch,
unsigned num_entries,
unsigned state_size,
@@ -188,6 +188,8 @@ blorp_alloc_binding_table(struct blorp_batch *blorp_batch,
&(surface_offsets)[i], NULL);
bt_map[i] = surface_offsets[i];
}
return true;
}
static uint32_t

View File

@@ -150,7 +150,7 @@ blorp_alloc_general_state(struct blorp_batch *blorp_batch,
return blorp_alloc_dynamic_state(blorp_batch, size, alignment, offset);
}
static void
static bool
blorp_alloc_binding_table(struct blorp_batch *blorp_batch,
unsigned num_entries,
unsigned state_size,
@@ -181,6 +181,8 @@ blorp_alloc_binding_table(struct blorp_batch *blorp_batch,
iris_use_pinned_bo(batch, binder->bo, false, IRIS_DOMAIN_NONE);
batch->screen->vtbl.update_binder_address(batch, binder);
return true;
}
static uint32_t

View File

@@ -84,7 +84,7 @@ blorp_vf_invalidate_for_vb_48b_transitions(struct blorp_batch *batch,
UNUSED static struct blorp_address
blorp_get_workaround_address(struct blorp_batch *batch);
static void
static bool
blorp_alloc_binding_table(struct blorp_batch *batch, unsigned num_entries,
unsigned state_size, unsigned state_alignment,
uint32_t *bt_offset, uint32_t *surface_offsets,
@@ -1632,9 +1632,10 @@ blorp_setup_binding_table(struct blorp_batch *batch,
bind_offset = params->pre_baked_binding_table_offset;
} else {
unsigned num_surfaces = 1 + params->src.enabled;
blorp_alloc_binding_table(batch, num_surfaces,
isl_dev->ss.size, isl_dev->ss.align,
&bind_offset, surface_offsets, surface_maps);
if (!blorp_alloc_binding_table(batch, num_surfaces,
isl_dev->ss.size, isl_dev->ss.align,
&bind_offset, surface_offsets, surface_maps))
return 0;
if (params->dst.enabled) {
blorp_emit_surface_state(batch, &params->dst,

View File

@@ -146,7 +146,7 @@ blorp_alloc_general_state(struct blorp_batch *batch,
return state.map;
}
static void
static bool
blorp_alloc_binding_table(struct blorp_batch *batch, unsigned num_entries,
unsigned state_size, unsigned state_alignment,
uint32_t *bt_offset,
@@ -161,7 +161,7 @@ blorp_alloc_binding_table(struct blorp_batch *batch, unsigned num_entries,
anv_cmd_buffer_alloc_blorp_binding_table(cmd_buffer, num_entries,
&state_offset, &bt_state);
if (result != VK_SUCCESS)
return;
return false;
uint32_t *bt_map = bt_state.map;
*bt_offset = bt_state.offset;
@@ -169,10 +169,13 @@ blorp_alloc_binding_table(struct blorp_batch *batch, unsigned num_entries,
for (unsigned i = 0; i < num_entries; i++) {
struct anv_state surface_state =
anv_cmd_buffer_alloc_surface_state(cmd_buffer);
bt_map[i] = surface_state.offset + state_offset;
surface_offsets[i] = surface_state.offset;
surface_maps[i] = surface_state.map;
}
return true;
}
static uint32_t

View File

@@ -180,7 +180,7 @@ blorp_alloc_binding_table(struct blorp_batch *batch, unsigned num_entries,
anv_cmd_buffer_alloc_blorp_binding_table(cmd_buffer, num_entries,
&state_offset, &bt_state);
if (result != VK_SUCCESS)
return;
return false;
uint32_t *bt_map = bt_state.map;
*bt_offset = bt_state.offset;
@@ -192,6 +192,8 @@ blorp_alloc_binding_table(struct blorp_batch *batch, unsigned num_entries,
surface_offsets[i] = surface_state.offset;
surface_maps[i] = surface_state.map;
}
return true;
}
static uint32_t