| Jesse Hall | d27f6aa | 2015-08-15 17:58:48 -0700 | [diff] [blame] | 1 | {{Include "vulkan_common.tmpl"}} | 
|  | 2 | {{Macro "DefineGlobals" $}} | 
|  | 3 | {{$ | Macro "vk.xml" | Reflow 4 | Write "vk.xml"}} | 
|  | 4 |  | 
|  | 5 |  | 
|  | 6 | {{/* | 
|  | 7 | ------------------------------------------------------------------------------- | 
|  | 8 | Entry point | 
|  | 9 | ------------------------------------------------------------------------------- | 
|  | 10 | */}} | 
|  | 11 | {{define "vk.xml"}} | 
|  | 12 | <?xml version="1.0" encoding="UTF-8"?> | 
|  | 13 | <registry> | 
|  | 14 | »<comment>« | 
|  | 15 | Copyright (c) 2015 The Khronos Group Inc. | 
|  | 16 | ¶ | 
|  | 17 | Permission is hereby granted, free of charge, to any person obtaining a | 
|  | 18 | copy of this software and/or associated documentation files (the | 
|  | 19 | "Materials"), to deal in the Materials without restriction, including | 
|  | 20 | without limitation the rights to use, copy, modify, merge, publish, | 
|  | 21 | distribute, sublicense, and/or sell copies of the Materials, and to | 
|  | 22 | permit persons to whom the Materials are furnished to do so, subject to | 
|  | 23 | the following conditions: | 
|  | 24 | ¶ | 
|  | 25 | The above copyright notice and this permission notice shall be included | 
|  | 26 | in all copies or substantial portions of the Materials. | 
|  | 27 | ¶ | 
|  | 28 | THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 
|  | 29 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 
|  | 30 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | 
|  | 31 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | 
|  | 32 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | 
|  | 33 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | 
|  | 34 | MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. | 
|  | 35 | ¶ | 
|  | 36 | ------------------------------------------------------------------------ | 
|  | 37 | ¶ | 
|  | 38 | This file, vk.xml, is the Vulkan API Registry.» | 
|  | 39 | </comment> | 
|  | 40 | ¶ | 
|  | 41 | <!-- SECTION: Vulkan type definitions --> | 
|  | 42 | <types>» | 
|  | 43 | <type name="vk_platform" category="include">#include "vk_platform.h"</type> | 
|  | 44 | ¶ | 
|  | 45 | <type category="define">#define <name>VK_MAKE_VERSION</name>(major, minor, patch) \ | 
|  | 46 | «((major << 22) | (minor << 12) | patch)</type>» | 
|  | 47 | ¶ | 
|  | 48 | <type category="define">// Vulkan API version supported by this file«« | 
|  | 49 | #define <name>VK_API_VERSION</name> <type>VK_MAKE_VERSION</type>({{Global "VERSION_MAJOR"}}, {{Global "VERSION_MINOR"}}, {{Global "VERSION_PATCH"}})</type> | 
|  | 50 | ¶ | 
|  | 51 | »»<type category="define">«« | 
|  | 52 | #if (_MSC_VER >= 1800 || __cplusplus >= 201103L) | 
|  | 53 | #define <name>VK_NONDISP_HANDLE_OPERATOR_BOOL</name>() explicit operator bool() const { return handle != 0; } | 
|  | 54 | #else | 
|  | 55 | #define VK_NONDISP_HANDLE_OPERATOR_BOOL() | 
|  | 56 | «#endif | 
|  | 57 | »»»</type> | 
|  | 58 | ¶ | 
|  | 59 | <type category="define">««« | 
|  | 60 | #define <name>VK_DEFINE_HANDLE</name>(obj) typedef struct obj##_T* obj;</type> | 
|  | 61 | »»»<type category="define">««« | 
|  | 62 | #if defined(__cplusplus) | 
|  | 63 | »»#if (_MSC_VER >= 1800 || __cplusplus >= 201103L) | 
|  | 64 | »// The bool operator only works if there are no implicit conversions from an obj to | 
|  | 65 | // a bool-compatible type, which can then be used to unintentionally violate type safety. | 
|  | 66 | // C++11 and above supports the "explicit" keyword on conversion operators to stop this | 
|  | 67 | // from happening. Otherwise users of C++ below C++11 won't get direct access to evaluating | 
|  | 68 | // the object handle as a bool in expressions like: | 
|  | 69 | //     if (obj) vkDestroy(obj); | 
|  | 70 | #define VK_NONDISP_HANDLE_OPERATOR_BOOL() explicit operator bool() const { return handle != 0; } | 
| Jesse Hall | 5ae3abb | 2015-10-08 14:00:22 -0700 | [diff] [blame] | 71 | #define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \ | 
|  | 72 | explicit obj(uint64_t x) : handle(x) { } \ | 
|  | 73 | obj(decltype(nullptr)) : handle(0) { } | 
| Jesse Hall | d27f6aa | 2015-08-15 17:58:48 -0700 | [diff] [blame] | 74 | «#else» | 
|  | 75 | #define VK_NONDISP_HANDLE_OPERATOR_BOOL() | 
| Jesse Hall | 5ae3abb | 2015-10-08 14:00:22 -0700 | [diff] [blame] | 76 | #define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \ | 
|  | 77 | obj(uint64_t x) : handle(x) { } | 
| Jesse Hall | d27f6aa | 2015-08-15 17:58:48 -0700 | [diff] [blame] | 78 | «#endif | 
|  | 79 | #define <name>VK_DEFINE_NONDISP_HANDLE</name>(obj) \» | 
|  | 80 | struct obj { \ | 
|  | 81 | obj() { } \ | 
| Jesse Hall | 5ae3abb | 2015-10-08 14:00:22 -0700 | [diff] [blame] | 82 | VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \ | 
| Jesse Hall | d27f6aa | 2015-08-15 17:58:48 -0700 | [diff] [blame] | 83 | obj& operator =(uint64_t x) { handle = x; return *this; } \ | 
|  | 84 | bool operator==(const obj& other) const { return handle == other.handle; } \ | 
|  | 85 | bool operator!=(const obj& other) const { return handle != other.handle; } \ | 
|  | 86 | bool operator!() const { return !handle; } \ | 
|  | 87 | VK_NONDISP_HANDLE_OPERATOR_BOOL() \ | 
|  | 88 | uint64_t handle; \ | 
|  | 89 | }; | 
|  | 90 | ««#else | 
|  | 91 | »#define VK_DEFINE_NONDISP_HANDLE(obj) typedef struct obj##_T { uint64_t handle; } obj;« | 
|  | 92 | #endif | 
|  | 93 | »»</type> | 
|  | 94 | ¶ | 
| Jesse Hall | 5ae3abb | 2015-10-08 14:00:22 -0700 | [diff] [blame] | 95 | <type category="define"> | 
|  | 96 | #if defined(__cplusplus) && ((defined(_MSC_VER) && _MSC_VER >= 1800) || __cplusplus >= 201103L) | 
|  | 97 | »#define <name>VK_NULL_HANDLE</name> nullptr | 
|  | 98 | «#else | 
|  | 99 | »#define VK_NULL_HANDLE 0 | 
|  | 100 | «#endif | 
|  | 101 | »»</type> | 
|  | 102 | ¶ | 
| Jesse Hall | d27f6aa | 2015-08-15 17:58:48 -0700 | [diff] [blame] | 103 | <type requires="vk_platform" name="VkDeviceSize"/> | 
|  | 104 | <type requires="vk_platform" name="VkSampleMask"/> | 
|  | 105 | <type requires="vk_platform" name="VkFlags"/> | 
|  | 106 | <!-- Basic C types, pulled in via vk_platform.h --> | 
|  | 107 | <type requires="vk_platform" name="char"/> | 
|  | 108 | <type requires="vk_platform" name="float"/> | 
|  | 109 | <type requires="vk_platform" name="VkBool32"/> | 
|  | 110 | <type requires="vk_platform" name="uint8_t"/> | 
|  | 111 | <type requires="vk_platform" name="uint32_t"/> | 
|  | 112 | <type requires="vk_platform" name="uint64_t"/> | 
|  | 113 | <type requires="vk_platform" name="int32_t"/> | 
|  | 114 | <type requires="vk_platform" name="size_t"/> | 
|  | 115 | <!-- Bitfield types --> | 
|  | 116 | {{range $e := $.Enums}} | 
|  | 117 | {{if $e.IsBitfield}} | 
|  | 118 | {{$bits := print (Macro "EnumName" $e | TrimRight "s") "Bits"}} | 
|  | 119 | <type{{if $e.Entries}} requires="{{$bits}}"{{end}} category="bitmask">typedef <type>VkFlags</type> <name>{{$e.Name}}</name>;</type>§ | 
|  | 120 | {{if $e.Entries}}{{Macro "XML.Docs" $e.Docs}} | 
|  | 121 | {{else}}{{Macro "XML.Docs" (Strings $e.Docs "(no bits yet)")}} | 
|  | 122 | {{end}} | 
|  | 123 | {{end}} | 
|  | 124 | {{end}} | 
|  | 125 | ¶ | 
|  | 126 | <!-- Types which can be void pointers or class pointers, selected at compile time --> | 
|  | 127 | {{range $i, $p := $.Pseudonyms}} | 
|  | 128 | {{     if (GetAnnotation $p "dispatchHandle")}} | 
|  | 129 | {{if Global "VK_DEFINE_HANDLE_TYPE_DEFINED"}} | 
|  | 130 | <type category="handle">VK_DEFINE_HANDLE(<name>{{$p.Name}}</name>)</type> | 
|  | 131 | {{else}} | 
|  | 132 | {{Global "VK_DEFINE_HANDLE_TYPE_DEFINED" "YES"}} | 
|  | 133 | <type category="handle"><type>VK_DEFINE_HANDLE</type>(<name>{{$p.Name}}</name>)</type> | 
|  | 134 | {{end}} | 
|  | 135 | {{else if (GetAnnotation $p "nonDispatchHandle")}} | 
|  | 136 | {{if Global "VK_DEFINE_NONDISP_HANDLE_TYPE_DEFINED"}} | 
|  | 137 | <type category="handle">VK_DEFINE_NONDISP_HANDLE(<name>{{$p.Name}}</name>)</type> | 
|  | 138 | {{else}} | 
|  | 139 | {{Global "VK_DEFINE_NONDISP_HANDLE_TYPE_DEFINED" "YES"}} | 
|  | 140 | <type category="handle"><type>VK_DEFINE_NONDISP_HANDLE</type>(<name>{{$p.Name}}</name>)</type> | 
|  | 141 | {{end}} | 
|  | 142 | {{end}} | 
|  | 143 | {{end}} | 
|  | 144 | ¶ | 
|  | 145 | <!-- Types generated from corresponding <enums> tags below --> | 
|  | 146 | {{range $e := SortBy $.Enums "EnumName"}} | 
|  | 147 | {{if and $e.Entries (not (GetAnnotation $e "internal"))}} | 
|  | 148 | {{if $e.IsBitfield}} | 
|  | 149 | <type name="{{Macro "EnumName" $e | TrimRight "s"}}Bits" category="enum"/> | 
|  | 150 | {{else}} | 
|  | 151 | <type name="{{$e.Name}}" category="enum"/> | 
|  | 152 | {{end}} | 
|  | 153 | {{end}} | 
|  | 154 | {{end}} | 
|  | 155 | ¶ | 
|  | 156 | <!-- The PFN_vk*Function types are used by VkAllocCallbacks below --> | 
|  | 157 | <type>typedef void* (VKAPI *<name>PFN_vkAllocFunction</name>)(« | 
|  | 158 | void*                           pUserData, | 
|  | 159 | size_t                          size, | 
|  | 160 | size_t                          alignment, | 
|  | 161 | <type>VkSystemAllocType</type>               allocType);</type>» | 
|  | 162 | <type>typedef void (VKAPI *<name>PFN_vkFreeFunction</name>)(« | 
|  | 163 | void*                           pUserData, | 
|  | 164 | void*                           pMem);</type>» | 
|  | 165 | ¶ | 
|  | 166 | <!-- The PFN_vkVoidFunction type are used by VkGet*ProcAddr below --> | 
|  | 167 | <type>typedef void (VKAPI *<name>PFN_vkVoidFunction</name>)(void);</type> | 
|  | 168 | ¶ | 
|  | 169 | <!-- Struct types --> | 
|  | 170 | {{range $c := $.Classes}} | 
|  | 171 | {{if not (GetAnnotation $c "internal")}} | 
|  | 172 | {{Macro "Struct" $c}} | 
|  | 173 | {{end}} | 
|  | 174 | {{end}} | 
|  | 175 | «</types> | 
|  | 176 | ¶ | 
|  | 177 | <!-- SECTION: Vulkan enumerant (token) definitions. --> | 
|  | 178 | ¶ | 
|  | 179 | <enums namespace="VK" comment="Misc. hardcoded constants - not an enumerated type">» | 
|  | 180 | <!-- This is part of the header boilerplate --> | 
|  | 181 | {{range $d := $.Definitions}} | 
|  | 182 | {{if HasPrefix $d.Name "VK_"}} | 
|  | 183 | <enum value="{{$d.Expression}}"        name="{{$d.Name}}"/>{{Macro "XML.Docs" $d.Docs}} | 
|  | 184 | {{end}} | 
|  | 185 | {{end}} | 
| Jesse Hall | 5ae3abb | 2015-10-08 14:00:22 -0700 | [diff] [blame] | 186 | <enum value="1000.0f"  name="VK_LOD_CLAMP_NONE"/> | 
|  | 187 | <enum value="(-0U)" name="VK_REMAINING_MIP_LEVELS"/> | 
|  | 188 | <enum value="(~0U)" name="VK_REMAINING_ARRAY_LAYERS"/> | 
|  | 189 | <enum value="(_0ULL)" name="VK_WHOLE_SIZE"/> | 
|  | 190 | <enum value="(~0U)" name="VK_ATTACHMENT_UNUSED"/> | 
|  | 191 | <enum value="(~0U)" name="VK_QUEUE_FAMILY_IGNORED"/> | 
|  | 192 | <enum value="(~0U)" name="VK_SUBPASS_EXTERNAL"/> | 
| Jesse Hall | d27f6aa | 2015-08-15 17:58:48 -0700 | [diff] [blame] | 193 | «</enums> | 
|  | 194 | ¶ | 
|  | 195 | <!-- Unlike OpenGL, most tokens in Vulkan are actual typed enumerants in» | 
|  | 196 | their own numeric namespaces. The "name" attribute is the C enum | 
|  | 197 | type name, and is pulled in from a <type> definition above | 
|  | 198 | (slightly clunky, but retains the type / enum distinction). "type" | 
|  | 199 | attributes of "enum" or "bitmask" indicate that these values should | 
|  | 200 | be generated inside an appropriate definition. -->« | 
|  | 201 | ¶ | 
|  | 202 | {{range $e := $.Enums}} | 
|  | 203 | {{if not (or $e.IsBitfield (GetAnnotation $e "internal"))}} | 
|  | 204 | {{Macro "XML.Enum" $e}} | 
|  | 205 | {{end}} | 
|  | 206 | {{end}} | 
|  | 207 | ¶ | 
|  | 208 | <!-- Flags --> | 
|  | 209 | {{range $e := $.Enums}} | 
|  | 210 | {{if $e.IsBitfield}} | 
|  | 211 | {{Macro "XML.Bitfield" $e}} | 
|  | 212 | {{end}} | 
|  | 213 | {{end}} | 
|  | 214 | ¶ | 
|  | 215 | <!-- SECTION: Vulkan command definitions --> | 
|  | 216 | <commands namespace="vk">» | 
|  | 217 | {{range $f := AllCommands $}} | 
|  | 218 | {{if not (GetAnnotation $f "pfn")}} | 
|  | 219 | {{Macro "XML.Function" $f}} | 
|  | 220 | {{end}} | 
|  | 221 | {{end}} | 
|  | 222 | «</commands> | 
|  | 223 | ¶ | 
|  | 224 | <!-- SECTION: Vulkan API interface definitions --> | 
|  | 225 | <feature api="vulkan" name="VK_VERSION_1_0" number="1.0">» | 
|  | 226 | <require comment="Header boilerplate">» | 
|  | 227 | <type name="vk_platform"/> | 
|  | 228 | «</require> | 
|  | 229 | <require comment="API version">» | 
|  | 230 | <type name="VK_API_VERSION"/> | 
|  | 231 | «</require> | 
|  | 232 | <require comment="API constants">» | 
|  | 233 | <enum name="VK_LOD_CLAMP_NONE"/> | 
| Jesse Hall | 5ae3abb | 2015-10-08 14:00:22 -0700 | [diff] [blame] | 234 | <enum name="VK_REMAINING_MIP_LEVELS"/> | 
|  | 235 | <enum name="VK_REMAINING_ARRAY_LAYERS"/> | 
| Jesse Hall | d27f6aa | 2015-08-15 17:58:48 -0700 | [diff] [blame] | 236 | <enum name="VK_WHOLE_SIZE"/> | 
|  | 237 | <enum name="VK_ATTACHMENT_UNUSED"/> | 
|  | 238 | <enum name="VK_TRUE"/> | 
|  | 239 | <enum name="VK_FALSE"/> | 
| Jesse Hall | d27f6aa | 2015-08-15 17:58:48 -0700 | [diff] [blame] | 240 | «</require> | 
|  | 241 | <require comment="All functions (TODO: split by type)">» | 
|  | 242 | {{range $f := AllCommands $}} | 
|  | 243 | {{if not (GetAnnotation $f "pfn")}} | 
|  | 244 | <command name="{{$f.Name}}"/> | 
|  | 245 | {{end}} | 
|  | 246 | {{end}} | 
|  | 247 | </require> | 
|  | 248 | «<require comment="Types not directly used by the API">» | 
|  | 249 | <!-- Include <type name="typename"/> here for e.g. structs that» | 
|  | 250 | are not parameter types of commands, but still need to be | 
|  | 251 | defined in the API. | 
|  | 252 | «--> | 
|  | 253 | <type name="VkBufferMemoryBarrier"/> | 
|  | 254 | <type name="VkDispatchIndirectCmd"/> | 
|  | 255 | <type name="VkDrawIndexedIndirectCmd"/> | 
|  | 256 | <type name="VkDrawIndirectCmd"/> | 
|  | 257 | <type name="VkImageMemoryBarrier"/> | 
|  | 258 | <type name="VkMemoryBarrier"/> | 
|  | 259 | «</require> | 
|  | 260 | «</feature> | 
|  | 261 | ¶ | 
|  | 262 | <!-- SECTION: Vulkan extension interface definitions (none yet) --> | 
|  | 263 | «</registry> | 
|  | 264 | {{end}} | 
|  | 265 |  | 
|  | 266 | {{/* | 
|  | 267 | ------------------------------------------------------------------------------- | 
|  | 268 | Emits the C declaration for the specified bitfield. | 
|  | 269 | ------------------------------------------------------------------------------- | 
|  | 270 | */}} | 
|  | 271 | {{define "XML.Bitfield"}} | 
|  | 272 | {{AssertType $ "Enum"}} | 
|  | 273 |  | 
|  | 274 | {{if $.Entries}} | 
|  | 275 | <enums namespace="VK" name="{{Macro "EnumName" $ | TrimRight "s"}}Bits" type="bitmask">» | 
|  | 276 | {{range $e := $.Entries}} | 
|  | 277 | {{$pos := Bitpos $e.Value}} | 
|  | 278 | <enum § | 
|  | 279 | {{if gt $pos -1}} bitpos="{{$pos}}"    § | 
|  | 280 | {{else}}value="{{if $e.Value}}{{printf "0x%.8X" $e.Value}}{{else}}0{{end}}"    § | 
|  | 281 | {{end}}name="{{Macro "BitfieldEntryName" $e}}" § | 
|  | 282 | {{if $d := $e.Docs}} comment="{{$d | JoinWith "  "}}"{{end}}/> | 
|  | 283 | {{end}} | 
|  | 284 | «</enums> | 
|  | 285 | {{end}} | 
|  | 286 |  | 
|  | 287 | {{end}} | 
|  | 288 |  | 
|  | 289 |  | 
|  | 290 | {{/* | 
|  | 291 | ------------------------------------------------------------------------------- | 
|  | 292 | Emits the C declaration for the specified enum. | 
|  | 293 | ------------------------------------------------------------------------------- | 
|  | 294 | */}} | 
|  | 295 | {{define "XML.Enum"}} | 
|  | 296 | {{AssertType $ "Enum"}} | 
|  | 297 |  | 
|  | 298 | <enums namespace="VK" name="{{Macro "EnumName" $}}" type="enum" § | 
|  | 299 | expand="{{Macro "EnumName" $ | SplitPascalCase | Upper | JoinWith "_"}}"{{if $.Docs}} comment="{{$.Docs | JoinWith "  "}}"{{end}}>» | 
|  | 300 | {{range $i, $e := $.Entries}} | 
|  | 301 | <enum value="{{AsSigned $e.Value}}"     name="{{Macro "BitfieldEntryName" $e}}"{{if $e.Docs}} comment="{{$e.Docs | JoinWith "  "}}"{{end}}/> | 
|  | 302 | {{end}} | 
|  | 303 | {{if $lu := GetAnnotation $ "lastUnused"}} | 
|  | 304 | <unused start="{{index $lu.Arguments 0}}"/> | 
|  | 305 | {{end}} | 
|  | 306 | «</enums> | 
|  | 307 | {{end}} | 
|  | 308 |  | 
|  | 309 |  | 
|  | 310 | {{/* | 
|  | 311 | ------------------------------------------------------------------------------- | 
|  | 312 | Emits the C declaration for the specified class. | 
|  | 313 | ------------------------------------------------------------------------------- | 
|  | 314 | */}} | 
|  | 315 | {{define "Struct"}} | 
|  | 316 | {{AssertType $ "Class"}} | 
|  | 317 |  | 
|  | 318 | <type category="{{Macro "StructType" $}}" name="{{Macro "StructName" $}}"{{if $.Docs}} comment="{{$.Docs | JoinWith "  "}}"{{end}}>» | 
|  | 319 | {{range $f := $.Fields}} | 
|  | 320 | <member>{{Node "XML.Type" $f}}        <name>{{$f.Name}}</name>{{Macro "XML.ArrayPostfix" $f}}</member>{{Macro "XML.Docs" $f.Docs}} | 
|  | 321 | {{end}} | 
|  | 322 | «</type> | 
|  | 323 | {{end}} | 
|  | 324 |  | 
|  | 325 |  | 
|  | 326 | {{/* | 
|  | 327 | ------------------------------------------------------------------------------- | 
|  | 328 | Emits either 'struct' or 'union' for the specified class. | 
|  | 329 | ------------------------------------------------------------------------------- | 
|  | 330 | */}} | 
|  | 331 | {{define "StructType"}} | 
|  | 332 | {{AssertType $ "Class"}} | 
|  | 333 |  | 
|  | 334 | {{if GetAnnotation $ "union"}}union{{else}}struct{{end}} | 
|  | 335 | {{end}} | 
|  | 336 |  | 
|  | 337 |  | 
|  | 338 | {{/* | 
|  | 339 | ------------------------------------------------------------------------------- | 
|  | 340 | Emits the C function pointer typedef declaration for the specified command. | 
|  | 341 | ------------------------------------------------------------------------------- | 
|  | 342 | */}} | 
|  | 343 | {{define "XML.Function"}} | 
|  | 344 | {{AssertType $ "Function"}} | 
|  | 345 |  | 
|  | 346 | {{$ts := GetAnnotation $ "threadSafety"}} | 
|  | 347 | <command{{if $ts}} threadsafe="{{index $ts.Arguments 0}}"{{end}}>» | 
|  | 348 | <proto>{{Node "XML.Type" $.Return}} <name>{{$.Name}}</name></proto> | 
|  | 349 | {{range $p := $.CallParameters}} | 
|  | 350 | <param>{{Node "XML.Type" $p}} <name>{{$p.Name}}{{Macro "ArrayPostfix" $p}}</name></param> | 
|  | 351 | {{end}} | 
|  | 352 | «</command> | 
|  | 353 | {{end}} | 
|  | 354 |  | 
|  | 355 |  | 
|  | 356 | {{/* | 
|  | 357 | ------------------------------------------------------------------------------- | 
|  | 358 | Emits the XML translation for the specified documentation block (string array). | 
|  | 359 | ------------------------------------------------------------------------------- | 
|  | 360 | */}} | 
|  | 361 | {{define "XML.Docs"}} | 
|  | 362 | {{if $}} <!-- {{JoinWith "  " $ | Replace "<" "" | Replace ">" ""}} -->{{end}} | 
|  | 363 | {{end}} | 
|  | 364 |  | 
|  | 365 | {{/* | 
|  | 366 | ------------------------------------------------------------------------------- | 
|  | 367 | Emits the C translation for the specified type. | 
|  | 368 | ------------------------------------------------------------------------------- | 
|  | 369 | */}} | 
|  | 370 | {{define "XML.Type.Class"      }}<type>{{Macro "StructName" $.Type}}</type>{{end}} | 
|  | 371 | {{define "XML.Type.Pseudonym"  }}<type>{{$.Type.Name}}</type>{{end}} | 
|  | 372 | {{define "XML.Type.Enum"       }}<type>{{$.Type.Name}}</type>{{end}} | 
|  | 373 | {{define "XML.Type.StaticArray"}}{{Node "XML.Type" $.Type.ValueType}}{{end}} | 
|  | 374 | {{define "XML.Type.Pointer"    }}{{if $.Type.Const}}{{Node "XML.ConstType" $.Type.To}}{{else}}{{Node "XML.Type" $.Type.To}}{{end}}*{{end}} | 
|  | 375 | {{define "XML.Type.Slice"      }}<type>{{Node "XML.Type" $.Type.To}}</type>*{{end}} | 
|  | 376 | {{define "XML.Type#s8"         }}<type>int8_t</type>{{end}} | 
|  | 377 | {{define "XML.Type#u8"         }}<type>uint8_t</type>{{end}} | 
|  | 378 | {{define "XML.Type#s16"        }}<type>int16_t</type>{{end}} | 
|  | 379 | {{define "XML.Type#u16"        }}<type>uint16_t</type>{{end}} | 
|  | 380 | {{define "XML.Type#s32"        }}<type>int32_t</type>{{end}} | 
|  | 381 | {{define "XML.Type#u32"        }}<type>uint32_t</type>{{end}} | 
|  | 382 | {{define "XML.Type#f32"        }}<type>float</type>{{end}} | 
|  | 383 | {{define "XML.Type#s64"        }}<type>int64_t</type>{{end}} | 
|  | 384 | {{define "XML.Type#u64"        }}<type>uint64_t</type>{{end}} | 
|  | 385 | {{define "XML.Type#f64"        }}<type>double</type>{{end}} | 
|  | 386 | {{define "XML.Type#char"       }}<type>char</type>{{end}} | 
|  | 387 | {{define "XML.Type#void"       }}void{{end}} | 
|  | 388 |  | 
|  | 389 | {{define "XML.ConstType_Default"}}const {{Node "XML.Type" $.Type}}{{end}} | 
|  | 390 | {{define "XML.ConstType.Pointer"}}{{Node "XML.Type" $.Type}} const{{end}} | 
|  | 391 |  | 
|  | 392 |  | 
|  | 393 | {{/* | 
|  | 394 | ------------------------------------------------------------------------------- | 
|  | 395 | Emits a C type and name for the given parameter | 
|  | 396 | ------------------------------------------------------------------------------- | 
|  | 397 | */}} | 
|  | 398 | {{define "XML.Parameter"}} | 
|  | 399 | {{AssertType $ "Parameter"}} | 
|  | 400 |  | 
|  | 401 | <type>{{Macro "ParameterType" $}}</type> <name>{{$.Name}}{{Macro "ArrayPostfix" $}}</name> | 
|  | 402 | {{end}} | 
|  | 403 |  | 
|  | 404 | {{/* | 
|  | 405 | ------------------------------------------------------------------------------- | 
|  | 406 | Emits a comma-separated list of C type-name paired parameters for the given | 
|  | 407 | command. | 
|  | 408 | ------------------------------------------------------------------------------- | 
|  | 409 | */}} | 
|  | 410 | {{define "XML.Parameters"}} | 
|  | 411 | {{AssertType $ "Function"}} | 
|  | 412 |  | 
|  | 413 | {{ForEach $.CallParameters "XML.Parameter" | JoinWith ", "}} | 
|  | 414 | {{if not $.CallParameters}}<type>void</type>{{end}} | 
|  | 415 | {{end}} | 
|  | 416 |  | 
|  | 417 |  | 
|  | 418 | {{/* | 
|  | 419 | ------------------------------------------------------------------------------- | 
|  | 420 | Emits the fixed-size-array postfix for pseudonym types annotated with @array | 
|  | 421 | ------------------------------------------------------------------------------- | 
|  | 422 | */}} | 
|  | 423 | {{define "XML.ArrayPostfix"}}{{Node "XML.ArrayPostfix" $}}{{end}} | 
|  | 424 | {{define "XML.ArrayPostfix.StaticArray"}}[{{Node "XML.NamedValue" $.Type.SizeExpr}}]{{end}} | 
|  | 425 | {{define "XML.ArrayPostfix_Default"}}{{end}} | 
|  | 426 |  | 
|  | 427 |  | 
|  | 428 | {{/* | 
|  | 429 | ------------------------------------------------------------------------------- | 
|  | 430 | Emits the value of the given constant, or the <enum> tagged name if existant. | 
|  | 431 | ------------------------------------------------------------------------------- | 
|  | 432 | */}} | 
|  | 433 | {{define "XML.NamedValue.Definition"}}<enum>{{$.Node.Name}}</enum>{{end}} | 
|  | 434 | {{define "XML.NamedValue.EnumEntry"}}<enum>{{$.Node.Name}}</enum>{{end}} | 
|  | 435 | {{define "XML.NamedValue_Default"}}{{$.Node}}{{end}} |