1{{Include "vulkan_common.tmpl"}} 2{{Macro "DefineGlobals" $}} 3{{$ | Macro "vulkan.h" | Format (Global "clang-format") | Write "../include/vulkan.h"}} 4 5 6{{/* 7------------------------------------------------------------------------------- 8 Entry point 9------------------------------------------------------------------------------- 10*/}} 11{{define "vulkan.h"}} 12#ifndef __vulkan_h_ 13#define __vulkan_h_ 1 14¶ 15#ifdef __cplusplus 16extern "C" { 17#endif 18¶ 19/* 20** Copyright (c) 2015-2016 The Khronos Group Inc. 21** 22** Permission is hereby granted, free of charge, to any person obtaining a 23** copy of this software and/or associated documentation files (the 24** "Materials"), to deal in the Materials without restriction, including 25** without limitation the rights to use, copy, modify, merge, publish, 26** distribute, sublicense, and/or sell copies of the Materials, and to 27** permit persons to whom the Materials are furnished to do so, subject to 28** the following conditions: 29** 30** The above copyright notice and this permission notice shall be included 31** in all copies or substantial portions of the Materials. 32** 33** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 34** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 35** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 36** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 37** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 38** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 39** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. 40*/ 41¶ 42/* 43** This header is generated from the Khronos Vulkan API Registry. 44** 45*/ 46¶ 47#define VK_VERSION_1_0 1 48#include "vk_platform.h" 49¶ 50#define VK_MAKE_VERSION(major, minor, patch) (((major) << 22) | ((minor) << 12) | (patch)) 51¶ 52// Vulkan API version supported by this file 53#define VK_API_VERSION \ 54 VK_MAKE_VERSION({{Global "VERSION_MAJOR"}}, {{Global "VERSION_MINOR"}}, {{Global "VERSION_PATCH"}}) 55¶ 56#define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22) 57#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff) 58#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff) 59¶ 60#if defined(__cplusplus) && ((defined(_MSC_VER) && _MSC_VER >= 1800 || __cplusplus >= 201103L) 61 #define VK_NULL_HANDLE nullptr 62#else 63 #define VK_NULL_HANDLE 0 64#endif 65¶ 66#define VK_DEFINE_HANDLE(obj) typedef struct obj##_T* obj; 67¶ 68#if defined(__cplusplus) 69#if ((defined(_MSC_VER) && _MSC_VER >= 1800 || __cplusplus >= 201103L) 70// The bool operator only works if there are no implicit conversions from an obj to 71// a bool-compatible type, which can then be used to unintentionally violate type safety. 72// C++11 and above supports the "explicit" keyword on conversion operators to stop this 73// from happening. Otherwise users of C++ below C++11 won't get direct access to evaluating 74// the object handle as a bool in expressions like: 75// if (obj) vkDestroy(obj); 76#define VK_NONDISP_HANDLE_OPERATOR_BOOL() \ 77 explicit operator bool() const { return handle != 0; } 78#define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \ 79 explicit obj(uint64_t x) : handle(x) { } \ 80 obj(decltype(nullptr)) : handle(0) { } 81#else 82#define VK_NONDISP_HANDLE_OPERATOR_BOOL() 83#define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \ 84 obj(uint64_t x) : handle(x) { } 85#endif 86#define VK_DEFINE_NONDISP_HANDLE(obj) \ 87 struct obj { \ 88 obj() : handle(0) { } \ 89 VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \ 90 obj& operator=(uint64_t x) { \ 91 handle = x; \ 92 return *this; \ 93 } \ 94 bool operator==(const obj& other) const { return handle == other.handle; } \ 95 bool operator!=(const obj& other) const { return handle != other.handle; } \ 96 bool operator!() const { return !handle; } \ 97 VK_NONDISP_HANDLE_OPERATOR_BOOL() \ 98 uint64_t handle; \ 99 }; 100#else 101#define VK_DEFINE_NONDISP_HANDLE(obj) \ 102 typedef struct obj##_T { uint64_t handle; } obj; 103#endif 104¶ 105#define VK_LOD_CLAMP_NONE 1000.0f 106#define VK_REMAINING_MIP_LEVELS (~0U) 107#define VK_REMAINING_ARRAY_LAYERS (~0U) 108#define VK_WHOLE_SIZE (~0ULL) 109#define VK_ATTACHMENT_UNUSED (~0U) 110define VK_QUEUE_FAMILY_IGNORED (~0U) 111define VK_SUBPASS_EXTERNAL (~0U) 112{{range $d := $.Definitions}} 113 {{if HasPrefix $d.Name "VK_"}}#define {{$d.Name}} {{$d.Expression}}{{end}} 114{{end}} 115¶ 116{{range $i, $p := $.Pseudonyms}} 117 {{if GetAnnotation $p "dispatchHandle"}}VK_DEFINE_HANDLE({{$p.Name}}) 118 {{else if GetAnnotation $p "nonDispatchHandle"}}VK_DEFINE_NONDISP_HANDLE({{$p.Name}}) 119 {{end}} 120{{end}} 121¶ 122// ------------------------------------------------------------------------------------------------ 123// Enumerations 124¶ 125 {{range $e := $.Enums}} 126 {{if not $e.IsBitfield}} 127 {{Macro "Enum" $e}} 128 {{end}} 129 {{end}} 130¶ 131// ------------------------------------------------------------------------------------------------ 132// Flags 133¶ 134 {{range $e := $.Enums}} 135 {{if $e.IsBitfield}} 136 {{Macro "Bitfield" $e}} 137 {{end}} 138 {{end}} 139¶ 140// ------------------------------------------------------------------------------------------------ 141// Vulkan structures 142¶ 143 {{/* Function pointers */}} 144 {{range $f := AllCommands $}} 145 {{if GetAnnotation $f "pfn"}} 146 {{Macro "FunctionTypedef" $f}} 147 {{end}} 148 {{end}} 149¶ 150 {{range $c := $.Classes}} 151 {{if not (GetAnnotation $c "internal")}} 152 {{Macro "Struct" $c}} 153 {{end}} 154 {{end}} 155¶ 156// ------------------------------------------------------------------------------------------------ 157// API functions 158¶ 159 {{range $f := AllCommands $}} 160 {{if not (GetAnnotation $f "pfn")}} 161 {{Macro "FunctionTypedef" $f}} 162 {{end}} 163 {{end}} 164¶ 165#ifdef VK_NO_PROTOTYPES 166¶ 167 {{range $f := AllCommands $}} 168 {{if not (GetAnnotation $f "pfn")}} 169 {{Macro "FunctionDecl" $f}} 170 {{end}} 171 {{end}} 172¶ 173#endif 174¶ 175#ifdef __cplusplus 176} 177#endif 178¶ 179#endif 180{{end}} 181 182{{/* 183------------------------------------------------------------------------------- 184 Emits the C declaration for the specified bitfield. 185------------------------------------------------------------------------------- 186*/}} 187{{define "Bitfield"}} 188 {{AssertType $ "Enum"}} 189 190 {{Macro "Docs" $.Docs}} 191 typedef VkFlags {{Macro "EnumName" $}}; 192 {{if $.Entries}} 193 typedef enum { 194 {{range $b := $.Entries}} 195 {{Macro "BitfieldEntryName" $b}} = {{printf "0x%.8X" $b.Value}}, {{Macro "Docs" $b.Docs}} 196 {{end}} 197 } {{Macro "EnumName" $ | TrimRight "s"}}Bits; 198 {{end}} 199 ¶ 200{{end}} 201 202 203{{/* 204------------------------------------------------------------------------------- 205 Emits the C declaration for the specified enum. 206------------------------------------------------------------------------------- 207*/}} 208{{define "Enum"}} 209 {{AssertType $ "Enum"}} 210 211 {{Macro "Docs" $.Docs}} 212 typedef enum { 213 {{range $i, $e := $.Entries}} 214 {{Macro "EnumEntry" $e}} = {{printf "0x%.8X" $e.Value}}, {{Macro "Docs" $e.Docs}} 215 {{end}} 216 ¶ 217 {{$name := Macro "EnumName" $ | TrimRight "ABCDEFGHIJKLMNOQRSTUVWXYZ" | SplitPascalCase | Upper | JoinWith "_"}} 218 {{if GetAnnotation $ "enumMaxOnly"}} 219 VK_MAX_ENUM({{$name | SplitOn "VK_"}}) 220 {{else}} 221 {{$first := Macro "EnumFirstEntry" $ | SplitOn $name | TrimLeft "_"}} 222 {{$last := Macro "EnumLastEntry" $ | SplitOn $name | TrimLeft "_"}} 223 VK_ENUM_RANGE({{$name | SplitOn "VK_"}}, {{$first}}, {{$last}}) 224 {{end}} 225 } {{Macro "EnumName" $}}; 226 ¶ 227{{end}} 228 229 230{{/* 231------------------------------------------------------------------------------- 232 Emits the C declaration for the specified class. 233------------------------------------------------------------------------------- 234*/}} 235{{define "Struct"}} 236 {{AssertType $ "Class"}} 237 238 {{Macro "Docs" $.Docs}} 239 typedef {{Macro "StructType" $}} { 240 {{ForEach $.Fields "Field" | JoinWith "\n"}} 241 } {{Macro "StructName" $}}; 242 ¶ 243{{end}} 244 245 246{{/* 247------------------------------------------------------------------------------- 248 Emits the C declaration for the specified class field. 249------------------------------------------------------------------------------- 250*/}} 251{{define "Field"}} 252 {{AssertType $ "Field"}} 253 254 {{Node "Type" $}} {{$.Name}}§ 255 {{Macro "ArrayPostfix" (TypeOf $)}}; {{Macro "Docs" $.Docs}} 256{{end}} 257 258 259{{/* 260------------------------------------------------------------------------------- 261 Emits either 'struct' or 'union' for the specified class. 262------------------------------------------------------------------------------- 263*/}} 264{{define "StructType"}} 265 {{AssertType $ "Class"}} 266 267 {{if GetAnnotation $ "union"}}union{{else}}struct{{end}} 268{{end}} 269 270 271{{/* 272------------------------------------------------------------------------------- 273 Emits the C function pointer typedef declaration for the specified command. 274------------------------------------------------------------------------------- 275*/}} 276{{define "FunctionTypedef"}} 277 {{AssertType $ "Function"}} 278 279 typedef {{Node "Type" $.Return}} (VKAPI* {{Macro "FunctionPtrName" $}})({{Macro "Parameters" $}}); 280{{end}} 281 282 283{{/* 284------------------------------------------------------------------------------- 285 Emits the C function declaration for the specified command. 286------------------------------------------------------------------------------- 287*/}} 288{{define "FunctionDecl"}} 289 {{AssertType $ "Function"}} 290 291 {{if not (GetAnnotation $ "fptr")}} 292 {{Macro "Docs" $.Docs}} 293 {{Node "Type" $.Return}} VKAPI {{Macro "FunctionName" $}}({{Macro "Parameters" $}}); 294 {{end}} 295{{end}} 296