Signed-off-by: Derek Lesho <dlesho(a)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 9ef863837d1..d226057c69e 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -120,6 +120,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 = [
@@ -521,8 +526,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
@@ -665,6 +670,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. """
@@ -2651,7 +2660,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():
@@ -2671,6 +2680,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")
@@ -2680,6 +2691,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")
@@ -2739,7 +2752,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
@@ -2758,7 +2771,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
@@ -2857,7 +2870,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
@@ -2866,7 +2879,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))
@@ -2874,7 +2887,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))
@@ -2882,7 +2895,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))
@@ -2939,7 +2952,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
@@ -3433,7 +3446,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