[PATCH v11 1/4] winevulkan: Support use of extensions which mustn't be exposed.

Derek Lesho dlesho at codeweavers.com
Tue Jul 6 11:24:36 CDT 2021


Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
 dlls/winevulkan/make_vulkan | 35 ++++++++++++++++++++++++-----------
 1 file changed, 24 insertions(+), 11 deletions(-)

diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index e8534cbd5f5..c46ef02dcb9 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -124,6 +124,11 @@ UNSUPPORTED_EXTENSIONS = [
     "VK_NV_external_memory_win32",
 ]
 
+# Either internal extensions which aren't present on the win32 platform which
+# winevulkan may nonetheless use, or extensions we want to generate headers for
+# but not expose to applications (useful for test commits)
+UNEXPOSED_EXTENSIONS = {}
+
 # The Vulkan loader provides entry-points for core functionality and important
 # extensions. Based on vulkan-1.def this amounts to WSI extensions on 1.0.51.
 CORE_EXTENSIONS = [
@@ -513,8 +518,8 @@ class VkEnumValue(object):
 
 
 class VkFunction(object):
-    def __init__(self, _type=None, name=None, params=[], extensions=[], alias=None):
-        self.extensions = []
+    def __init__(self, _type=None, name=None, params=[], alias=None):
+        self.extensions = set()
         self.name = name
         self.type = _type
         self.params = params
@@ -657,6 +662,10 @@ class VkFunction(object):
     def needs_private_thunk(self):
         return self.thunk_type == ThunkType.PRIVATE
 
+    def needs_exposing(self):
+        # The function needs exposed if at-least one extension isn't both UNSUPPORTED and UNEXPOSED
+        return self.is_required() and (not self.extensions or not self.extensions.issubset(UNEXPOSED_EXTENSIONS))
+
     def pfn(self, prefix="p", call_conv=None, conv=False):
         """ Create function pointer. """
 
@@ -2682,7 +2691,7 @@ class VkGenerator(object):
         # Create thunks for instance and device functions.
         # Global functions don't go through the thunks.
         for vk_func in self.registry.funcs.values():
-            if not vk_func.is_required():
+            if not vk_func.needs_exposing():
                 continue
 
             if vk_func.is_global_func():
@@ -2702,6 +2711,8 @@ class VkGenerator(object):
         for ext in self.registry.extensions:
             if ext["type"] != "device":
                 continue
+            if ext["name"] in UNEXPOSED_EXTENSIONS:
+                continue
 
             f.write("    \"{0}\",\n".format(ext["name"]))
         f.write("};\n\n")
@@ -2711,6 +2722,8 @@ class VkGenerator(object):
         for ext in self.registry.extensions:
             if ext["type"] != "instance":
                 continue
+            if ext["name"] in UNEXPOSED_EXTENSIONS:
+                continue
 
             f.write("    \"{0}\",\n".format(ext["name"]))
         f.write("};\n\n")
@@ -2770,7 +2783,7 @@ class VkGenerator(object):
         f.write("const struct unix_funcs loader_funcs =\n")
         f.write("{\n")
         for vk_func in self.registry.funcs.values():
-            if not vk_func.is_required():
+            if not vk_func.needs_exposing():
                 continue
             if vk_func.loader_thunk_type == ThunkType.NONE:
                 continue
@@ -2789,7 +2802,7 @@ class VkGenerator(object):
         # Generate prototypes for device and instance functions requiring a custom implementation.
         f.write("/* Functions for which we have custom implementations outside of the thunks. */\n")
         for vk_func in self.registry.funcs.values():
-            if not vk_func.is_required():
+            if not vk_func.needs_exposing():
                 continue
             if vk_func.needs_thunk() and not vk_func.needs_private_thunk():
                 continue
@@ -2888,7 +2901,7 @@ class VkGenerator(object):
         f.write("WINE_DEFAULT_DEBUG_CHANNEL(vulkan);\n\n")
 
         for vk_func in self.registry.funcs.values():
-            if not vk_func.is_required():
+            if not vk_func.needs_exposing():
                 continue
             if vk_func.loader_thunk_type != ThunkType.PUBLIC:
                 continue
@@ -2897,7 +2910,7 @@ class VkGenerator(object):
 
         f.write("static const struct vulkan_func vk_device_dispatch_table[] =\n{\n")
         for vk_func in self.registry.device_funcs:
-            if not vk_func.is_required():
+            if not vk_func.needs_exposing():
                 continue
 
             f.write("    {{\"{0}\", &{0}}},\n".format(vk_func.name))
@@ -2905,7 +2918,7 @@ class VkGenerator(object):
 
         f.write("static const struct vulkan_func vk_phys_dev_dispatch_table[] =\n{\n")
         for vk_func in self.registry.phys_dev_funcs:
-            if not vk_func.is_required():
+            if not vk_func.needs_exposing():
                 continue
 
             f.write("    {{\"{0}\", &{0}}},\n".format(vk_func.name))
@@ -2913,7 +2926,7 @@ class VkGenerator(object):
 
         f.write("static const struct vulkan_func vk_instance_dispatch_table[] =\n{\n")
         for vk_func in self.registry.instance_funcs:
-            if not vk_func.is_required():
+            if not vk_func.needs_exposing():
                 continue
 
             f.write("    {{\"{0}\", &{0}}},\n".format(vk_func.name))
@@ -2970,7 +2983,7 @@ class VkGenerator(object):
         f.write("struct unix_funcs\n")
         f.write("{\n")
         for vk_func in self.registry.funcs.values():
-            if not vk_func.is_required():
+            if not vk_func.needs_exposing():
                 continue
             if vk_func.loader_thunk_type == ThunkType.NONE:
                 continue
@@ -3464,7 +3477,7 @@ class VkRegistry(object):
                 # the XML file to handle this, but because of the manner in which we parse the XML
                 # file we pre-populate from <commands> before we check if a command is enabled.
                 if cmd_name in self.funcs:
-                    self.funcs[cmd_name].extensions.append(ext_name)
+                    self.funcs[cmd_name].extensions.add(ext_name)
 
             # Some extensions are not ready or have numbers reserved as a place holder.
             if ext.attrib["supported"] == "disabled":
-- 
2.32.0




More information about the wine-devel mailing list