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, &params->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

Reply via email to