1*4882a593Smuzhiyun #ifndef __khrplatform_h_ 2*4882a593Smuzhiyun #define __khrplatform_h_ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun /* 5*4882a593Smuzhiyun ** Copyright (c) 2008-2018 The Khronos Group Inc. 6*4882a593Smuzhiyun ** 7*4882a593Smuzhiyun ** Permission is hereby granted, free of charge, to any person obtaining a 8*4882a593Smuzhiyun ** copy of this software and/or associated documentation files (the 9*4882a593Smuzhiyun ** "Materials"), to deal in the Materials without restriction, including 10*4882a593Smuzhiyun ** without limitation the rights to use, copy, modify, merge, publish, 11*4882a593Smuzhiyun ** distribute, sublicense, and/or sell copies of the Materials, and to 12*4882a593Smuzhiyun ** permit persons to whom the Materials are furnished to do so, subject to 13*4882a593Smuzhiyun ** the following conditions: 14*4882a593Smuzhiyun ** 15*4882a593Smuzhiyun ** The above copyright notice and this permission notice shall be included 16*4882a593Smuzhiyun ** in all copies or substantial portions of the Materials. 17*4882a593Smuzhiyun ** 18*4882a593Smuzhiyun ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19*4882a593Smuzhiyun ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20*4882a593Smuzhiyun ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 21*4882a593Smuzhiyun ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22*4882a593Smuzhiyun ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23*4882a593Smuzhiyun ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24*4882a593Smuzhiyun ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* Khronos platform-specific types and definitions. 28*4882a593Smuzhiyun * 29*4882a593Smuzhiyun * The master copy of khrplatform.h is maintained in the Khronos EGL 30*4882a593Smuzhiyun * Registry repository at https://github.com/KhronosGroup/EGL-Registry 31*4882a593Smuzhiyun * The last semantic modification to khrplatform.h was at commit ID: 32*4882a593Smuzhiyun * 67a3e0864c2d75ea5287b9f3d2eb74a745936692 33*4882a593Smuzhiyun * 34*4882a593Smuzhiyun * Adopters may modify this file to suit their platform. Adopters are 35*4882a593Smuzhiyun * encouraged to submit platform specific modifications to the Khronos 36*4882a593Smuzhiyun * group so that they can be included in future versions of this file. 37*4882a593Smuzhiyun * Please submit changes by filing pull requests or issues on 38*4882a593Smuzhiyun * the EGL Registry repository linked above. 39*4882a593Smuzhiyun * 40*4882a593Smuzhiyun * 41*4882a593Smuzhiyun * See the Implementer's Guidelines for information about where this file 42*4882a593Smuzhiyun * should be located on your system and for more details of its use: 43*4882a593Smuzhiyun * http://www.khronos.org/registry/implementers_guide.pdf 44*4882a593Smuzhiyun * 45*4882a593Smuzhiyun * This file should be included as 46*4882a593Smuzhiyun * #include <KHR/khrplatform.h> 47*4882a593Smuzhiyun * by Khronos client API header files that use its types and defines. 48*4882a593Smuzhiyun * 49*4882a593Smuzhiyun * The types in khrplatform.h should only be used to define API-specific types. 50*4882a593Smuzhiyun * 51*4882a593Smuzhiyun * Types defined in khrplatform.h: 52*4882a593Smuzhiyun * khronos_int8_t signed 8 bit 53*4882a593Smuzhiyun * khronos_uint8_t unsigned 8 bit 54*4882a593Smuzhiyun * khronos_int16_t signed 16 bit 55*4882a593Smuzhiyun * khronos_uint16_t unsigned 16 bit 56*4882a593Smuzhiyun * khronos_int32_t signed 32 bit 57*4882a593Smuzhiyun * khronos_uint32_t unsigned 32 bit 58*4882a593Smuzhiyun * khronos_int64_t signed 64 bit 59*4882a593Smuzhiyun * khronos_uint64_t unsigned 64 bit 60*4882a593Smuzhiyun * khronos_intptr_t signed same number of bits as a pointer 61*4882a593Smuzhiyun * khronos_uintptr_t unsigned same number of bits as a pointer 62*4882a593Smuzhiyun * khronos_ssize_t signed size 63*4882a593Smuzhiyun * khronos_usize_t unsigned size 64*4882a593Smuzhiyun * khronos_float_t signed 32 bit floating point 65*4882a593Smuzhiyun * khronos_time_ns_t unsigned 64 bit time in nanoseconds 66*4882a593Smuzhiyun * khronos_utime_nanoseconds_t unsigned time interval or absolute time in 67*4882a593Smuzhiyun * nanoseconds 68*4882a593Smuzhiyun * khronos_stime_nanoseconds_t signed time interval in nanoseconds 69*4882a593Smuzhiyun * khronos_boolean_enum_t enumerated boolean type. This should 70*4882a593Smuzhiyun * only be used as a base type when a client API's boolean type is 71*4882a593Smuzhiyun * an enum. Client APIs which use an integer or other type for 72*4882a593Smuzhiyun * booleans cannot use this as the base type for their boolean. 73*4882a593Smuzhiyun * 74*4882a593Smuzhiyun * Tokens defined in khrplatform.h: 75*4882a593Smuzhiyun * 76*4882a593Smuzhiyun * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. 77*4882a593Smuzhiyun * 78*4882a593Smuzhiyun * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. 79*4882a593Smuzhiyun * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. 80*4882a593Smuzhiyun * 81*4882a593Smuzhiyun * Calling convention macros defined in this file: 82*4882a593Smuzhiyun * KHRONOS_APICALL 83*4882a593Smuzhiyun * KHRONOS_APIENTRY 84*4882a593Smuzhiyun * KHRONOS_APIATTRIBUTES 85*4882a593Smuzhiyun * 86*4882a593Smuzhiyun * These may be used in function prototypes as: 87*4882a593Smuzhiyun * 88*4882a593Smuzhiyun * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( 89*4882a593Smuzhiyun * int arg1, 90*4882a593Smuzhiyun * int arg2) KHRONOS_APIATTRIBUTES; 91*4882a593Smuzhiyun */ 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun #if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) 94*4882a593Smuzhiyun # define KHRONOS_STATIC 1 95*4882a593Smuzhiyun #endif 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /*------------------------------------------------------------------------- 98*4882a593Smuzhiyun * Definition of KHRONOS_APICALL 99*4882a593Smuzhiyun *------------------------------------------------------------------------- 100*4882a593Smuzhiyun * This precedes the return type of the function in the function prototype. 101*4882a593Smuzhiyun */ 102*4882a593Smuzhiyun #if defined(KHRONOS_STATIC) 103*4882a593Smuzhiyun /* If the preprocessor constant KHRONOS_STATIC is defined, make the 104*4882a593Smuzhiyun * header compatible with static linking. */ 105*4882a593Smuzhiyun # define KHRONOS_APICALL 106*4882a593Smuzhiyun #elif defined(_WIN32) 107*4882a593Smuzhiyun # define KHRONOS_APICALL __declspec(dllimport) 108*4882a593Smuzhiyun #elif defined (__SYMBIAN32__) 109*4882a593Smuzhiyun # define KHRONOS_APICALL IMPORT_C 110*4882a593Smuzhiyun #elif defined(__ANDROID__) 111*4882a593Smuzhiyun # define KHRONOS_APICALL __attribute__((visibility("default"))) 112*4882a593Smuzhiyun #else 113*4882a593Smuzhiyun # define KHRONOS_APICALL 114*4882a593Smuzhiyun #endif 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /*------------------------------------------------------------------------- 117*4882a593Smuzhiyun * Definition of KHRONOS_APIENTRY 118*4882a593Smuzhiyun *------------------------------------------------------------------------- 119*4882a593Smuzhiyun * This follows the return type of the function and precedes the function 120*4882a593Smuzhiyun * name in the function prototype. 121*4882a593Smuzhiyun */ 122*4882a593Smuzhiyun #if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(KHRONOS_STATIC) 123*4882a593Smuzhiyun /* Win32 but not WinCE */ 124*4882a593Smuzhiyun # define KHRONOS_APIENTRY __stdcall 125*4882a593Smuzhiyun #else 126*4882a593Smuzhiyun # define KHRONOS_APIENTRY 127*4882a593Smuzhiyun #endif 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /*------------------------------------------------------------------------- 130*4882a593Smuzhiyun * Definition of KHRONOS_APIATTRIBUTES 131*4882a593Smuzhiyun *------------------------------------------------------------------------- 132*4882a593Smuzhiyun * This follows the closing parenthesis of the function prototype arguments. 133*4882a593Smuzhiyun */ 134*4882a593Smuzhiyun #if defined (__ARMCC_2__) 135*4882a593Smuzhiyun #define KHRONOS_APIATTRIBUTES __softfp 136*4882a593Smuzhiyun #else 137*4882a593Smuzhiyun #define KHRONOS_APIATTRIBUTES 138*4882a593Smuzhiyun #endif 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /*------------------------------------------------------------------------- 141*4882a593Smuzhiyun * basic type definitions 142*4882a593Smuzhiyun *-----------------------------------------------------------------------*/ 143*4882a593Smuzhiyun #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun /* 147*4882a593Smuzhiyun * Using <stdint.h> 148*4882a593Smuzhiyun */ 149*4882a593Smuzhiyun #include <stdint.h> 150*4882a593Smuzhiyun typedef int32_t khronos_int32_t; 151*4882a593Smuzhiyun typedef uint32_t khronos_uint32_t; 152*4882a593Smuzhiyun typedef int64_t khronos_int64_t; 153*4882a593Smuzhiyun typedef uint64_t khronos_uint64_t; 154*4882a593Smuzhiyun #define KHRONOS_SUPPORT_INT64 1 155*4882a593Smuzhiyun #define KHRONOS_SUPPORT_FLOAT 1 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun #elif defined(__VMS ) || defined(__sgi) 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun /* 160*4882a593Smuzhiyun * Using <inttypes.h> 161*4882a593Smuzhiyun */ 162*4882a593Smuzhiyun #include <inttypes.h> 163*4882a593Smuzhiyun typedef int32_t khronos_int32_t; 164*4882a593Smuzhiyun typedef uint32_t khronos_uint32_t; 165*4882a593Smuzhiyun typedef int64_t khronos_int64_t; 166*4882a593Smuzhiyun typedef uint64_t khronos_uint64_t; 167*4882a593Smuzhiyun #define KHRONOS_SUPPORT_INT64 1 168*4882a593Smuzhiyun #define KHRONOS_SUPPORT_FLOAT 1 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #elif defined(_WIN32) && !defined(__SCITECH_SNAP__) 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* 173*4882a593Smuzhiyun * Win32 174*4882a593Smuzhiyun */ 175*4882a593Smuzhiyun typedef __int32 khronos_int32_t; 176*4882a593Smuzhiyun typedef unsigned __int32 khronos_uint32_t; 177*4882a593Smuzhiyun typedef __int64 khronos_int64_t; 178*4882a593Smuzhiyun typedef unsigned __int64 khronos_uint64_t; 179*4882a593Smuzhiyun #define KHRONOS_SUPPORT_INT64 1 180*4882a593Smuzhiyun #define KHRONOS_SUPPORT_FLOAT 1 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun #elif defined(__sun__) || defined(__digital__) 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun /* 185*4882a593Smuzhiyun * Sun or Digital 186*4882a593Smuzhiyun */ 187*4882a593Smuzhiyun typedef int khronos_int32_t; 188*4882a593Smuzhiyun typedef unsigned int khronos_uint32_t; 189*4882a593Smuzhiyun #if defined(__arch64__) || defined(_LP64) 190*4882a593Smuzhiyun typedef long int khronos_int64_t; 191*4882a593Smuzhiyun typedef unsigned long int khronos_uint64_t; 192*4882a593Smuzhiyun #else 193*4882a593Smuzhiyun typedef long long int khronos_int64_t; 194*4882a593Smuzhiyun typedef unsigned long long int khronos_uint64_t; 195*4882a593Smuzhiyun #endif /* __arch64__ */ 196*4882a593Smuzhiyun #define KHRONOS_SUPPORT_INT64 1 197*4882a593Smuzhiyun #define KHRONOS_SUPPORT_FLOAT 1 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #elif 0 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /* 202*4882a593Smuzhiyun * Hypothetical platform with no float or int64 support 203*4882a593Smuzhiyun */ 204*4882a593Smuzhiyun typedef int khronos_int32_t; 205*4882a593Smuzhiyun typedef unsigned int khronos_uint32_t; 206*4882a593Smuzhiyun #define KHRONOS_SUPPORT_INT64 0 207*4882a593Smuzhiyun #define KHRONOS_SUPPORT_FLOAT 0 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun #else 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun /* 212*4882a593Smuzhiyun * Generic fallback 213*4882a593Smuzhiyun */ 214*4882a593Smuzhiyun #include <stdint.h> 215*4882a593Smuzhiyun typedef int32_t khronos_int32_t; 216*4882a593Smuzhiyun typedef uint32_t khronos_uint32_t; 217*4882a593Smuzhiyun typedef int64_t khronos_int64_t; 218*4882a593Smuzhiyun typedef uint64_t khronos_uint64_t; 219*4882a593Smuzhiyun #define KHRONOS_SUPPORT_INT64 1 220*4882a593Smuzhiyun #define KHRONOS_SUPPORT_FLOAT 1 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun #endif 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun /* 226*4882a593Smuzhiyun * Types that are (so far) the same on all platforms 227*4882a593Smuzhiyun */ 228*4882a593Smuzhiyun typedef signed char khronos_int8_t; 229*4882a593Smuzhiyun typedef unsigned char khronos_uint8_t; 230*4882a593Smuzhiyun typedef signed short int khronos_int16_t; 231*4882a593Smuzhiyun typedef unsigned short int khronos_uint16_t; 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun /* 234*4882a593Smuzhiyun * Types that differ between LLP64 and LP64 architectures - in LLP64, 235*4882a593Smuzhiyun * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears 236*4882a593Smuzhiyun * to be the only LLP64 architecture in current use. 237*4882a593Smuzhiyun */ 238*4882a593Smuzhiyun #ifdef _WIN64 239*4882a593Smuzhiyun typedef signed long long int khronos_intptr_t; 240*4882a593Smuzhiyun typedef unsigned long long int khronos_uintptr_t; 241*4882a593Smuzhiyun typedef signed long long int khronos_ssize_t; 242*4882a593Smuzhiyun typedef unsigned long long int khronos_usize_t; 243*4882a593Smuzhiyun #else 244*4882a593Smuzhiyun typedef signed long int khronos_intptr_t; 245*4882a593Smuzhiyun typedef unsigned long int khronos_uintptr_t; 246*4882a593Smuzhiyun typedef signed long int khronos_ssize_t; 247*4882a593Smuzhiyun typedef unsigned long int khronos_usize_t; 248*4882a593Smuzhiyun #endif 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun #if KHRONOS_SUPPORT_FLOAT 251*4882a593Smuzhiyun /* 252*4882a593Smuzhiyun * Float type 253*4882a593Smuzhiyun */ 254*4882a593Smuzhiyun typedef float khronos_float_t; 255*4882a593Smuzhiyun #endif 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun #if KHRONOS_SUPPORT_INT64 258*4882a593Smuzhiyun /* Time types 259*4882a593Smuzhiyun * 260*4882a593Smuzhiyun * These types can be used to represent a time interval in nanoseconds or 261*4882a593Smuzhiyun * an absolute Unadjusted System Time. Unadjusted System Time is the number 262*4882a593Smuzhiyun * of nanoseconds since some arbitrary system event (e.g. since the last 263*4882a593Smuzhiyun * time the system booted). The Unadjusted System Time is an unsigned 264*4882a593Smuzhiyun * 64 bit value that wraps back to 0 every 584 years. Time intervals 265*4882a593Smuzhiyun * may be either signed or unsigned. 266*4882a593Smuzhiyun */ 267*4882a593Smuzhiyun typedef khronos_uint64_t khronos_utime_nanoseconds_t; 268*4882a593Smuzhiyun typedef khronos_int64_t khronos_stime_nanoseconds_t; 269*4882a593Smuzhiyun #endif 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /* 272*4882a593Smuzhiyun * Dummy value used to pad enum types to 32 bits. 273*4882a593Smuzhiyun */ 274*4882a593Smuzhiyun #ifndef KHRONOS_MAX_ENUM 275*4882a593Smuzhiyun #define KHRONOS_MAX_ENUM 0x7FFFFFFF 276*4882a593Smuzhiyun #endif 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun /* 279*4882a593Smuzhiyun * Enumerated boolean type 280*4882a593Smuzhiyun * 281*4882a593Smuzhiyun * Values other than zero should be considered to be true. Therefore 282*4882a593Smuzhiyun * comparisons should not be made against KHRONOS_TRUE. 283*4882a593Smuzhiyun */ 284*4882a593Smuzhiyun typedef enum { 285*4882a593Smuzhiyun KHRONOS_FALSE = 0, 286*4882a593Smuzhiyun KHRONOS_TRUE = 1, 287*4882a593Smuzhiyun KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM 288*4882a593Smuzhiyun } khronos_boolean_enum_t; 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun #endif /* __khrplatform_h_ */ 291