From: Hoe Hao Cheng Date: Thu, 27 May 2021 19:04:42 +0000 (+0800) Subject: zink/codegen: add zink_verify_*_extensions() X-Git-Tag: upstream/21.2.3~2084 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c3608e6ac0d6a8324a8b889be8e1c30361ec69c5;p=platform%2Fupstream%2Fmesa.git 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: --- 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;