Module: Mesa
Branch: main
Commit: 62a44d1bda958e6f8f56fd958023de9be7347a08
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=62a44d1bda958e6f8f56fd958023de9be7347a08

Author: Jason Ekstrand <[email protected]>
Date:   Fri Apr 22 12:46:02 2022 -0500

vulkan/log: Allow but warn if called with a NULL object

Most of the time when the logging code is invoked, it means we're
already in an edge case.  It should be as robust as possible, otherwise
we risk making hard to debug things even harder.  To that end, instead
of blowing up if passed a NULL object on the list, handle it as
gracefully as we can.

Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16107>

---

 src/vulkan/runtime/vk_log.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/src/vulkan/runtime/vk_log.c b/src/vulkan/runtime/vk_log.c
index b085b369f62..9fb15f59420 100644
--- a/src/vulkan/runtime/vk_log.c
+++ b/src/vulkan/runtime/vk_log.c
@@ -90,8 +90,20 @@ __vk_log_impl(VkDebugUtilsMessageSeverityFlagBitsEXT 
severity,
       instance = (struct vk_instance *) objects_or_instance;
    } else {
       objects = (struct vk_object_base **) objects_or_instance;
-      instance = vk_object_to_instance(objects[0]);
-      assert(instance->base.client_visible);
+      for (unsigned i = 0; i < object_count; i++) {
+         if (unlikely(objects[i] == NULL)) {
+            mesa_logw("vk_log*() called with NULL object\n");
+            continue;
+         }
+
+         if (!instance) {
+            instance = vk_object_to_instance(objects[i]);
+            assert(instance->base.client_visible);
+         } else {
+            assert(vk_object_to_instance(objects[i]) == instance);
+         }
+         break;
+      }
    }
 
 #ifndef DEBUG
@@ -160,9 +172,12 @@ __vk_log_impl(VkDebugUtilsMessageSeverityFlagBitsEXT 
severity,
       VkDebugUtilsObjectNameInfoEXT *object_name_infos =
          ralloc_array(NULL, VkDebugUtilsObjectNameInfoEXT, object_count);
 
-      ASSERTED int cmdbuf_n = 0, queue_n = 0;
+      ASSERTED int cmdbuf_n = 0, queue_n = 0, obj_n = 0;
       for (int i = 0; i < object_count; i++) {
          struct vk_object_base *base = objects[i];
+         if (base == NULL)
+            continue;
+
          assert(base->client_visible);
 
          switch (base->type) {
@@ -194,7 +209,7 @@ __vk_log_impl(VkDebugUtilsMessageSeverityFlagBitsEXT 
severity,
             break;
          }
 
-         object_name_infos[i] = (VkDebugUtilsObjectNameInfoEXT){
+         object_name_infos[obj_n++] = (VkDebugUtilsObjectNameInfoEXT){
             .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT,
             .pNext = NULL,
             .objectType = base->type,
@@ -202,7 +217,7 @@ __vk_log_impl(VkDebugUtilsMessageSeverityFlagBitsEXT 
severity,
             .pObjectName = base->object_name,
          };
       }
-      cb_data.objectCount = object_count;
+      cb_data.objectCount = obj_n;
       cb_data.pObjects = object_name_infos;
 
       vk_debug_message(instance, severity, types, &cb_data);

Reply via email to