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