| 1 | //  |
| 2 | // File: vk_platform.h  |
| 3 | //  |
| 4 | /*  |
| 5 | ** Copyright 2014-2023 The Khronos Group Inc.  |
| 6 | **  |
| 7 | ** SPDX-License-Identifier: Apache-2.0  |
| 8 | */  |
| 9 |   |
| 10 |   |
| 11 | #ifndef VK_PLATFORM_H_  |
| 12 | #define VK_PLATFORM_H_  |
| 13 |   |
| 14 | #ifdef __cplusplus  |
| 15 | extern "C"   |
| 16 | {  |
| 17 | #endif // __cplusplus  |
| 18 |   |
| 19 | /*  |
| 20 | ***************************************************************************************************  |
| 21 | * Platform-specific directives and type declarations  |
| 22 | ***************************************************************************************************  |
| 23 | */  |
| 24 |   |
| 25 | /* Platform-specific calling convention macros.  |
| 26 | *  |
| 27 | * Platforms should define these so that Vulkan clients call Vulkan commands  |
| 28 | * with the same calling conventions that the Vulkan implementation expects.  |
| 29 | *  |
| 30 | * VKAPI_ATTR - Placed before the return type in function declarations.  |
| 31 | * Useful for C++11 and GCC/Clang-style function attribute syntax.  |
| 32 | * VKAPI_CALL - Placed after the return type in function declarations.  |
| 33 | * Useful for MSVC-style calling convention syntax.  |
| 34 | * VKAPI_PTR - Placed between the '(' and '*' in function pointer types.  |
| 35 | *  |
| 36 | * Function declaration: VKAPI_ATTR void VKAPI_CALL vkCommand(void);  |
| 37 | * Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void);  |
| 38 | */  |
| 39 | #if defined(_WIN32)  |
| 40 | // On Windows, Vulkan commands use the stdcall convention  |
| 41 | #define VKAPI_ATTR  |
| 42 | #define VKAPI_CALL __stdcall  |
| 43 | #define VKAPI_PTR VKAPI_CALL  |
| 44 | #elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7  |
| 45 | #error "Vulkan is not supported for the 'armeabi' NDK ABI"  |
| 46 | #elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE)  |
| 47 | // On Android 32-bit ARM targets, Vulkan functions use the "hardfloat"  |
| 48 | // calling convention, i.e. float parameters are passed in registers. This  |
| 49 | // is true even if the rest of the application passes floats on the stack,  |
| 50 | // as it does by default when compiling for the armeabi-v7a NDK ABI.  |
| 51 | #define VKAPI_ATTR __attribute__((pcs("aapcs-vfp")))  |
| 52 | #define VKAPI_CALL  |
| 53 | #define VKAPI_PTR VKAPI_ATTR  |
| 54 | #else  |
| 55 | // On other platforms, use the default calling convention  |
| 56 | #define VKAPI_ATTR  |
| 57 | #define VKAPI_CALL  |
| 58 | #define VKAPI_PTR  |
| 59 | #endif  |
| 60 |   |
| 61 | #if !defined(VK_NO_STDDEF_H)  |
| 62 | #include <stddef.h>  |
| 63 | #endif // !defined(VK_NO_STDDEF_H)  |
| 64 |   |
| 65 | #if !defined(VK_NO_STDINT_H)  |
| 66 | #if defined(_MSC_VER) && (_MSC_VER < 1600)  |
| 67 | typedef signed __int8 int8_t;  |
| 68 | typedef unsigned __int8 uint8_t;  |
| 69 | typedef signed __int16 int16_t;  |
| 70 | typedef unsigned __int16 uint16_t;  |
| 71 | typedef signed __int32 int32_t;  |
| 72 | typedef unsigned __int32 uint32_t;  |
| 73 | typedef signed __int64 int64_t;  |
| 74 | typedef unsigned __int64 uint64_t;  |
| 75 | #else  |
| 76 | #include <stdint.h>  |
| 77 | #endif  |
| 78 | #endif // !defined(VK_NO_STDINT_H)  |
| 79 |   |
| 80 | #ifdef __cplusplus  |
| 81 | } // extern "C"  |
| 82 | #endif // __cplusplus  |
| 83 |   |
| 84 | #endif  |
| 85 | |