blob: 83a5e40804b1473bd666dc0661cb1df08e4e9420 [file] [log] [blame]
{{Include "vulkan_common.tmpl"}}
{{Macro "DefineGlobals" $}}
{{$ | Macro "vulkan.h" | Format (Global "clang-format") | Write "../include/vulkan.h"}}
{{/*
-------------------------------------------------------------------------------
Entry point
-------------------------------------------------------------------------------
*/}}
{{define "vulkan.h"}}
#ifndef __vulkan_h_
#define __vulkan_h_ 1
#ifdef __cplusplus
extern "C" {
#endif
/*
** Copyright (c) 2015-2016 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Materials.
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/
/*
** This header is generated from the Khronos Vulkan API Registry.
**
*/
#define VK_VERSION_1_0 1
#include "vk_platform.h"
#define VK_MAKE_VERSION(major, minor, patch) (((major) << 22) | ((minor) << 12) | (patch))
// Vulkan API version supported by this file
#define VK_API_VERSION \
VK_MAKE_VERSION({{Global "VERSION_MAJOR"}}, {{Global "VERSION_MINOR"}}, {{Global "VERSION_PATCH"}})
#define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22)
#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff)
#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff)
#if defined(__cplusplus) && ((defined(_MSC_VER) && _MSC_VER >= 1800 || __cplusplus >= 201103L)
#define VK_NULL_HANDLE nullptr
#else
#define VK_NULL_HANDLE 0
#endif
#define VK_DEFINE_HANDLE(obj) typedef struct obj##_T* obj;
#if defined(__cplusplus)
#if ((defined(_MSC_VER) && _MSC_VER >= 1800 || __cplusplus >= 201103L)
// The bool operator only works if there are no implicit conversions from an obj to
// a bool-compatible type, which can then be used to unintentionally violate type safety.
// C++11 and above supports the "explicit" keyword on conversion operators to stop this
// from happening. Otherwise users of C++ below C++11 won't get direct access to evaluating
// the object handle as a bool in expressions like:
// if (obj) vkDestroy(obj);
#define VK_NONDISP_HANDLE_OPERATOR_BOOL() \
explicit operator bool() const { return handle != 0; }
#define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
explicit obj(uint64_t x) : handle(x) { } \
obj(decltype(nullptr)) : handle(0) { }
#else
#define VK_NONDISP_HANDLE_OPERATOR_BOOL()
#define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
obj(uint64_t x) : handle(x) { }
#endif
#define VK_DEFINE_NONDISP_HANDLE(obj) \
struct obj { \
obj() : handle(0) { } \
VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
obj& operator=(uint64_t x) { \
handle = x; \
return *this; \
} \
bool operator==(const obj& other) const { return handle == other.handle; } \
bool operator!=(const obj& other) const { return handle != other.handle; } \
bool operator!() const { return !handle; } \
VK_NONDISP_HANDLE_OPERATOR_BOOL() \
uint64_t handle; \
};
#else
#define VK_DEFINE_NONDISP_HANDLE(obj) \
typedef struct obj##_T { uint64_t handle; } obj;
#endif
#define VK_LOD_CLAMP_NONE 1000.0f
#define VK_REMAINING_MIP_LEVELS (~0U)
#define VK_REMAINING_ARRAY_LAYERS (~0U)
#define VK_WHOLE_SIZE (~0ULL)
#define VK_ATTACHMENT_UNUSED (~0U)
define VK_QUEUE_FAMILY_IGNORED (~0U)
define VK_SUBPASS_EXTERNAL (~0U)
{{range $d := $.Definitions}}
{{if HasPrefix $d.Name "VK_"}}#define {{$d.Name}} {{$d.Expression}}{{end}}
{{end}}
{{range $i, $p := $.Pseudonyms}}
{{if GetAnnotation $p "dispatchHandle"}}VK_DEFINE_HANDLE({{$p.Name}})
{{else if GetAnnotation $p "nonDispatchHandle"}}VK_DEFINE_NONDISP_HANDLE({{$p.Name}})
{{end}}
{{end}}
// ------------------------------------------------------------------------------------------------
// Enumerations
{{range $e := $.Enums}}
{{if not $e.IsBitfield}}
{{Macro "Enum" $e}}
{{end}}
{{end}}
// ------------------------------------------------------------------------------------------------
// Flags
{{range $e := $.Enums}}
{{if $e.IsBitfield}}
{{Macro "Bitfield" $e}}
{{end}}
{{end}}
// ------------------------------------------------------------------------------------------------
// Vulkan structures
{{/* Function pointers */}}
{{range $f := AllCommands $}}
{{if GetAnnotation $f "pfn"}}
{{Macro "FunctionTypedef" $f}}
{{end}}
{{end}}
{{range $c := $.Classes}}
{{if not (GetAnnotation $c "internal")}}
{{Macro "Struct" $c}}
{{end}}
{{end}}
// ------------------------------------------------------------------------------------------------
// API functions
{{range $f := AllCommands $}}
{{if not (GetAnnotation $f "pfn")}}
{{Macro "FunctionTypedef" $f}}
{{end}}
{{end}}
#ifdef VK_NO_PROTOTYPES
{{range $f := AllCommands $}}
{{if not (GetAnnotation $f "pfn")}}
{{Macro "FunctionDecl" $f}}
{{end}}
{{end}}
#endif
#ifdef __cplusplus
}
#endif
#endif
{{end}}
{{/*
-------------------------------------------------------------------------------
Emits the C declaration for the specified bitfield.
-------------------------------------------------------------------------------
*/}}
{{define "Bitfield"}}
{{AssertType $ "Enum"}}
{{Macro "Docs" $.Docs}}
typedef VkFlags {{Macro "EnumName" $}};
{{if $.Entries}}
typedef enum {
{{range $b := $.Entries}}
{{Macro "BitfieldEntryName" $b}} = {{printf "0x%.8X" $b.Value}}, {{Macro "Docs" $b.Docs}}
{{end}}
} {{Macro "EnumName" $ | TrimRight "s"}}Bits;
{{end}}
{{end}}
{{/*
-------------------------------------------------------------------------------
Emits the C declaration for the specified enum.
-------------------------------------------------------------------------------
*/}}
{{define "Enum"}}
{{AssertType $ "Enum"}}
{{Macro "Docs" $.Docs}}
typedef enum {
{{range $i, $e := $.Entries}}
{{Macro "EnumEntry" $e}} = {{printf "0x%.8X" $e.Value}}, {{Macro "Docs" $e.Docs}}
{{end}}
{{$name := Macro "EnumName" $ | TrimRight "ABCDEFGHIJKLMNOQRSTUVWXYZ" | SplitPascalCase | Upper | JoinWith "_"}}
{{if GetAnnotation $ "enumMaxOnly"}}
VK_MAX_ENUM({{$name | SplitOn "VK_"}})
{{else}}
{{$first := Macro "EnumFirstEntry" $ | SplitOn $name | TrimLeft "_"}}
{{$last := Macro "EnumLastEntry" $ | SplitOn $name | TrimLeft "_"}}
VK_ENUM_RANGE({{$name | SplitOn "VK_"}}, {{$first}}, {{$last}})
{{end}}
} {{Macro "EnumName" $}};
{{end}}
{{/*
-------------------------------------------------------------------------------
Emits the C declaration for the specified class.
-------------------------------------------------------------------------------
*/}}
{{define "Struct"}}
{{AssertType $ "Class"}}
{{Macro "Docs" $.Docs}}
typedef {{Macro "StructType" $}} {
{{ForEach $.Fields "Field" | JoinWith "\n"}}
} {{Macro "StructName" $}};
{{end}}
{{/*
-------------------------------------------------------------------------------
Emits the C declaration for the specified class field.
-------------------------------------------------------------------------------
*/}}
{{define "Field"}}
{{AssertType $ "Field"}}
{{Node "Type" $}} {{$.Name}}§
{{Macro "ArrayPostfix" (TypeOf $)}}; {{Macro "Docs" $.Docs}}
{{end}}
{{/*
-------------------------------------------------------------------------------
Emits either 'struct' or 'union' for the specified class.
-------------------------------------------------------------------------------
*/}}
{{define "StructType"}}
{{AssertType $ "Class"}}
{{if GetAnnotation $ "union"}}union{{else}}struct{{end}}
{{end}}
{{/*
-------------------------------------------------------------------------------
Emits the C function pointer typedef declaration for the specified command.
-------------------------------------------------------------------------------
*/}}
{{define "FunctionTypedef"}}
{{AssertType $ "Function"}}
typedef {{Node "Type" $.Return}} (VKAPI* {{Macro "FunctionPtrName" $}})({{Macro "Parameters" $}});
{{end}}
{{/*
-------------------------------------------------------------------------------
Emits the C function declaration for the specified command.
-------------------------------------------------------------------------------
*/}}
{{define "FunctionDecl"}}
{{AssertType $ "Function"}}
{{if not (GetAnnotation $ "fptr")}}
{{Macro "Docs" $.Docs}}
{{Node "Type" $.Return}} VKAPI {{Macro "FunctionName" $}}({{Macro "Parameters" $}});
{{end}}
{{end}}