-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgenerate_reflection.py
103 lines (91 loc) · 3.18 KB
/
generate_reflection.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/env python
import reg
vkreg = reg.Registry()
vkreg.loadFile("/usr/share/vulkan/registry/vk.xml")
blacklist = [
"VkPipelineCacheStageValidationIndexEntry",
"VkPipelineCacheSafetyCriticalIndexEntry",
"VkPipelineCacheHeaderVersionSafetyCriticalOne",
"VkPipelineCacheValidationVersion",
"VkPipelineMatchControl",
"VkFaultData",
"VkFaultType",
"VkFaultLevel",
"VkFaultQueryBehavior",
"VkPipelinePoolSize",
"VkCommandPoolMemoryConsumption",
"VkExternalFenceHandleTypeFlagBits",
"VkExternalSemaphoreHandleTypeFlagBits",
"VkExternalMemoryHandleTypeFlagBits",
]
print("#include \"reflection/vkreflection.hpp\"")
print("#include \"reflection/custom_structs.hpp\"")
print("namespace CheekyLayer { namespace reflection {")
print("reflection_map struct_reflection_map = {")
for (name, description) in vkreg.typedict.items():
if name in blacklist:
continue
if not 'category' in description.elem.attrib:
continue
if description.elem.attrib["category"] != "struct":
continue
if 'structextends' in description.elem.attrib:
continue
if name[-1].isupper() and not name[-2].isdigit():
continue
print(f"\t{{\n\t\t\"{name}\",\n\t\tVkTypeInfo{{")
print(f"\t\t\t.name = \"{name}\",")
print(f"\t\t\t.size = sizeof({name}),")
print(f"\t\t\t.members = inner_reflection_map{{")
for member in description.getMembers():
mType=member[0].text
mName=member[1].text
if mName == "sType" or mName == "pNext":
continue
mPointer = member[0].tail != None and '*' in member[0].tail
if mPointer:
mPointer = "true"
else:
mPointer = "false"
mArray = 'len' in member.attrib;
if mArray:
mArray = "true"
mArrayLen = member.attrib['len'].replace("\\", "\\\\")
mArrayInfo = f", .arrayLength = \"{mArrayLen}\""
else:
mArray = "false"
mArrayInfo = ""
print(f"\t\t\t\t{{\"{mName}\", VkReflectInfo{{ .name = \"{mName}\", .type = \"{mType}\", .pointer = {mPointer}, .array = {mArray}{mArrayInfo}, .offset = offsetof({name}, {mName}) }}}},")
print("\t\t\t}\n\t\t}\n\t},")
print("\tVK_CUSTOM_STRUCTS")
print("};");
print("enum_map enum_reflection_map = {");
for enum in vkreg.tree.findall("enums"):
name=enum.attrib["name"]
if name in blacklist:
continue
if name == "VkStructureType":
continue
if name == "VkObjectType":
continue
if name == "API Constants":
continue
if name == "VkResult":
continue
if name[-1].isupper():
continue
print(f"\t{{\n\t\t\"{name}\",\n\t\tinner_enum_map{{")
for val in enum.findall(".//enum"):
if "protect" in val.attrib:
continue
vName = val.attrib["name"]
if "RESERVED" in vName or "_RESERVE_" in vName:
continue
if vName.endswith("_EXT"):
continue
if vName.endswith("_QCOM") or vName.endswith("_HUAWEI"):
continue
print(f"\t\t\t{{\"{vName}\", VkEnumEntry{{ .name = \"{vName}\", .value = (uint32_t) {vName}}}}},")
print("\t\t}\n\t},")
print("};");
print("}}");