parent
2dcf3b44a7
commit
ec66796671
@ -0,0 +1,136 @@
|
||||
From 9b57dbc097d94131266ffea2bfb9101418613aa3 Mon Sep 17 00:00:00 2001
|
||||
From: tigro <tigro@msvsphere-os.ru>
|
||||
Date: Tue, 16 Jan 2024 16:53:19 +0300
|
||||
Subject: [PATCH] Fix build on vulkan-headers 1.3.241
|
||||
|
||||
---
|
||||
src/vulkan/utils_gen.py | 86 ++++++++++++++++++++++++++---------------
|
||||
1 file changed, 55 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/src/vulkan/utils_gen.py b/src/vulkan/utils_gen.py
|
||||
index fab43af..39ad4f0 100644
|
||||
--- a/src/vulkan/utils_gen.py
|
||||
+++ b/src/vulkan/utils_gen.py
|
||||
@@ -127,56 +127,80 @@ class Obj(object):
|
||||
def __init__(self, **kwargs):
|
||||
self.__dict__.update(kwargs)
|
||||
|
||||
-def findall_enum(registry, name):
|
||||
- for e in registry.iterfind('enums[@name="{0}"]/enum'.format(name)):
|
||||
- if not 'alias' in e.attrib:
|
||||
- yield e
|
||||
- for e in registry.iterfind('.//enum[@extends="{0}"]'.format(name)):
|
||||
- # ext 289 is a non-existing extension that defines some names for
|
||||
- # proprietary downstream consumers, causes problems unless excluded
|
||||
- if e.attrib.get('extnumber', '0') == '289':
|
||||
- continue
|
||||
- # some other extensions contain reserved identifiers that generally
|
||||
- # translate to compile failures
|
||||
- if 'RESERVED' in e.attrib['name']:
|
||||
- continue
|
||||
- if not 'alias' in e.attrib:
|
||||
- yield e
|
||||
+class VkXML(ET.ElementTree):
|
||||
+ def blacklist_block(self, req):
|
||||
+ for t in req.iterfind('type'):
|
||||
+ self.blacklist_types.add(t.attrib['name'])
|
||||
+ for e in req.iterfind('enum'):
|
||||
+ self.blacklist_enums.add(e.attrib['name'])
|
||||
+
|
||||
+ def __init__(self, *args, **kwargs):
|
||||
+
|
||||
+ super().__init__(*args, **kwargs)
|
||||
+ self.blacklist_types = set()
|
||||
+ self.blacklist_enums = set()
|
||||
+
|
||||
+ for f in self.iterfind('feature'):
|
||||
+ # Feature block for non-Vulkan API
|
||||
+ if not 'vulkan' in f.attrib['api'].split(','):
|
||||
+ for r in f.iterfind('require'):
|
||||
+ self.blacklist_block(r)
|
||||
+
|
||||
+ for e in self.iterfind('extensions/extension'):
|
||||
+ # Entire extension is unsupported on vulkan or platform-specifid
|
||||
+ if not 'vulkan' in e.attrib['supported'].split(',') or 'platform' in e.attrib:
|
||||
+ for r in e.iterfind('require'):
|
||||
+ self.blacklist_block(r)
|
||||
+ continue
|
||||
+
|
||||
+ # Only individual <require> blocks are API-specific
|
||||
+ for r in e.iterfind('require[@api]'):
|
||||
+ if not 'vulkan' in r.attrib['api'].split(','):
|
||||
+ self.blacklist_block(r)
|
||||
+
|
||||
+ def findall_enum(self, name):
|
||||
+ for e in self.iterfind('enums[@name="{0}"]/enum'.format(name)):
|
||||
+ if not 'alias' in e.attrib:
|
||||
+ if not e.attrib['name'] in self.blacklist_enums:
|
||||
+ yield e
|
||||
+ for e in self.iterfind('.//enum[@extends="{0}"]'.format(name)):
|
||||
+ if not 'alias' in e.attrib:
|
||||
+ if not e.attrib['name'] in self.blacklist_enums:
|
||||
+ yield e
|
||||
+
|
||||
+ def findall_type(self, category):
|
||||
+ for t in self.iterfind('types/type[@category="{0}"]'.format(category)):
|
||||
+ name = t.attrib.get('name') or t.find('name').text
|
||||
+ if name in self.blacklist_types:
|
||||
+ continue
|
||||
+ yield t
|
||||
+
|
||||
|
||||
def get_vkenum(registry, enum):
|
||||
- for e in findall_enum(registry, enum):
|
||||
+ for e in registry.findall_enum(enum):
|
||||
yield e.attrib['name']
|
||||
|
||||
def get_vkobjects(registry):
|
||||
- for t in registry.iterfind('types/type[@category="handle"]'):
|
||||
+ for t in registry.findall_type('handle'):
|
||||
if 'objtypeenum' in t.attrib:
|
||||
yield Obj(enum = t.attrib['objtypeenum'],
|
||||
name = t.find('name').text)
|
||||
|
||||
def get_vkstructs(registry):
|
||||
- for e in registry.iterfind('types/type[@category="struct"]'):
|
||||
- # Strings for platform-specific crap we want to blacklist as they will
|
||||
- # most likely cause build failures
|
||||
- blacklist_strs = [
|
||||
- 'ANDROID', 'Surface', 'Win32', 'D3D12', 'GGP', 'FUCHSIA', 'Metal',
|
||||
- ]
|
||||
-
|
||||
- if any([ str in e.attrib['name'] for str in blacklist_strs ]):
|
||||
- continue
|
||||
-
|
||||
+ for t in registry.findall_type('struct'):
|
||||
stype = None
|
||||
- for m in e.iterfind('member'):
|
||||
+ for m in t.iterfind('member'):
|
||||
if m.find('name').text == 'sType':
|
||||
stype = m
|
||||
break
|
||||
|
||||
if stype and 'values' in stype.attrib:
|
||||
yield Obj(stype = stype.attrib['values'],
|
||||
- name = e.attrib['name'])
|
||||
+ name = t.attrib['name'])
|
||||
|
||||
def get_vkaccess(registry):
|
||||
access = Obj(read = 0, write = 0)
|
||||
- for e in findall_enum(registry, 'VkAccessFlagBits'):
|
||||
+ for e in registry.findall_enum('VkAccessFlagBits'):
|
||||
if '_READ_' in e.attrib['name']:
|
||||
access.read |= 1 << int(e.attrib['bitpos'])
|
||||
if '_WRITE_' in e.attrib['name']:
|
||||
@@ -212,7 +236,7 @@ if __name__ == '__main__':
|
||||
if not xmlfile or xmlfile == '':
|
||||
xmlfile = find_registry_xml(datadir)
|
||||
|
||||
- registry = ET.parse(xmlfile)
|
||||
+ registry = VkXML(ET.parse(xmlfile))
|
||||
with open(outfile, 'w') as f:
|
||||
f.write(TEMPLATE.render(
|
||||
vkresults = get_vkenum(registry, 'VkResult'),
|
||||
--
|
||||
2.43.0
|
||||
|
Loading…
Reference in new issue