annotate svk/generate.nim @ 1489:e6bd1f553c1b default tip main

add: quite a bit more wrapper
author sam <sam@basx.dev>
date Sun, 18 May 2025 23:47:16 +0700
parents 3ce7c132fdac
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 # load xml
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
38 let xml = (system.currentSourcePath.parentDir() / "vk.xml").loadXml()
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
39 let platforms = xml.findAll("platforms")[0]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
40 let types = xml.findAll("types")[0]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
41 let xmlenums = xml.findAll("enums")
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
42 let commands = xml.findAll("commands")[0]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
43 let features = xml.findAll("feature") # features has extends="<ENUM>"
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
44 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
45 let formats = xml.findAll("formats")[0]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
46
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
47 # gather all enums
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
48
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
49 type
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
50 EnumEntry = object
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
51 name: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
52 value: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
53
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
54 EnumDef = object
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
55 name: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
56 values: seq[EnumEntry]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
57 isBitmask: bool
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
58 nBytes: int = 4
1479
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
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
73 var value = ""
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
74 if n.attr("value") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
75 value = n.attr("value")
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
76 elif n.attr("bitpos") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
77 value = $(1 shl parseInt(n.attr("bitpos")))
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
78 elif n.attr("offset") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
79 var enumBase = 1000000000
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
80 if n.attr("extnumber") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
81 enumBase += (smartParseInt(n.attr("extnumber")) - 1) * 1000
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
82 var v = smartParseInt(n.attr("offset")) + enumBase
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
83 if n.attr("dir") == "-":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
84 v = -v
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
85 value = $(v)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
86
1482
bca8f65ed4ed did: continue on generator
sam <sam@basx.dev>
parents: 1481
diff changeset
87 if value notin edef.values.mapIt(it.value):
bca8f65ed4ed did: continue on generator
sam <sam@basx.dev>
parents: 1481
diff changeset
88 edef.values.add EnumEntry(name: n.attr("name"), value: value)
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
89
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
90 func doTypename(typename: string, pointerType: int): string =
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
91 ## pointerType == 0: no pointer
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
92 ## pointerType == 1: normal pointer (e.g. char *)
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
93 ## pointerType == 2: double pointer (e.g. void **)
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
94 assert pointerType in [0, 1, 2]
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
95 result = TYPEMAP.getOrDefault(typename.strip(), typename.strip()).strip(chars = {'_'})
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
96
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
97 if typename == "void":
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
98 assert pointerType > 0
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
99
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
100 if pointerType > 0:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
101 if typename == "void":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
102 result = "pointer"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
103 elif typename == "char":
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
104 if pointerType == 1:
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
105 result = "cstring"
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
106 elif pointerType == 2:
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
107 result = "cstringArray"
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
108 else:
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
109 assert false, "Unsupported char pointer type"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
110 else:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
111 result = "ptr " & result
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
112
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
113 if pointerType == 2 and typename != "char":
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
114 result = "ptr " & result
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
115
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
116 func doIdentifier(typename: string): string =
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
117 if typename in ["type", "object"]:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
118 return &"`{typename}`"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
119 return typename.strip()
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
120
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
121 func doMember(typename, theType: string, pointerType: int, value: string): string =
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
122 if value == "":
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
123 &"{doIdentifier(typename)}: {doTypename(theType, pointerType)}"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
124 else:
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
125 &"{doIdentifier(typename)}: {doTypename(theType, pointerType)} = {value}"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
126
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
127 func memberDecl(n: XmlNode): string =
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
128 for i in 0 ..< n.len:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
129 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
130 n.delete(i)
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
131 break
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
132 assert n.tag == "member"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
133 if n.len == 2:
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
134 return doMember(n[1][0].text, n[0][0].text, 0, n.attr("values"))
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
135 elif n.len == 3:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
136 assert "*" notin n[0][0].text.strip()
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
137 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
138 # bitfield
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
139 if n[2].text.strip().startsWith(":"):
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
140 return
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
141 &"{doIdentifier(n[1][0].text)} {{.bitsize:{n[2].text.strip()[1 .. ^1]}.}}: {doTypename(n[0][0].text, 0)}"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
142 # array definition
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
143 elif n[2].text.strip().startsWith("["):
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
144 let arrayDim = n[2].text[1 ..< ^1]
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
145 if "][" in arrayDim:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
146 let dims = arrayDim.split("][", 1)
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
147 let (dim1, dim2) = (dims[0], dims[1])
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
148 return doMember(
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
149 n[1][0].text,
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
150 &"array[{dim1}, array[{dim2}, {doTypename(n[0][0].text, 0)}]]",
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
151 0,
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
152 n.attr("values"),
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
153 )
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
154 else:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
155 return doMember(
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
156 n[1][0].text,
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
157 &"array[{arrayDim}, {doTypename(n[0][0].text, 0)}]",
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
158 0,
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
159 n.attr("values"),
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
160 )
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
161 else:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
162 debugecho n.toSeq
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
163 doAssert false, "This should not happen"
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
164 else:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
165 # pointer definition
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
166 assert n[1].text.strip() == "*"
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
167 return doMember(n[2][0].text, n[0][0].text, 1, n.attr("values"))
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
168 elif n.len == 4:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
169 if n[0].text.strip() in ["struct", "const struct"]:
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
170 return doMember(n[3][0].text, n[1][0].text, 1, n.attr("values"))
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
171 else:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
172 assert n[0].text.strip() == "const" # can be ignored
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
173 assert n[1].tag == "type"
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
174 assert n[2].text.strip() in ["*", "* const *", "* const*"]
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
175 assert n[3].tag == "name"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
176 assert n[1].len == 1
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
177 assert n[3].len == 1
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
178 return doMember(
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
179 n[3][0].text, n[1][0].text, n[2].text.strip().count("*"), n.attr("values")
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
180 )
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
181 elif n.len in [5, 6]:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
182 # array definition, using const-value for array length
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
183 # <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
184 assert n[2].text.strip() == "["
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
185 assert n[4].text.strip() == "]"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
186 return doMember(
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
187 n[1][0].text,
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
188 &"array[{n[3][0].text}, {doTypename(n[0][0].text, 0)}]",
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
189 0,
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
190 n.attr("values"),
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
191 )
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
192 assert false
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
193
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
194 for e in xmlenums:
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
195 if e.attr("type") == "constants":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
196 for c in e.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
197 var value = c.attr("value").strip(chars = {'(', ')'})
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
198 consts.add ConstantDef(
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
199 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
200 )
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
201 elif e.attr("type") == "enum":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
202 var edef = EnumDef(name: e.attr("name"), isBitmask: false)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
203 for ee in e.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
204 edef.addValue(ee)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
205 enums[edef.name] = edef
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
206 elif e.attr("type") == "bitmask":
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
207 let nBytes = if e.attr("bitwidth") == "": 4 else: parseInt(e.attr("bitwidth")) div 8
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
208 var edef = EnumDef(name: e.attr("name"), isBitmask: true, nBytes: nBytes)
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
209 for ee in e.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
210 edef.addValue(ee)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
211 enums[edef.name] = edef
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
212
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
213 for f in features:
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
214 for extendenum in f.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
215 if extendenum.attr("extends") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
216 enums[extendenum.attr("extends")].addValue(extendenum)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
217
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
218 var extensionLoaders: seq[(string, seq[string])]
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
219
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
220 for extension in extensions.findAll("extension"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
221 let extNum = extension.attr("number")
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
222 extensionLoaders.add (extension.attr("name"), newSeq[string]())
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
223 for c in extension.findAll("command"):
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
224 if "Video" notin c.attr("name"):
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
225 extensionLoaders[^1][1].add c.attr("name")
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
226
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
227 for extendenum in extension.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
228 if extendenum.attr("extends") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
229 if extendenum.attr("extnumber") == "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
230 extendenum.attrs["extnumber"] = extNum
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
231 enums[extendenum.attr("extends")].addValue(extendenum)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
232
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
233 let outPath = (system.currentSourcePath.parentDir() / "vkapi.nim")
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
234 let outFile = open(outPath, fmWrite)
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
235
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
236 # generate core types ===============================================================================
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
237 # 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
238 outFile.writeLine """
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
239
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
240 import std/dynlib
1487
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
241 import std/macros
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
242 import std/typetraits
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
243
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
244 import ../semicongine/thirdparty/winim/winim/inc/winbase
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
245 import ../semicongine/thirdparty/winim/winim/inc/windef
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
246 import ../semicongine/thirdparty/x11/xlib
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
247 import ../semicongine/thirdparty/x11/x
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
248 import ../semicongine/thirdparty/x11/xrandr
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
249
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
250 func VK_MAKE_API_VERSION*(
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
251 variant: uint32, major: uint32, minor: uint32, patch: uint32
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
252 ): uint32 =
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
253 (variant shl 29) or (major shl 22) or (minor shl 12) or patch
1487
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
254
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
255 macro enumFullRange(a: typed): untyped =
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
256 newNimNode(nnkBracket).add(a.getType[1][1 ..^ 1])
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
257
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
258 """
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
259
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
260 outFile.writeLine "type"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
261 outFile.writeLine """
1487
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
262
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
263 # some unused native types
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
264 #
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
265 # android
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
266 ANativeWindow = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
267 AHardwareBuffer = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
268
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
269 # apple/metal
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
270 CAMetalLayer = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
271 MTLSharedEvent_id = object
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
272 MTLDevice_id = object
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
273 MTLCommandQueue_id = object
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
274 MTLBuffer_id = object
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
275 MTLTexture_id = object
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
276 IOSurfaceRef = object
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
277
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
278 # wayland
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
279 wl_display = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
280 wl_surface = 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 # XCB
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
283 xcb_connection_t = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
284 xcb_window_t = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
285 xcb_visualid_t = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
286
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
287 # directfb
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
288 IDirectFB = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
289 IDirectFBSurface = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
290
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
291 # Zircon
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
292 zx_handle_t = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
293
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
294 # GGP C
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
295 GgpStreamDescriptor = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
296 GgpFrameToken = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
297
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
298 # Screen (nintendo switch?)
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
299 screen_context = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
300 screen_window = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
301 screen_buffer = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
302
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
303 # Nvidia
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
304 NvSciSyncAttrList = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
305 NvSciSyncObj = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
306 NvSciSyncFence = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
307 NvSciBufAttrList = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
308 NvSciBufObj = object
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
309
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
310 # some base vulkan base types
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
311 VkSampleMask* = distinct uint32
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
312 VkBool32* = distinct uint32
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
313 VkFlags* = distinct uint32
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
314 VkFlags64* = distinct uint64
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
315 VkDeviceSize* = distinct uint64
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
316 VkDeviceAddress* = distinct uint64
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
317 VkRemoteAddressNV* = pointer
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
318 """
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
319
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
320 # generate consts ===============================================================================
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
321 outFile.writeLine "const"
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
322 for c in consts:
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
323 var value = c.value
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
324 if value.endsWith("U"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
325 value = value[0 ..^ 2] & "'u32"
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
326 elif value.endsWith("ULL"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
327 value = value[0 ..^ 4] & "'u64"
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
328 if value[0] == '~':
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
329 value = "not " & value[1 ..^ 1]
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
330 if c.name in ["VK_TRUE", "VK_FALSE"]:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
331 outFile.writeLine &" {c.name}*: VkBool32 = VkBool32({value})"
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
332 else:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
333 outFile.writeLine &" {c.name}*: {c.datatype} = {value}"
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
334 outFile.writeLine ""
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
335
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
336 # generate enums ===============================================================================
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
337 const nameCollisions = [
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
338 "VK_PIPELINE_CACHE_HEADER_VERSION_ONE",
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
339 "VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE",
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
340 "VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT",
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
341 ]
1482
bca8f65ed4ed did: continue on generator
sam <sam@basx.dev>
parents: 1481
diff changeset
342
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
343 for edef in enums.values():
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
344 if edef.values.len > 0:
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
345 outFile.writeLine &"type {edef.name}* {{.size: {edef.nBytes}.}} = enum"
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
346 for ee in edef.values:
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
347 # 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
348 if ee.name in nameCollisions:
1487
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
349 outFile.writeLine &" {ee.name}_VALUE = {ee.value}"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
350 else:
1487
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
351 outFile.writeLine &" {ee.name} = {ee.value}"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
352
1487
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
353 outFile.writeLine "type"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
354
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
355 # generate types ===============================================================================
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
356 var stringConverters: seq[string]
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
357 for t in types:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
358 let category = t.attr("category")
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
359 let tName = t.attr("name")
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
360 if tName.startsWith("VkVideo"): # we are not doing the video API, sorry
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
361 continue
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
362 if tName.startsWith("VkPhysicalDeviceVideo"): # we are not doing the video API, sorry
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
363 continue
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
364 if t.attr("api") == "vulkansc":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
365 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
366 elif t.attr("deprecated") == "true":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
367 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
368 elif category == "include":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
369 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
370 elif category == "define":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
371 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
372 elif t.attr("requires").startsWith("vk_video"):
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
373 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
374 elif t.attr("alias") != "":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
375 let a = t.attr("alias")
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
376 outFile.writeLine &" {tName}* = {a}"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
377 elif category == "bitmask":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
378 if t.len > 0 and t[0].text.startsWith("typedef"):
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
379 outFile.writeLine &" {t[2][0].text.strip()}* = distinct {t[1][0].text.strip()}"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
380 elif category == "union":
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
381 outFile.writeLine &" {tName}* {{.union.}} = object"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
382 for member in t.findAll("member"):
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
383 outFile.writeLine &" {member.memberDecl()}"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
384 elif category == "handle":
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
385 outFile.writeLine &" {t[2][0].text.strip()} = distinct pointer"
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
386 stringConverters.add t[2][0].text.strip()
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
387 elif category == "struct":
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
388 outFile.writeLine &" {tName}* = object"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
389 for member in t.findAll("member"):
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
390 if member.attr("api") == "vulkansc":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
391 continue
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
392 outFile.writeLine &" {member.memberDecl()}"
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
393 elif category == "funcpointer":
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
394 assert t[0].text.startsWith("typedef ")
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
395 let retName = t[0].text[8 ..< ^13].strip()
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
396 let funcName = t.findAll("name")[0][0].text
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
397
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
398 outFile.write &" {funcname}* = proc("
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
399 let nParams = (t.len - 3) div 2
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
400 for i in 0 ..< nParams:
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
401 assert t[i * 2 + 3].tag == "type"
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
402 let typename = t[i * 2 + 3][0].text.strip()
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
403 var identifier = t[i * 2 + 4].text.strip(chars = {' ', ')', ';', ',', '\n'})
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
404 var pointerType = if identifier.startsWith("*"): 1 else: 0
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
405 if pointerType > 0:
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
406 identifier = identifier[1 .. ^1].strip(chars = {' ', ')', ';', ',', '\n'})
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
407 if identifier.endsWith("const"):
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
408 identifier = identifier[0 .. ^6].strip(chars = {' ', ')', ';', ',', '\n'})
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
409 identifier = identifier.strip(chars = {','})
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
410 outFile.write &"{doIdentifier(identifier)}: {doTypename(typename, pointerType)}, "
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
411
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
412 if retName == "void":
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
413 outFile.writeLine &") {{.cdecl.}}"
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
414 elif retName == "void*":
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
415 outFile.writeLine &"): pointer {{.cdecl.}}"
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
416 else:
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
417 outFile.writeLine &"): {doTypename(retName, 0)} {{.cdecl.}}"
1481
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
418 else:
a99f3227130c did: continue on vulkan-api generator
sam <sam@basx.dev>
parents: 1480
diff changeset
419 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
420 outFile.writeLine ""
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
421
1487
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
422 for edef in enums.values():
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
423 if edef.values.len > 0:
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
424 if edef.isBitmask:
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
425 let enumName = edef.name
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
426 let p = enumName.rfind("FlagBits")
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
427 let flagSetType = enumName[0 ..< p] & "Flags" & enumName[p + 8 .. ^1]
1487
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
428
1489
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
429 outFile.writeLine &"""
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
430 func `or`(a: {flagSetType}, b: {enumName}): {flagSetType} {{.hint[XDeclaredButNotUsed]: off.}} =
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
431 {flagSetType}(distinctBase({flagSetType})(a) or distinctBase({flagSetType})(b))
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
432 func `or`(a, b: {enumName}): {flagSetType} {{.hint[XDeclaredButNotUsed]: off.}} =
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
433 {flagSetType}(distinctBase({flagSetType})(a) or distinctBase({flagSetType})(b))
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
434 func contains(flags: {flagSetType}, flag: {enumName}): bool {{.hint[XDeclaredButNotUsed]: off.}} =
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
435 (distinctBase({flagSetType})(flags) and distinctBase({flagSetType})(flag)) > 0
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
436 """
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
437 outFile.writeLine &"func `$`*(bits: {flagSetType}): string ="
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
438 outFile.writeLine &"""
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
439 for value in enumFullRange({enumName}):
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
440 if (value.ord and cint(bits)) > 0:
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
441 result &= $value & "|"
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
442 result.setLen(max(0, result.len - 1))
e6bd1f553c1b add: quite a bit more wrapper
sam <sam@basx.dev>
parents: 1488
diff changeset
443 """
1487
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
444 outFile.writeLine ""
f786797a0cbe did: stuff
sam <sam@basx.dev>
parents: 1486
diff changeset
445
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
446 for command in commands:
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
447 if command.attr("api") == "vulkansc":
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
448 continue
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
449 if command.attr("alias") != "":
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
450 let funcName = command.attr("name")
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
451 let funcAlias = command.attr("alias")
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
452 outFile.write &"var {funcName}* = {funcAlias}\n"
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
453 continue
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
454
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
455 let proto = command.findAll("proto")[0]
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
456 let retType = proto.findAll("type")[0][0].text.strip()
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
457 let funcName = proto.findAll("name")[0][0].text.strip()
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
458
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
459 if "Video" in funcName: # Video API not supported at this time
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
460 continue
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
461
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
462 outFile.write &"var {funcName}*: proc("
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
463 for param in command:
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
464 if param.tag != "param":
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
465 continue
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
466 if param.attr("api") == "vulkansc":
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
467 continue
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
468 assert param.len in [2, 3, 4]
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
469 let paramType = param.findAll("type")[0][0].text
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
470 let paramName = param.findAll("name")[0][0].text
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
471 assert "*" notin paramType, $param
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
472
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
473 if param.len == 4:
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
474 param.delete(0)
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
475
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
476 var pointerType = 0
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
477
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
478 if param.len == 3:
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
479 if param[param.len - 1].kind == xnText:
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
480 assert param[param.len - 1].text[^1] == ']'
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
481 else:
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
482 assert param[0].tag == "type"
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
483 assert param[param.len - 1].tag == "name"
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
484 if param[1].text.strip() == "*":
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
485 pointerType = 1
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
486 elif param[1].text.strip() == "**":
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
487 pointerType = 2
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
488 # echo "3: ", param[1].text, " ", paramType, " ", paramName
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
489 outFile.write &"{doIdentifier(paramName)}: {doTypename(paramType, pointerType)}, "
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
490
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
491 outFile.write &")"
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
492 if retType != "void":
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
493 assert "*" notin retType
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
494 outFile.write &": {doTypename(retType, 0)}"
1483
55911f736a5a add: more shit
sam <sam@basx.dev>
parents: 1482
diff changeset
495 outFile.write " {.stdcall.}\n"
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
496
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
497 outFile.write """
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
498
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
499 proc loadFunc[T](instance: VkInstance, f: var T, name: string) =
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
500 f = cast[T](vkGetInstanceProcAddr(instance, name))
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
501
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
502 proc initVulkanLoader*() =
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
503 if vkGetInstanceProcAddr != nil:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
504 return
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
505
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
506 when defined(linux):
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
507 let vulkanLib = loadLib("libvulkan.so.1")
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
508 when defined(windows):
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
509 let vulkanLib = loadLib("vulkan-1.dll")
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
510 if vulkanLib == nil:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
511 raise newException(Exception, "Unable to load vulkan library")
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
512
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
513 # init two global functions
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
514 vkGetInstanceProcAddr = cast[proc(instance: VkInstance, pName: cstring, ): PFN_vkVoidFunction {.stdcall.}](checkedSymAddr(vulkanLib, "vkGetInstanceProcAddr"))
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
515
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
516 loadFunc(VkInstance(nil), vkCreateInstance, "vkCreateInstance")
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
517
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
518 """
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
519
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
520 for f in features:
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
521 let name = f.attr("name").replace(",", "_")
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
522 if f.attr("struct") != "":
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
523 continue
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
524 outFile.writeLine &"proc load_{name}(instance: VkInstance) ="
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
525 var hasEntries = false
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
526 for cmd in f.findAll("command"):
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
527 if cmd.attr("name") == "vkCreateInstance":
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
528 continue
1485
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
529 hasEntries = true
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
530 let cName = cmd.attr("name")
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
531 outFile.writeLine &" loadFunc(instance, {cName}, \"{cName}\")"
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
532 if not hasEntries:
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
533 outFile.writeLine " discard"
6e062a84c157 add: more api-starting
sam <sam@basx.dev>
parents: 1484
diff changeset
534 outFile.writeLine ""
1484
a2af327f19df add: final raw wrapper
sam <sam@basx.dev>
parents: 1483
diff changeset
535
1486
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
536 for (extName, commands) in extensionLoaders:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
537 outFile.writeLine &"proc load_{extName}(instance: VkInstance) ="
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
538 for c in commands:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
539 outFile.writeLine &" loadFunc(instance, {c}, \"{c}\")"
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
540 if commands.len == 0:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
541 outFile.writeLine &" discard"
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
542 outFile.writeLine ""
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
543
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
544 outFile.writeLine "const EXTENSION_LOADERS = {"
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
545 for (extName, commands) in extensionLoaders:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
546 outFile.writeLine &" \"{extName}\": load_{extName},"
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
547 outFile.writeLine "}.toTable"
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
548 outFile.writeLine ""
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
549
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
550 outFile.writeLine "proc loadExtension*(instance: VkInstance, name: string) ="
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
551 outFile.writeLine " assert name in EXTENSION_LOADERS"
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
552 outFile.writeLine " EXTENSION_LOADERS[name](instance)"
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
553 outFile.writeLine ""
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
554
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
555 for strCon in stringConverters:
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
556 outFile.writeLine &"""proc `$`*(v: {strCon}): string = "0x" & cast[uint](v).toHex()"""
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
557 outFile.writeLine ""
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
558
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
559 outFile.writeLine ""
0ba3f0b2be2e did: more
sam <sam@basx.dev>
parents: 1485
diff changeset
560
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
561 outFile.close()
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
562
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
563 assert execCmd("nim c " & outPath) == 0