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