104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall//
204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall// File: vk_platform.h
304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall//
404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall/*
504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall** Copyright (c) 2014-2015 The Khronos Group Inc.
604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall**
72676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall** Licensed under the Apache License, Version 2.0 (the "License");
82676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall** you may not use this file except in compliance with the License.
92676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall** You may obtain a copy of the License at
1004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall**
112676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall**     http://www.apache.org/licenses/LICENSE-2.0
1204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall**
132676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall** Unless required by applicable law or agreed to in writing, software
142676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall** distributed under the License is distributed on an "AS IS" BASIS,
152676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
162676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall** See the License for the specific language governing permissions and
172676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall** limitations under the License.
1804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall*/
1904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
2004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
212676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall#ifndef VK_PLATFORM_H_
222676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall#define VK_PLATFORM_H_
2304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
2404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#ifdef __cplusplus
2504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallextern "C"
2604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall{
2704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#endif // __cplusplus
2804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
2904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall/*
3004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall***************************************************************************************************
3104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall*   Platform-specific directives and type declarations
3204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall***************************************************************************************************
3304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall*/
3404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
35e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall/* Platform-specific calling convention macros.
36e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall *
37e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall * Platforms should define these so that Vulkan clients call Vulkan commands
38e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall * with the same calling conventions that the Vulkan implementation expects.
39e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall *
40e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall * VKAPI_ATTR - Placed before the return type in function declarations.
41e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall *              Useful for C++11 and GCC/Clang-style function attribute syntax.
42e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall * VKAPI_CALL - Placed after the return type in function declarations.
43e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall *              Useful for MSVC-style calling convention syntax.
44e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall * VKAPI_PTR  - Placed between the '(' and '*' in function pointer types.
45e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall *
46e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall * Function declaration:  VKAPI_ATTR void VKAPI_CALL vkCommand(void);
47e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall * Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void);
48e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall */
4904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#if defined(_WIN32)
50e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    // On Windows, Vulkan commands use the stdcall convention
51e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    #define VKAPI_ATTR
52e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    #define VKAPI_CALL __stdcall
53e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    #define VKAPI_PTR  VKAPI_CALL
54e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall#elif defined(__ANDROID__) && defined(__ARM_EABI__) && !defined(__ARM_ARCH_7A__)
55e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    // Android does not support Vulkan in native code using the "armeabi" ABI.
56e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    #error "Vulkan requires the 'armeabi-v7a' or 'armeabi-v7a-hard' ABI on 32-bit ARM CPUs"
57e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall#elif defined(__ANDROID__) && defined(__ARM_ARCH_7A__)
58e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    // On Android/ARMv7a, Vulkan functions use the armeabi-v7a-hard calling
59e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    // convention, even if the application's native code is compiled with the
60e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    // armeabi-v7a calling convention.
61e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    #define VKAPI_ATTR __attribute__((pcs("aapcs-vfp")))
62e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    #define VKAPI_CALL
63e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    #define VKAPI_PTR  VKAPI_ATTR
6404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#else
6565ab552c18df3e94c5d275294a20dd4d20dda119Jesse Hall    // On other platforms, use the default calling convention
66e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    #define VKAPI_ATTR
67e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    #define VKAPI_CALL
68e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse Hall    #define VKAPI_PTR
6904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#endif
7004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
7104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <stddef.h>
7204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
7304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#if !defined(VK_NO_STDINT_H)
7404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    #if defined(_MSC_VER) && (_MSC_VER < 1600)
7504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        typedef signed   __int8  int8_t;
7604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        typedef unsigned __int8  uint8_t;
7704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        typedef signed   __int16 int16_t;
7804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        typedef unsigned __int16 uint16_t;
7904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        typedef signed   __int32 int32_t;
8004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        typedef unsigned __int32 uint32_t;
8104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        typedef signed   __int64 int64_t;
8204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        typedef unsigned __int64 uint64_t;
8304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    #else
8404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        #include <stdint.h>
8504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    #endif
8604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#endif // !defined(VK_NO_STDINT_H)
8704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
8804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#ifdef __cplusplus
8904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall} // extern "C"
9004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#endif // __cplusplus
9104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
921356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall// Platform-specific headers required by platform window system extensions.
931356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall// These are enabled prior to #including "vulkan.h". The same enable then
941356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall// controls inclusion of the extension interfaces in vulkan.h.
951356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall
961356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#ifdef VK_USE_PLATFORM_ANDROID_KHR
971356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#include <android/native_window.h>
981356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#endif
991356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall
1001356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#ifdef VK_USE_PLATFORM_MIR_KHR
1011356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#include <mir_toolkit/client_types.h>
1021356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#endif
1031356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall
1041356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1051356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#include <wayland-client.h>
1061356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#endif
1071356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall
1081356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#ifdef VK_USE_PLATFORM_WIN32_KHR
1091356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#include <windows.h>
1101356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#endif
1111356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall
112a64292517b1876c4bbe5d3e62c577812f40bd922Jesse Hall#ifdef VK_USE_PLATFORM_XLIB_KHR
1131356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#include <X11/Xlib.h>
1141356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#endif
1151356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall
1161356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#ifdef VK_USE_PLATFORM_XCB_KHR
1171356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#include <xcb/xcb.h>
1181356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall#endif
1191356b0d3179254a7a27e88abb2d2500385469f14Jesse Hall
1202676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall#endif
121