annotate svk/generate.nim @ 1480:0b302531f5c5 default tip

did: continue on vulkan nim api generator
author sam <sam@basx.dev>
date Mon, 21 Apr 2025 01:31:55 +0700
parents 172ac338f820
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 "void*": "pointer",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
37 "char*": "cstring",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
38 "ptr char": "cstring",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
39 "ptr void": "pointer",
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
40 # "VK_DEFINE_HANDLE": "VkHandle", # not required, can directly defined as a distinct pointer, (in C is a pointer to an empty struct type)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
41 # "VK_DEFINE_NON_DISPATCHABLE_HANDLE": "VkNonDispatchableHandle", # same here
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
42 }.toTable
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
43
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
44 # load xml
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
45 let xml = (system.currentSourcePath.parentDir() / "vk.xml").loadXml()
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
46 let platforms = xml.findAll("platforms")[0]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
47 let types = xml.findAll("types")[0]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
48 let xmlenums = xml.findAll("enums")
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
49 let commands = xml.findAll("commands")[0]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
50 let features = xml.findAll("feature") # features has extends="<ENUM>"
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
51 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
52 let formats = xml.findAll("formats")[0]
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 # gather all enums
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
55
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
56 type
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
57 EnumEntry = object
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
58 name: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
59 value: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
60
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
61 EnumDef = object
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
62 name: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
63 values: seq[EnumEntry]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
64 isBitmask: bool
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
65
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
66 ConstantDef = object
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
67 name: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
68 datatype: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
69 value: string
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
70
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
71 var consts: seq[ConstantDef]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
72 var enums: Table[string, EnumDef]
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
73
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
74 func addValue(edef: var EnumDef, n: XmlNode) =
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
75 if n.attr("deprecated") != "aliased" and n.attr("alias") == "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
76 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
77 return
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
78 if n.attr("name").endsWith("_EXT") and
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
79 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
80 return
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
81
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
82 var value = ""
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
83 if n.attr("value") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
84 value = n.attr("value")
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
85 elif n.attr("bitpos") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
86 value = $(1 shl parseInt(n.attr("bitpos")))
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
87 elif n.attr("offset") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
88 var enumBase = 1000000000
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
89 if n.attr("extnumber") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
90 enumBase += (smartParseInt(n.attr("extnumber")) - 1) * 1000
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
91 var v = smartParseInt(n.attr("offset")) + enumBase
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
92 if n.attr("dir") == "-":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
93 v = -v
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
94 value = $(v)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
95
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
96 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
97
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
98 func memberDecl(n: XmlNode): string =
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
99 for i in 0 ..< n.len:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
100 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
101 n.delete(i)
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
102 break
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
103 assert n.tag == "member"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
104 debugecho n.toSeq, " ", n.len
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
105 if n.len == 2:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
106 return &"{n[1][0].text}: {n[0][0]}"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
107 elif n.len == 3:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
108 if n[1].kind == xnElement and n[1].tag == "name":
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
109 return
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
110 &"{n[1][0].text}: array[{n[2].text[1 ..< ^1]}, {TYPEMAP.getOrDefault(n[0][0].text, n[0][0].text)}]]"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
111 else:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
112 assert n[1].text.strip() == "*"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
113 return &"{n[2][0].text}: ptr {n[0][0].text}"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
114 elif n.len == 4:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
115 if n[0].text.strip() in ["struct", "const struct"]:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
116 return &"{n[3][0].text}: ptr {n[1][0].text}"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
117 else:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
118 assert n[2].text.strip() in ["*", "* const *", "* const*"]
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
119 return &"?"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
120 elif n.len in [5, 6]:
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
121 return &"{n[1][0].text}: array[{n[3][0].text}, {n[0][0].text}]"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
122 assert false
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
123
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
124 for e in xmlenums:
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
125 if e.attr("type") == "constants":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
126 for c in e.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
127 var value = c.attr("value").strip(chars = {'(', ')'})
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
128 consts.add ConstantDef(
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
129 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
130 )
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
131 elif e.attr("type") == "enum":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
132 var edef = EnumDef(name: e.attr("name"), isBitmask: false)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
133 for ee in e.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
134 edef.addValue(ee)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
135 enums[edef.name] = edef
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
136 elif e.attr("type") == "bitmask":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
137 var edef = EnumDef(name: e.attr("name"), isBitmask: true)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
138 for ee in e.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
139 edef.addValue(ee)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
140 enums[edef.name] = edef
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
141
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
142 for f in features:
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
143 for extendenum in f.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
144 if extendenum.attr("extends") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
145 enums[extendenum.attr("extends")].addValue(extendenum)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
146
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
147 for extension in extensions.findAll("extension"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
148 let extNum = extension.attr("number")
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
149 for extendenum in extension.findAll("enum"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
150 if extendenum.attr("extends") != "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
151 if extendenum.attr("extnumber") == "":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
152 extendenum.attrs["extnumber"] = extNum
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
153 enums[extendenum.attr("extends")].addValue(extendenum)
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
154
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
155 let outPath = (system.currentSourcePath.parentDir() / "api.nim")
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
156 let outFile = open(outPath, fmWrite)
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
157
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
158 # generate core types ===============================================================================
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
159 # 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
160 outFile.writeLine """
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
161 func VK_MAKE_API_VERSION*(
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
162 variant: uint32, major: uint32, minor: uint32, patch: uint32
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
163 ): uint32 {.compileTime.} =
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
164 (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
165 """
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
166
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
167 outFile.writeLine "type"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
168 outFile.writeLine """
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
169 VkSampleMask = distinct uint32
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
170 VkBool32 = distinct uint32
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
171 VkFlags = distinct uint32
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
172 VkFlags64 = distinct uint64
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
173 VkDeviceSize = distinct uint64
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
174 VkDeviceAddress = distinct uint64
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
175 VkRemoteAddressNV = pointer
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
176 """
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
177
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
178 for t in types:
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
179 if t.attr("api") == "vulkansc":
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
180 continue
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
181 if t.attr("alias") != "":
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
182 continue
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
183 if t.attr("deprecated") == "true":
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
184 continue
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
185 if t.attr("category") == "include":
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
186 continue
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
187 if t.attr("category") == "define":
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
188 continue
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
189 if t.attr("category") == "bitmask":
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
190 if t.len > 0 and t[0].text.startsWith("typedef"):
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
191 outFile.writeLine &" {t[2][0].text} = distinct {t[1][0].text}"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
192 elif t.attr("category") == "union":
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
193 let n = t.attr("name")
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
194 outFile.writeLine &" {n}* {{.union.}} = object"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
195 for member in t.findAll("member"):
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
196 outFile.writeLine &" {member.memberDecl()}"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
197 elif t.attr("category") == "handle":
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
198 outFile.writeLine &" {t[2][0].text} = distinct pointer"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
199 elif t.attr("category") == "struct":
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
200 let n = t.attr("name")
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
201 outFile.writeLine &" {n}* = object"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
202 for member in t.findAll("member"):
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
203 outFile.writeLine &" {member.memberDecl()}"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
204 # TODO: funcpointer
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
205
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
206 outFile.writeLine ""
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
207
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
208 # generate consts ===============================================================================
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
209 outFile.writeLine "const"
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
210 for c in consts:
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
211 var value = c.value
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
212 if value.endsWith("U"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
213 value = value[0 ..^ 2] & "'u32"
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
214 elif value.endsWith("ULL"):
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
215 value = value[0 ..^ 4] & "'u64"
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
216 if value[0] == '~':
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
217 value = "not " & value[1 ..^ 1]
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
218 outFile.writeLine &" {c.name}*: {c.datatype} = {value}"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
219 outFile.writeLine ""
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
220
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
221 # generate enums ===============================================================================
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
222 outFile.writeLine "type"
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
223 for edef in enums.values():
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
224 if edef.values.len > 0:
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
225 outFile.writeLine &" {edef.name}* {{.size: 4.}} = enum"
1479
172ac338f820 add: prep to add new vulkan api
sam <sam@basx.dev>
parents:
diff changeset
226 for ee in edef.values:
1480
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
227 outFile.writeLine &" {ee.name} = {ee.value}"
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
228 outFile.writeLine ""
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
229
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
230 outFile.writeLine """
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
231 when defined(linux):
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
232 include ../semicongine/rendering/vulkan/platform/xlib
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
233 when defined(windows):
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
234 include ../semicongine/rendering/vulkan/platform/win32
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
235 """
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
236
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
237 outFile.close()
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
238
0b302531f5c5 did: continue on vulkan nim api generator
sam <sam@basx.dev>
parents: 1479
diff changeset
239 assert execCmd("nim c " & outPath) == 0