Module: Mesa Branch: main Commit: f9753488ecb7e60f8060db38ba4d4fcef9f42431 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f9753488ecb7e60f8060db38ba4d4fcef9f42431
Author: Lionel Landwerlin <lionel.g.landwer...@intel.com> Date: Wed Oct 18 13:39:20 2023 +0300 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.landwer...@intel.com> Reviewed-by: Tapani Pälli <tapani.pa...@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25955> --- src/gallium/drivers/crocus/crocus_blorp.c | 4 +++- src/gallium/drivers/iris/iris_blorp.c | 4 +++- src/intel/blorp/blorp_genX_exec.h | 9 +++++---- src/intel/vulkan/genX_blorp_exec.c | 7 +++++-- src/intel/vulkan_hasvk/genX_blorp_exec.c | 4 +++- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/crocus/crocus_blorp.c b/src/gallium/drivers/crocus/crocus_blorp.c index b3482e48efd..aadb2af4732 100644 --- a/src/gallium/drivers/crocus/crocus_blorp.c +++ b/src/gallium/drivers/crocus/crocus_blorp.c @@ -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 diff --git a/src/gallium/drivers/iris/iris_blorp.c b/src/gallium/drivers/iris/iris_blorp.c index 99f9067e1ee..d911b414501 100644 --- a/src/gallium/drivers/iris/iris_blorp.c +++ b/src/gallium/drivers/iris/iris_blorp.c @@ -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 diff --git a/src/intel/blorp/blorp_genX_exec.h b/src/intel/blorp/blorp_genX_exec.h index 83381eec959..0f70a969f0a 100644 --- a/src/intel/blorp/blorp_genX_exec.h +++ b/src/intel/blorp/blorp_genX_exec.h @@ -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, ¶ms->dst, diff --git a/src/intel/vulkan/genX_blorp_exec.c b/src/intel/vulkan/genX_blorp_exec.c index a98319736ea..3cf2ae9b768 100644 --- a/src/intel/vulkan/genX_blorp_exec.c +++ b/src/intel/vulkan/genX_blorp_exec.c @@ -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 diff --git a/src/intel/vulkan_hasvk/genX_blorp_exec.c b/src/intel/vulkan_hasvk/genX_blorp_exec.c index fd9f225f702..0005e527ac9 100644 --- a/src/intel/vulkan_hasvk/genX_blorp_exec.c +++ b/src/intel/vulkan_hasvk/genX_blorp_exec.c @@ -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