[PATCH 3/4] winevulkan: handle VkEnumValue aliases to provisional exts

Liam Middlebrook lmiddlebrook at nvidia.com
Mon Apr 20 10:35:02 CDT 2020


Signed-off-by: Liam Middlebrook <lmiddlebrook at nvidia.com>
Signed-off-by: Daniel Koch <dkoch at nvidia.com>
---
 dlls/winevulkan/make_vulkan | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index bbfec495ba..d855057072 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -2731,10 +2731,27 @@ class VkRegistry(object):
 
         self.enums = OrderedDict(sorted(enums.items()))
 
-    def _process_require_enum(self, enum_elem, ext=None):
+    def _process_require_enum(self, enum_elem, ext=None, only_aliased=False):
         if "extends" in enum_elem.keys():
             enum = self.types[enum_elem.attrib["extends"]]["data"]
 
+            # Need to define VkEnumValues which were aliased to by another value. This is necessary
+            # from VK spec version 1.2.135 where the provisional VK_KHR_ray_tracing extension was
+            # added which altered VK_NV_ray_tracing's VkEnumValues to alias to the provisional
+            # extension.
+            aliased = False
+            for _, t in self.types.items():
+                if t["category"] != "enum":
+                    continue
+                if not t["data"]:
+                    continue
+                for value in t["data"].values:
+                    if value.alias == enum_elem.attrib["name"]:
+                        aliased = True
+
+            if only_aliased and not aliased:
+                return
+
             if "bitpos" in enum_elem.keys():
                 # We need to add an extra value to an existing enum type.
                 # E.g. VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG to VkFormatFeatureFlagBits.
@@ -2763,6 +2780,10 @@ class VkRegistry(object):
                 enum.add(VkEnumValue(enum_elem.attrib["name"], alias=enum_elem.attrib["alias"]))
 
         elif "value" in enum_elem.keys():
+            # Constants are not aliased, no need to add them here, they'll get added later on.
+            if only_aliased:
+                return
+
             self.consts.append(VkConstant(enum_elem.attrib["name"], enum_elem.attrib["value"]))
 
     @staticmethod
@@ -2808,6 +2829,13 @@ class VkRegistry(object):
                 LOGGER.debug("Skipping experimental extension: {0}".format(ext_name))
                 return
 
+            # Extensions can define VkEnumValues which alias to provisional extensions. Pre-process
+            # extensions to define any required VkEnumValues before the platform check below.
+            for require in ext.findall("require"):
+                # Extensions can add enum values to Core / extension enums, so add these.
+                for enum_elem in require.findall("enum"):
+                    self._process_require_enum(enum_elem, ext, only_aliased=True)
+
             platform = ext.attrib.get("platform")
             if platform and platform != "win32":
                 LOGGER.debug("Skipping extensions {0} for platform {1}".format(ext_name, platform))
-- 
2.25.1




More information about the wine-devel mailing list