zink/codegen: add zink_verify_*_extensions()
authorHoe Hao Cheng <haochengho12907@gmail.com>
Thu, 27 May 2021 19:04:42 +0000 (03:04 +0800)
committerMarge Bot <eric+marge@anholt.net>
Thu, 10 Jun 2021 20:24:40 +0000 (20:24 +0000)
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@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11036>

src/gallium/drivers/zink/zink_device_info.py
src/gallium/drivers/zink/zink_instance.py
src/gallium/drivers/zink/zink_screen.c

index d4f543b..2148154 100644 (file)
@@ -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)
index b3c2451..26b1424 100644 (file)
@@ -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)
index c6e92d2..b25761f 100644 (file)
@@ -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;