189e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter//
22040b4334073da11b538582dc66689facba60ca8Courtney Goeltzenleuchter// File: vk_platform.h
389e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter//
489e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter/*
5f1ea418f193d10a8455cdf47e0eeeeb1f4d8b5bfJon Ashburn** Copyright (c) 2014-2015 The Khronos Group Inc.
689e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter**
743b53e83705f02245da6ae61e31273866a35b833Jon Ashburn** Licensed under the Apache License, Version 2.0 (the "License");
843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn** you may not use this file except in compliance with the License.
943b53e83705f02245da6ae61e31273866a35b833Jon Ashburn** You may obtain a copy of the License at
1089e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter**
1143b53e83705f02245da6ae61e31273866a35b833Jon Ashburn**     http://www.apache.org/licenses/LICENSE-2.0
1289e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter**
1343b53e83705f02245da6ae61e31273866a35b833Jon Ashburn** Unless required by applicable law or agreed to in writing, software
1443b53e83705f02245da6ae61e31273866a35b833Jon Ashburn** distributed under the License is distributed on an "AS IS" BASIS,
1543b53e83705f02245da6ae61e31273866a35b833Jon Ashburn** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn** See the License for the specific language governing permissions and
1743b53e83705f02245da6ae61e31273866a35b833Jon Ashburn** limitations under the License.
1889e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter*/
1989e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter
2089e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter
21f1ea418f193d10a8455cdf47e0eeeeb1f4d8b5bfJon Ashburn#ifndef VK_PLATFORM_H_
22f1ea418f193d10a8455cdf47e0eeeeb1f4d8b5bfJon Ashburn#define VK_PLATFORM_H_
2389e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter
2489e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter#ifdef __cplusplus
2589e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchterextern "C"
2689e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter{
2789e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter#endif // __cplusplus
2889e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter
2989e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter/*
3089e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter***************************************************************************************************
3189e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter*   Platform-specific directives and type declarations
3289e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter***************************************************************************************************
3389e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter*/
3489e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter
35af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu/* Platform-specific calling convention macros.
36af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu *
37af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu * Platforms should define these so that Vulkan clients call Vulkan commands
38af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu * with the same calling conventions that the Vulkan implementation expects.
39af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu *
40af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu * VKAPI_ATTR - Placed before the return type in function declarations.
41af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu *              Useful for C++11 and GCC/Clang-style function attribute syntax.
42af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu * VKAPI_CALL - Placed after the return type in function declarations.
43af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu *              Useful for MSVC-style calling convention syntax.
44af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu * VKAPI_PTR  - Placed between the '(' and '*' in function pointer types.
45af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu *
46af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu * Function declaration:  VKAPI_ATTR void VKAPI_CALL vkCommand(void);
47af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu * Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void);
48af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu */
4989e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter#if defined(_WIN32)
50af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu    // On Windows, Vulkan commands use the stdcall convention
51af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu    #define VKAPI_ATTR
52af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu    #define VKAPI_CALL __stdcall
53af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu    #define VKAPI_PTR  VKAPI_CALL
547620138ea7bc75853411dd896942579b3eb9f4c4Mark Lobodzinski#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7
557620138ea7bc75853411dd896942579b3eb9f4c4Mark Lobodzinski    #error "Vulkan isn't supported for the 'armeabi' NDK ABI"
56ccbb5afc46c1b88f65850cbd342bcb9a4f0a35fcMark Lobodzinski#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE)
577620138ea7bc75853411dd896942579b3eb9f4c4Mark Lobodzinski    // On Android 32-bit ARM targets, Vulkan functions use the "hardfloat"
587620138ea7bc75853411dd896942579b3eb9f4c4Mark Lobodzinski    // calling convention, i.e. float parameters are passed in registers. This
597620138ea7bc75853411dd896942579b3eb9f4c4Mark Lobodzinski    // is true even if the rest of the application passes floats on the stack,
607620138ea7bc75853411dd896942579b3eb9f4c4Mark Lobodzinski    // as it does by default when compiling for the armeabi-v7a NDK ABI.
61af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu    #define VKAPI_ATTR __attribute__((pcs("aapcs-vfp")))
62af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu    #define VKAPI_CALL
63af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu    #define VKAPI_PTR  VKAPI_ATTR
6489e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter#else
65af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu    // On other platforms, use the default calling convention
66af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu    #define VKAPI_ATTR
67af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu    #define VKAPI_CALL
68af9e4fd72c31e1080cadc3d6baa16b669af8e913Chia-I Wu    #define VKAPI_PTR
6989e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter#endif
7089e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter
7189e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter#include <stddef.h>
7289e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter
7389e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter#if !defined(VK_NO_STDINT_H)
7489e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter    #if defined(_MSC_VER) && (_MSC_VER < 1600)
7589e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter        typedef signed   __int8  int8_t;
7689e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter        typedef unsigned __int8  uint8_t;
7789e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter        typedef signed   __int16 int16_t;
7889e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter        typedef unsigned __int16 uint16_t;
7989e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter        typedef signed   __int32 int32_t;
8089e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter        typedef unsigned __int32 uint32_t;
8189e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter        typedef signed   __int64 int64_t;
8289e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter        typedef unsigned __int64 uint64_t;
8389e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter    #else
8489e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter        #include <stdint.h>
8589e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter    #endif
8689e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter#endif // !defined(VK_NO_STDINT_H)
8789e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter
8889e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter#ifdef __cplusplus
8989e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter} // extern "C"
9089e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter#endif // __cplusplus
9189e99e6dd74c1f407c2f2cb1aac2ad4ca3d45ff2Courtney Goeltzenleuchter
92677dec87b34f541122412f539422c763cd944b5cIan Elliott// Platform-specific headers required by platform window system extensions.
93677dec87b34f541122412f539422c763cd944b5cIan Elliott// These are enabled prior to #including "vulkan.h". The same enable then
94677dec87b34f541122412f539422c763cd944b5cIan Elliott// controls inclusion of the extension interfaces in vulkan.h.
95677dec87b34f541122412f539422c763cd944b5cIan Elliott
96677dec87b34f541122412f539422c763cd944b5cIan Elliott#ifdef VK_USE_PLATFORM_ANDROID_KHR
97677dec87b34f541122412f539422c763cd944b5cIan Elliott#include <android/native_window.h>
98677dec87b34f541122412f539422c763cd944b5cIan Elliott#endif
99677dec87b34f541122412f539422c763cd944b5cIan Elliott
100677dec87b34f541122412f539422c763cd944b5cIan Elliott#ifdef VK_USE_PLATFORM_MIR_KHR
101677dec87b34f541122412f539422c763cd944b5cIan Elliott#include <mir_toolkit/client_types.h>
102677dec87b34f541122412f539422c763cd944b5cIan Elliott#endif
103677dec87b34f541122412f539422c763cd944b5cIan Elliott
104677dec87b34f541122412f539422c763cd944b5cIan Elliott#ifdef VK_USE_PLATFORM_WAYLAND_KHR
105677dec87b34f541122412f539422c763cd944b5cIan Elliott#include <wayland-client.h>
106677dec87b34f541122412f539422c763cd944b5cIan Elliott#endif
107677dec87b34f541122412f539422c763cd944b5cIan Elliott
108677dec87b34f541122412f539422c763cd944b5cIan Elliott#ifdef VK_USE_PLATFORM_WIN32_KHR
109677dec87b34f541122412f539422c763cd944b5cIan Elliott#include <windows.h>
110677dec87b34f541122412f539422c763cd944b5cIan Elliott#endif
111677dec87b34f541122412f539422c763cd944b5cIan Elliott
112677dec87b34f541122412f539422c763cd944b5cIan Elliott#ifdef VK_USE_PLATFORM_XLIB_KHR
113677dec87b34f541122412f539422c763cd944b5cIan Elliott#include <X11/Xlib.h>
114677dec87b34f541122412f539422c763cd944b5cIan Elliott#endif
115677dec87b34f541122412f539422c763cd944b5cIan Elliott
116677dec87b34f541122412f539422c763cd944b5cIan Elliott#ifdef VK_USE_PLATFORM_XCB_KHR
117677dec87b34f541122412f539422c763cd944b5cIan Elliott#include <xcb/xcb.h>
118677dec87b34f541122412f539422c763cd944b5cIan Elliott#endif
119677dec87b34f541122412f539422c763cd944b5cIan Elliott
120f1ea418f193d10a8455cdf47e0eeeeb1f4d8b5bfJon Ashburn#endif
121