winevulkan: Handle VkEnumValue aliases to provisional exts.
Signed-off-by: Liam Middlebrook <lmiddlebrook@nvidia.com> Signed-off-by: Daniel Koch <dkoch@nvidia.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
63ea53decb
commit
39191aa906
|
@ -2731,10 +2731,27 @@ class VkRegistry(object):
|
||||||
|
|
||||||
self.enums = OrderedDict(sorted(enums.items()))
|
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():
|
if "extends" in enum_elem.keys():
|
||||||
enum = self.types[enum_elem.attrib["extends"]]["data"]
|
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():
|
if "bitpos" in enum_elem.keys():
|
||||||
# We need to add an extra value to an existing enum type.
|
# 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.
|
# 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"]))
|
enum.add(VkEnumValue(enum_elem.attrib["name"], alias=enum_elem.attrib["alias"]))
|
||||||
|
|
||||||
elif "value" in enum_elem.keys():
|
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"]))
|
self.consts.append(VkConstant(enum_elem.attrib["name"], enum_elem.attrib["value"]))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -2808,6 +2829,13 @@ class VkRegistry(object):
|
||||||
LOGGER.debug("Skipping experimental extension: {0}".format(ext_name))
|
LOGGER.debug("Skipping experimental extension: {0}".format(ext_name))
|
||||||
return
|
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")
|
platform = ext.attrib.get("platform")
|
||||||
if platform and platform != "win32":
|
if platform and platform != "win32":
|
||||||
LOGGER.debug("Skipping extensions {0} for platform {1}".format(ext_name, platform))
|
LOGGER.debug("Skipping extensions {0} for platform {1}".format(ext_name, platform))
|
||||||
|
|
Loading…
Reference in New Issue