From c3608e6ac0d6a8324a8b889be8e1c30361ec69c5 Mon Sep 17 00:00:00 2001 From: Hoe Hao Cheng Date: Fri, 28 May 2021 03:04:42 +0800 Subject: [PATCH] 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 Part-of: --- 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 d4f543b..2148154 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 b3c2451..26b1424 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 c6e92d2..b25761f 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; -- 2.7.4