[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