{{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}}
