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