annotate svk/generate.nim @ 1481:a99f3227130c default tip

did: continue on vulkan-api generator
author sam <sam@basx.dev>
date Sun, 27 Apr 2025 01:06:59 +0700
parents 0b302531f5c5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
1 import std/strtabs
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
2 import std/syncio
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
3 import std/xmltree
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
4 import std/tables
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
5 import std/options
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
6 import std/sequtils
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
7 import std/strutils
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
8 import std/strformat
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
9 import std/xmlparser
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
10 import std/os
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
11 import std/osproc
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
12 import std/paths
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
13
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
14 # helpers
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
15 func smartParseInt(value: string): int =
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
16 if value.startsWith("0x"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
17 parseHexInt(value)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
18 else:
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
19 parseInt(value)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
20
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
21 const TYPEMAP = {
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
22 "void": "void",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
23 "char": "char",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
24 "float": "float32",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
25 "double": "float64",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
26 "int8_t": "int8",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
27 "uint8_t": "uint8",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
28 "int16_t": "int16",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
29 "uint16_t": "uint16",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
30 "int32_t": "int32",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
31 "uint32_t": "uint32",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
32 "uint64_t": "uint64",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
33 "int64_t": "int64",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
34 "size_t": "csize_t",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
35 "int": "cint",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
36 }.toTable
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
37
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
38 # load xml
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
39 let xml = (system.currentSourcePath.parentDir() / "vk.xml").loadXml()
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
40 let platforms = xml.findAll("platforms")[0]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
41 let types = xml.findAll("types")[0]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
42 let xmlenums = xml.findAll("enums")
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
43 let commands = xml.findAll("commands")[0]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
44 let features = xml.findAll("feature") # features has extends="<ENUM>"
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
45 let extensions = xml.findAll("extensions")[0] # extensions has extends="<ENUM>"
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
46 let formats = xml.findAll("formats")[0]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
47
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
48 # gather all enums
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
49
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
50 type
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
51 EnumEntry = object
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
52 name: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
53 value: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
54
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
55 EnumDef = object
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
56 name: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
57 values: seq[EnumEntry]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
58 isBitmask: bool
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
59
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
60 ConstantDef = object
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
61 name: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
62 datatype: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
63 value: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
64
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
65 var consts: seq[ConstantDef]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
66 var enums: Table[string, EnumDef]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
67
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
68 func addValue(edef: var EnumDef, n: XmlNode) =
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
69 if n.attr("deprecated") != "aliased" and n.attr("alias") == "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
70 if n.attr("name") in edef.values.mapIt(it.name):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
71 return
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
72 if n.attr("name").endsWith("_EXT") and
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
73 n.attr("name")[0 ..< ^4] in edef.values.mapIt(it.name):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
74 return
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
75
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
76 var value = ""
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
77 if n.attr("value") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
78 value = n.attr("value")
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
79 elif n.attr("bitpos") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
80 value = $(1 shl parseInt(n.attr("bitpos")))
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
81 elif n.attr("offset") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
82 var enumBase = 1000000000
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
83 if n.attr("extnumber") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
84 enumBase += (smartParseInt(n.attr("extnumber")) - 1) * 1000
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
85 var v = smartParseInt(n.attr("offset")) + enumBase
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
86 if n.attr("dir") == "-":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
87 v = -v
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
88 value = $(v)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
89
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
90 edef.values.add EnumEntry(name: n.attr("name"), value: value)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
91
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
92 func doTypename(typename: string, isPointer: bool): string =
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
93 result = TYPEMAP.getOrDefault(typename.strip(), typename.strip()).strip(chars = {'_'})
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
94
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
95 if typename == "void":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
96 assert isPointer
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
97
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
98 if isPointer:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
99 if typename == "void":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
100 result = "pointer"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
101 elif typename == "char":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
102 result = "cstring"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
103 else:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
104 result = "ptr " & result
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
105
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
106 func doIdentifier(typename: string): string =
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
107 if typename in ["type", "object"]:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
108 return &"`{typename}`"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
109 return typename.strip()
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
110
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
111 func doMember(typename, theType: string, isPointer: bool, value: string): string =
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
112 if value == "":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
113 &"{doIdentifier(typename)}: {doTypename(theType, isPointer)}"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
114 else:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
115 &"{doIdentifier(typename)}: {doTypename(theType, isPointer)} = {value}"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
116
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
117 func memberDecl(n: XmlNode): string =
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
118 for i in 0 ..< n.len:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
119 if n[i].kind == xnElement and n[i].tag == "comment":
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
120 n.delete(i)
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
121 break
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
122 assert n.tag == "member"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
123 if n.len == 2:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
124 return doMember(n[1][0].text, n[0][0].text, false, n.attr("values"))
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
125 elif n.len == 3:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
126 assert "*" notin n[0][0].text.strip()
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
127 if n[1].kind == xnElement and n[1].tag == "name":
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
128 # bitfield
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
129 if n[2].text.strip().startsWith(":"):
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
130 return
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
131 &"{doIdentifier(n[1][0].text)} {{.bitsize:{n[2].text.strip()[1 .. ^1]}.}}: {doTypename(n[0][0].text, false)}"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
132 # array definition
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
133 elif n[2].text.strip().startsWith("["):
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
134 let arrayDim = n[2].text[1 ..< ^1]
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
135 if "][" in arrayDim:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
136 let dims = arrayDim.split("][", 1)
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
137 let (dim1, dim2) = (dims[0], dims[1])
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
138 return doMember(
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
139 n[1][0].text,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
140 &"array[{dim1}, array[{dim2}, {doTypename(n[0][0].text, false)}]]",
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
141 false,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
142 n.attr("values"),
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
143 )
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
144 else:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
145 return doMember(
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
146 n[1][0].text,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
147 &"array[{arrayDim}, {doTypename(n[0][0].text, false)}]",
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
148 false,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
149 n.attr("values"),
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
150 )
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
151 else:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
152 debugecho n.toSeq
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
153 doAssert false, "This should not happen"
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
154 else:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
155 # pointer definition
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
156 assert n[1].text.strip() == "*"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
157 return doMember(n[2][0].text, n[0][0].text, true, n.attr("values"))
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
158 elif n.len == 4:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
159 if n[0].text.strip() in ["struct", "const struct"]:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
160 return doMember(n[3][0].text, n[1][0].text, true, n.attr("values"))
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
161 else:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
162 assert n[0].text.strip() == "const" # can be ignored
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
163 assert n[1].tag == "type"
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
164 assert n[2].text.strip() in ["*", "* const *", "* const*"]
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
165 # can be ignored, basically every type is a pointer
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
166 assert n[3].tag == "name"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
167 assert n[1].len == 1
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
168 assert n[3].len == 1
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
169 return doMember(n[3][0].text, n[1][0].text, true, n.attr("values"))
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
170 elif n.len in [5, 6]:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
171 # array definition, using const-value for array length
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
172 # <type>uint8_t</type>,<name>pipelineCacheUUID</name>[<enum>VK_UUID_SIZE</enum>]
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
173 assert n[2].text.strip() == "["
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
174 assert n[4].text.strip() == "]"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
175 return doMember(
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
176 n[1][0].text,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
177 &"array[{n[3][0].text}, {doTypename(n[0][0].text, false)}]",
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
178 false,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
179 n.attr("values"),
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
180 )
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
181 assert false
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
182
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
183 for e in xmlenums:
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
184 if e.attr("type") == "constants":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
185 for c in e.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
186 var value = c.attr("value").strip(chars = {'(', ')'})
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
187 consts.add ConstantDef(
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
188 name: c.attr("name"), datatype: TYPEMAP[c.attr("type")], value: value
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
189 )
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
190 elif e.attr("type") == "enum":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
191 var edef = EnumDef(name: e.attr("name"), isBitmask: false)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
192 for ee in e.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
193 edef.addValue(ee)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
194 enums[edef.name] = edef
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
195 elif e.attr("type") == "bitmask":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
196 var edef = EnumDef(name: e.attr("name"), isBitmask: true)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
197 for ee in e.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
198 edef.addValue(ee)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
199 enums[edef.name] = edef
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
200
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
201 for f in features:
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
202 for extendenum in f.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
203 if extendenum.attr("extends") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
204 enums[extendenum.attr("extends")].addValue(extendenum)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
205
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
206 for extension in extensions.findAll("extension"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
207 let extNum = extension.attr("number")
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
208 for extendenum in extension.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
209 if extendenum.attr("extends") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
210 if extendenum.attr("extnumber") == "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
211 extendenum.attrs["extnumber"] = extNum
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
212 enums[extendenum.attr("extends")].addValue(extendenum)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
213
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
214 let outPath = (system.currentSourcePath.parentDir() / "vkapi.nim")
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
215 let outFile = open(outPath, fmWrite)
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
216
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
217 # generate core types ===============================================================================
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
218 # preamble, much easier to hardcode than to generate from xml
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
219 outFile.writeLine """
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
220
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
221 import ../semicongine/thirdparty/winim/winim/inc/winbase
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
222 import ../semicongine/thirdparty/winim/winim/inc/windef
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
223 import ../semicongine/thirdparty/x11/xlib
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
224 import ../semicongine/thirdparty/x11/x
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
225 import ../semicongine/thirdparty/x11/xrandr
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
226
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
227 func VK_MAKE_API_VERSION*(
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
228 variant: uint32, major: uint32, minor: uint32, patch: uint32
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
229 ): uint32 {.compileTime.} =
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
230 (variant shl 29) or (major shl 22) or (minor shl 12) or patch
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
231 """
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
232
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
233 outFile.writeLine "type"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
234 outFile.writeLine """
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
235 # some unused native types
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
236 #
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
237 # android
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
238 ANativeWindow = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
239 AHardwareBuffer = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
240
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
241 # apple
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
242 CAMetalLayer = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
243 MTLDevice = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
244 MTLCommandQueue = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
245 MTLBuffer = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
246 MTLTexture = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
247 MTLSharedEvent = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
248 MTLSharedEvent_id = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
249
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
250 # wayland
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
251 wl_display = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
252 wl_surface = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
253
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
254 # XCB
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
255 xcb_connection_t = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
256 xcb_window_t = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
257 xcb_visualid_t = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
258
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
259 # directfb
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
260 IDirectFB = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
261 IDirectFBSurface = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
262
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
263 # Zircon
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
264 zx_handle_t = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
265
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
266 # GGP C
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
267 GgpStreamDescriptor = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
268 GgpFrameToken = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
269
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
270 # Screen (nintendo switch?)
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
271 screen_context = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
272 screen_window = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
273 screen_buffer = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
274
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
275 # Nvidia
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
276 NvSciSyncAttrList = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
277 NvSciSyncObj = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
278 NvSciSyncFence = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
279 NvSciBufAttrList = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
280 NvSciBufObj = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
281
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
282 # some base vulkan base types
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
283 VkSampleMask = distinct uint32
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
284 VkBool32 = distinct uint32
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
285 VkFlags = distinct uint32
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
286 VkFlags64 = distinct uint64
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
287 VkDeviceSize = distinct uint64
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
288 VkDeviceAddress = distinct uint64
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
289 VkRemoteAddressNV = pointer
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
290 """
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
291
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
292 # generate consts ===============================================================================
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
293 outFile.writeLine "const"
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
294 for c in consts:
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
295 var value = c.value
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
296 if value.endsWith("U"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
297 value = value[0 ..^ 2] & "'u32"
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
298 elif value.endsWith("ULL"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
299 value = value[0 ..^ 4] & "'u64"
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
300 if value[0] == '~':
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
301 value = "not " & value[1 ..^ 1]
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
302 outFile.writeLine &" {c.name}*: {c.datatype} = {value}"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
303 outFile.writeLine ""
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
304
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
305 # generate enums ===============================================================================
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
306 const nameCollisions = [
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
307 "VK_PIPELINE_CACHE_HEADER_VERSION_ONE",
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
308 "VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE",
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
309 "VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT",
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
310 ]
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
311 outFile.writeLine "type"
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
312 for edef in enums.values():
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
313 if edef.values.len > 0:
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
314 outFile.writeLine &" {edef.name}* {{.size: 4.}} = enum"
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
315 for ee in edef.values:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
316 # due to the nim identifier-system, there might be collisions between typenames and enum-member names
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
317 if ee.name in nameCollisions:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
318 outFile.writeLine &" {ee.name}_VALUE = {ee.value}"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
319 else:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
320 outFile.writeLine &" {ee.name} = {ee.value}"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
321
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
322 outFile.writeLine ""
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
323
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
324 # generate types ===============================================================================
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
325 for t in types:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
326 let category = t.attr("category")
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
327 if t.attr("api") == "vulkansc":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
328 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
329 elif t.attr("deprecated") == "true":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
330 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
331 elif category == "include":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
332 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
333 elif category == "define":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
334 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
335 elif t.attr("requires").startsWith("vk_video"):
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
336 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
337 elif t.attr("alias") != "":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
338 let a = t.attr("alias")
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
339 let n = t.attr("name")
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
340 outFile.writeLine &" {n} = {a}"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
341 elif category == "bitmask":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
342 if t.len > 0 and t[0].text.startsWith("typedef"):
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
343 outFile.writeLine &" {t[2][0].text} = distinct {t[1][0].text}"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
344 elif category == "union":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
345 let n = t.attr("name")
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
346 outFile.writeLine &" {n}* {{.union.}} = object"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
347 for member in t.findAll("member"):
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
348 outFile.writeLine &" {member.memberDecl()}"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
349 elif category == "handle":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
350 outFile.writeLine &" {t[2][0].text} = distinct pointer"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
351 elif category == "struct":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
352 let n = t.attr("name")
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
353 outFile.writeLine &" {n}* = object"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
354 for member in t.findAll("member"):
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
355 if member.attr("api") == "vulkansc":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
356 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
357 outFile.writeLine &" {member.memberDecl()}"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
358 elif category == "funcpointer":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
359 #[
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
360 <type category="funcpointer">typedef void* (VKAPI_PTR *<name>PFN_vkAllocationFunction</name>)(
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
361 <type>void</type>* pUserData,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
362 <type>size_t</type> size,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
363 <type>size_t</type> alignment,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
364 <type>VkSystemAllocationScope</type> allocationScope);
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
365 </type>
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
366 PFN_vkAllocationFunction* = proc(
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
367 pUserData: pointer,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
368 size: csize_t,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
369 alignment: csize_t,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
370 allocationScope: VkSystemAllocationScope,
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
371 ): pointer {.cdecl.}
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
372 ]#
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
373 assert t[0].text.startsWith("typedef ")
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
374 outFile.writeLine &" {t[1][0].text}* = proc()"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
375 else:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
376 doAssert category in ["", "basetype", "enum"], "unknown type category: " & category
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
377 outFile.writeLine ""
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
378
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
379 outFile.writeLine """
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
380 when defined(linux):
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
381 include ../semicongine/rendering/vulkan/platform/xlib
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
382 when defined(windows):
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
383 include ../semicongine/rendering/vulkan/platform/win32
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
384 """
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
385
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
386 outFile.close()
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
387
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
388 assert execCmd("nim c " & outPath) == 0