Mesa (master): vulkan: Add run-time object type asserts in handle casts

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon May 4 14:31:35 UTC 2020


Module: Mesa
Branch: master
Commit: 32f20783a512129fc2d7dd8a11ffa8670cef0068
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=32f20783a512129fc2d7dd8a11ffa8670cef0068

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Tue Apr 21 15:51:01 2020 -0500

vulkan: Add run-time object type asserts in handle casts

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Acked-by: Kristian H. Kristensen <hoegsberg at google.com>
Acked-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4690>

---

 src/vulkan/util/vk_object.c |  3 +++
 src/vulkan/util/vk_object.h | 21 +++++++++++++++++++--
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/vulkan/util/vk_object.c b/src/vulkan/util/vk_object.c
index d6965158914..f84a68034b0 100644
--- a/src/vulkan/util/vk_object.c
+++ b/src/vulkan/util/vk_object.c
@@ -29,6 +29,9 @@ vk_object_base_init(UNUSED struct vk_device *device,
                     UNUSED VkObjectType obj_type)
 {
    base->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
+#ifndef NDEBUG
+   base->type = obj_type;
+#endif
 }
 
 void
diff --git a/src/vulkan/util/vk_object.h b/src/vulkan/util/vk_object.h
index f91cc1640a0..bd32f1ad681 100644
--- a/src/vulkan/util/vk_object.h
+++ b/src/vulkan/util/vk_object.h
@@ -36,6 +36,9 @@ struct vk_device;
 
 struct vk_object_base {
    VK_LOADER_DATA _loader_data;
+#ifndef NDEBUG
+   VkObjectType type;
+#endif
 };
 
 void vk_object_base_init(UNUSED struct vk_device *device,
@@ -43,6 +46,13 @@ void vk_object_base_init(UNUSED struct vk_device *device,
                          UNUSED VkObjectType obj_type);
 void vk_object_base_finish(UNUSED struct vk_object_base *base);
 
+static inline void
+vk_object_base_assert_valid(ASSERTED struct vk_object_base *base,
+                            ASSERTED VkObjectType obj_type)
+{
+   assert(base == NULL || base->type == obj_type);
+}
+
 
 struct vk_device {
    struct vk_object_base base;
@@ -59,13 +69,16 @@ void vk_device_finish(struct vk_device *device);
    static inline struct __driver_type *                                    \
    __driver_type ## _from_handle(__VkType _handle)                         \
    {                                                                       \
+      struct vk_object_base *base = (struct vk_object_base *)_handle;      \
+      vk_object_base_assert_valid(base, __VK_TYPE);                        \
       STATIC_ASSERT(offsetof(struct __driver_type, __base) == 0);          \
-      return (struct __driver_type *) _handle;                             \
+      return (struct __driver_type *) base;                                \
    }                                                                       \
                                                                            \
    static inline __VkType                                                  \
    __driver_type ## _to_handle(struct __driver_type *_obj)                 \
    {                                                                       \
+      vk_object_base_assert_valid(&_obj->__base, __VK_TYPE);               \
       return (__VkType) _obj;                                              \
    }
 
@@ -73,13 +86,17 @@ void vk_device_finish(struct vk_device *device);
    static inline struct __driver_type *                                    \
    __driver_type ## _from_handle(__VkType _handle)                         \
    {                                                                       \
+      struct vk_object_base *base =                                        \
+         (struct vk_object_base *)(uintptr_t)_handle;                      \
+      vk_object_base_assert_valid(base, __VK_TYPE);                        \
       STATIC_ASSERT(offsetof(struct __driver_type, __base) == 0);          \
-      return (struct __driver_type *)(uintptr_t) _handle;                  \
+      return (struct __driver_type *)base;                                 \
    }                                                                       \
                                                                            \
    static inline __VkType                                                  \
    __driver_type ## _to_handle(struct __driver_type *_obj)                 \
    {                                                                       \
+      vk_object_base_assert_valid(&_obj->__base, __VK_TYPE);               \
       return (__VkType)(uintptr_t) _obj;                                   \
    }
 



More information about the mesa-commit mailing list