Mesa (main): zink/codegen: add zink_verify_*_extensions()

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 10 20:32:44 UTC 2021


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

Author: Hoe Hao Cheng <haochengho12907 at gmail.com>
Date:   Fri May 28 03:04:42 2021 +0800

zink/codegen: add zink_verify_*_extensions()

those are meant to be used with the dispatch tables, by checking whether
the functions added by the enabled extensions are actually loaded

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11036>

---

 src/gallium/drivers/zink/zink_device_info.py | 24 +++++++++++++++++++++-
 src/gallium/drivers/zink/zink_instance.py    | 30 +++++++++++++++++++++++++++-
 src/gallium/drivers/zink/zink_screen.c       |  6 ++++++
 3 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_device_info.py b/src/gallium/drivers/zink/zink_device_info.py
index d4f543b528b..21481544996 100644
--- a/src/gallium/drivers/zink/zink_device_info.py
+++ b/src/gallium/drivers/zink/zink_device_info.py
@@ -268,6 +268,9 @@ struct zink_device_info {
 bool
 zink_get_physical_device_info(struct zink_screen *screen);
 
+bool
+zink_verify_device_extensions(struct zink_screen *screen);
+
 #endif
 """
 
@@ -439,6 +442,25 @@ zink_get_physical_device_info(struct zink_screen *screen)
 fail:
    return false;
 }
+
+bool
+zink_verify_device_extensions(struct zink_screen *screen)
+{
+%for ext in extensions:
+%if registry.in_registry(ext.name):
+   if (screen->info.have_${ext.name_with_vendor()}) {
+%for cmd in registry.get_registry_entry(ext.name).device_commands:
+      if (!screen->vk.${cmd.lstrip("vk")}) {
+         mesa_loge("ZINK: GetDeviceProcAddr failed: ${cmd}\\n");
+         return false;
+      }
+%endfor
+   }
+%endif
+%endfor
+
+   return true;
+}
 """
 
 
@@ -514,6 +536,6 @@ if __name__ == "__main__":
         print(header, file=header_file)
 
     with open(impl_path, "w") as impl_file:
-        impl = Template(impl_code, lookup=lookup).render(extensions=extensions, versions=versions).strip()
+        impl = Template(impl_code, lookup=lookup).render(extensions=extensions, versions=versions, registry=registry).strip()
         impl = replace_code(impl, replacement)
         print(impl, file=impl_file)
diff --git a/src/gallium/drivers/zink/zink_instance.py b/src/gallium/drivers/zink/zink_instance.py
index b3c2451df27..26b14240bad 100644
--- a/src/gallium/drivers/zink/zink_instance.py
+++ b/src/gallium/drivers/zink/zink_instance.py
@@ -98,6 +98,9 @@ zink_create_instance(struct zink_instance_info *instance_info);
 bool
 zink_load_instance_extensions(struct zink_screen *screen);
 
+bool
+zink_verify_instance_extensions(struct zink_screen *screen);
+
 #endif
 """
 
@@ -251,6 +254,31 @@ zink_load_instance_extensions(struct zink_screen *screen)
 
    return true;
 }
+
+bool
+zink_verify_instance_extensions(struct zink_screen *screen)
+{
+%for ext in extensions:
+%if registry.in_registry(ext.name):
+   if (screen->instance_info.have_${ext.name_with_vendor()}) {
+%for cmd in registry.get_registry_entry(ext.name).instance_commands:
+      if (!screen->vk.${cmd.lstrip("vk")}) {
+         mesa_loge("ZINK: GetInstanceProcAddr failed: ${cmd}\\n");
+         return false;
+      }
+%endfor
+%for cmd in registry.get_registry_entry(ext.name).pdevice_commands:
+      if (!screen->vk.${cmd.lstrip("vk")}) {
+         mesa_loge("ZINK: GetInstanceProcAddr failed: ${cmd}\\n");
+         return false;
+      }
+%endfor
+   }
+%endif
+%endfor
+
+   return true;
+}
 """
 
 
@@ -318,6 +346,6 @@ if __name__ == "__main__":
         print(header, file=header_file)
 
     with open(impl_path, "w") as impl_file:
-        impl = Template(impl_code).render(extensions=extensions, layers=layers).strip()
+        impl = Template(impl_code).render(extensions=extensions, layers=layers, registry=registry).strip()
         impl = replace_code(impl, replacement)
         print(impl, file=impl_file)
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index c6e92d20a38..b25761fa8ab 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -1670,6 +1670,9 @@ zink_internal_create_screen(const struct pipe_screen_config *config)
    if (!zink_load_instance_extensions(screen))
       goto fail;
 
+   if (!zink_verify_instance_extensions(screen))
+      goto fail;
+
    if (screen->instance_info.have_EXT_debug_utils &&
       (zink_debug & ZINK_DEBUG_VALIDATION) && !create_debug(screen))
       debug_printf("ZINK: failed to setup debug utils\n");
@@ -1712,6 +1715,9 @@ zink_internal_create_screen(const struct pipe_screen_config *config)
 
    vk_device_dispatch_table_load(&screen->vk.device, &vkGetDeviceProcAddr, screen->dev);
 
+   if (!zink_verify_device_extensions(screen))
+      goto fail;
+
    check_base_requirements(screen);
 
    screen->base.get_name = zink_get_name;



More information about the mesa-commit mailing list