bool
zink_get_physical_device_info(struct zink_screen *screen);
+bool
+zink_verify_device_extensions(struct zink_screen *screen);
+
#endif
"""
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;
+}
"""
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)
bool
zink_load_instance_extensions(struct zink_screen *screen);
+bool
+zink_verify_instance_extensions(struct zink_screen *screen);
+
#endif
"""
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;
+}
"""
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)
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");
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;