102f4aeb0Sopenharmony_ci#ifndef __khrplatform_h_ 202f4aeb0Sopenharmony_ci#define __khrplatform_h_ 302f4aeb0Sopenharmony_ci 402f4aeb0Sopenharmony_ci/* 502f4aeb0Sopenharmony_ci** Copyright (c) 2008-2018 The Khronos Group Inc. 602f4aeb0Sopenharmony_ci** 702f4aeb0Sopenharmony_ci** Permission is hereby granted, free of charge, to any person obtaining a 802f4aeb0Sopenharmony_ci** copy of this software and/or associated documentation files (the 902f4aeb0Sopenharmony_ci** "Materials"), to deal in the Materials without restriction, including 1002f4aeb0Sopenharmony_ci** without limitation the rights to use, copy, modify, merge, publish, 1102f4aeb0Sopenharmony_ci** distribute, sublicense, and/or sell copies of the Materials, and to 1202f4aeb0Sopenharmony_ci** permit persons to whom the Materials are furnished to do so, subject to 1302f4aeb0Sopenharmony_ci** the following conditions: 1402f4aeb0Sopenharmony_ci** 1502f4aeb0Sopenharmony_ci** The above copyright notice and this permission notice shall be included 1602f4aeb0Sopenharmony_ci** in all copies or substantial portions of the Materials. 1702f4aeb0Sopenharmony_ci** 1802f4aeb0Sopenharmony_ci** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 1902f4aeb0Sopenharmony_ci** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2002f4aeb0Sopenharmony_ci** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 2102f4aeb0Sopenharmony_ci** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 2202f4aeb0Sopenharmony_ci** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2302f4aeb0Sopenharmony_ci** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2402f4aeb0Sopenharmony_ci** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. 2502f4aeb0Sopenharmony_ci*/ 2602f4aeb0Sopenharmony_ci 2702f4aeb0Sopenharmony_ci/* Khronos platform-specific types and definitions. 2802f4aeb0Sopenharmony_ci * 2902f4aeb0Sopenharmony_ci * The master copy of khrplatform.h is maintained in the Khronos EGL 3002f4aeb0Sopenharmony_ci * Registry repository at https://github.com/KhronosGroup/EGL-Registry 3102f4aeb0Sopenharmony_ci * The last semantic modification to khrplatform.h was at commit ID: 3202f4aeb0Sopenharmony_ci * 67a3e0864c2d75ea5287b9f3d2eb74a745936692 3302f4aeb0Sopenharmony_ci * 3402f4aeb0Sopenharmony_ci * Adopters may modify this file to suit their platform. Adopters are 3502f4aeb0Sopenharmony_ci * encouraged to submit platform specific modifications to the Khronos 3602f4aeb0Sopenharmony_ci * group so that they can be included in future versions of this file. 3702f4aeb0Sopenharmony_ci * Please submit changes by filing pull requests or issues on 3802f4aeb0Sopenharmony_ci * the EGL Registry repository linked above. 3902f4aeb0Sopenharmony_ci * 4002f4aeb0Sopenharmony_ci * 4102f4aeb0Sopenharmony_ci * See the Implementer's Guidelines for information about where this file 4202f4aeb0Sopenharmony_ci * should be located on your system and for more details of its use: 4302f4aeb0Sopenharmony_ci * http://www.khronos.org/registry/implementers_guide.pdf 4402f4aeb0Sopenharmony_ci * 4502f4aeb0Sopenharmony_ci * This file should be included as 4602f4aeb0Sopenharmony_ci * #include <KHR/khrplatform.h> 4702f4aeb0Sopenharmony_ci * by Khronos client API header files that use its types and defines. 4802f4aeb0Sopenharmony_ci * 4902f4aeb0Sopenharmony_ci * The types in khrplatform.h should only be used to define API-specific types. 5002f4aeb0Sopenharmony_ci * 5102f4aeb0Sopenharmony_ci * Types defined in khrplatform.h: 5202f4aeb0Sopenharmony_ci * khronos_int8_t signed 8 bit 5302f4aeb0Sopenharmony_ci * khronos_uint8_t unsigned 8 bit 5402f4aeb0Sopenharmony_ci * khronos_int16_t signed 16 bit 5502f4aeb0Sopenharmony_ci * khronos_uint16_t unsigned 16 bit 5602f4aeb0Sopenharmony_ci * khronos_int32_t signed 32 bit 5702f4aeb0Sopenharmony_ci * khronos_uint32_t unsigned 32 bit 5802f4aeb0Sopenharmony_ci * khronos_int64_t signed 64 bit 5902f4aeb0Sopenharmony_ci * khronos_uint64_t unsigned 64 bit 6002f4aeb0Sopenharmony_ci * khronos_intptr_t signed same number of bits as a pointer 6102f4aeb0Sopenharmony_ci * khronos_uintptr_t unsigned same number of bits as a pointer 6202f4aeb0Sopenharmony_ci * khronos_ssize_t signed size 6302f4aeb0Sopenharmony_ci * khronos_usize_t unsigned size 6402f4aeb0Sopenharmony_ci * khronos_float_t signed 32 bit floating point 6502f4aeb0Sopenharmony_ci * khronos_time_ns_t unsigned 64 bit time in nanoseconds 6602f4aeb0Sopenharmony_ci * khronos_utime_nanoseconds_t unsigned time interval or absolute time in 6702f4aeb0Sopenharmony_ci * nanoseconds 6802f4aeb0Sopenharmony_ci * khronos_stime_nanoseconds_t signed time interval in nanoseconds 6902f4aeb0Sopenharmony_ci * khronos_boolean_enum_t enumerated boolean type. This should 7002f4aeb0Sopenharmony_ci * only be used as a base type when a client API's boolean type is 7102f4aeb0Sopenharmony_ci * an enum. Client APIs which use an integer or other type for 7202f4aeb0Sopenharmony_ci * booleans cannot use this as the base type for their boolean. 7302f4aeb0Sopenharmony_ci * 7402f4aeb0Sopenharmony_ci * Tokens defined in khrplatform.h: 7502f4aeb0Sopenharmony_ci * 7602f4aeb0Sopenharmony_ci * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. 7702f4aeb0Sopenharmony_ci * 7802f4aeb0Sopenharmony_ci * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. 7902f4aeb0Sopenharmony_ci * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. 8002f4aeb0Sopenharmony_ci * 8102f4aeb0Sopenharmony_ci * Calling convention macros defined in this file: 8202f4aeb0Sopenharmony_ci * KHRONOS_APICALL 8302f4aeb0Sopenharmony_ci * KHRONOS_APIENTRY 8402f4aeb0Sopenharmony_ci * KHRONOS_APIATTRIBUTES 8502f4aeb0Sopenharmony_ci * 8602f4aeb0Sopenharmony_ci * These may be used in function prototypes as: 8702f4aeb0Sopenharmony_ci * 8802f4aeb0Sopenharmony_ci * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( 8902f4aeb0Sopenharmony_ci * int arg1, 9002f4aeb0Sopenharmony_ci * int arg2) KHRONOS_APIATTRIBUTES; 9102f4aeb0Sopenharmony_ci */ 9202f4aeb0Sopenharmony_ci 9302f4aeb0Sopenharmony_ci#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) 9402f4aeb0Sopenharmony_ci# define KHRONOS_STATIC 1 9502f4aeb0Sopenharmony_ci#endif 9602f4aeb0Sopenharmony_ci 9702f4aeb0Sopenharmony_ci/*------------------------------------------------------------------------- 9802f4aeb0Sopenharmony_ci * Definition of KHRONOS_APICALL 9902f4aeb0Sopenharmony_ci *------------------------------------------------------------------------- 10002f4aeb0Sopenharmony_ci * This precedes the return type of the function in the function prototype. 10102f4aeb0Sopenharmony_ci */ 10202f4aeb0Sopenharmony_ci#if defined(KHRONOS_STATIC) 10302f4aeb0Sopenharmony_ci /* If the preprocessor constant KHRONOS_STATIC is defined, make the 10402f4aeb0Sopenharmony_ci * header compatible with static linking. */ 10502f4aeb0Sopenharmony_ci# define KHRONOS_APICALL 10602f4aeb0Sopenharmony_ci#elif defined(_WIN32) 10702f4aeb0Sopenharmony_ci# define KHRONOS_APICALL __declspec(dllimport) 10802f4aeb0Sopenharmony_ci#elif defined (__SYMBIAN32__) 10902f4aeb0Sopenharmony_ci# define KHRONOS_APICALL IMPORT_C 11002f4aeb0Sopenharmony_ci#elif defined(__ANDROID__) 11102f4aeb0Sopenharmony_ci# define KHRONOS_APICALL __attribute__((visibility("default"))) 11202f4aeb0Sopenharmony_ci#else 11302f4aeb0Sopenharmony_ci# define KHRONOS_APICALL 11402f4aeb0Sopenharmony_ci#endif 11502f4aeb0Sopenharmony_ci 11602f4aeb0Sopenharmony_ci/*------------------------------------------------------------------------- 11702f4aeb0Sopenharmony_ci * Definition of KHRONOS_APIENTRY 11802f4aeb0Sopenharmony_ci *------------------------------------------------------------------------- 11902f4aeb0Sopenharmony_ci * This follows the return type of the function and precedes the function 12002f4aeb0Sopenharmony_ci * name in the function prototype. 12102f4aeb0Sopenharmony_ci */ 12202f4aeb0Sopenharmony_ci#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) 12302f4aeb0Sopenharmony_ci /* Win32 but not WinCE */ 12402f4aeb0Sopenharmony_ci# define KHRONOS_APIENTRY __stdcall 12502f4aeb0Sopenharmony_ci#else 12602f4aeb0Sopenharmony_ci# define KHRONOS_APIENTRY 12702f4aeb0Sopenharmony_ci#endif 12802f4aeb0Sopenharmony_ci 12902f4aeb0Sopenharmony_ci/*------------------------------------------------------------------------- 13002f4aeb0Sopenharmony_ci * Definition of KHRONOS_APIATTRIBUTES 13102f4aeb0Sopenharmony_ci *------------------------------------------------------------------------- 13202f4aeb0Sopenharmony_ci * This follows the closing parenthesis of the function prototype arguments. 13302f4aeb0Sopenharmony_ci */ 13402f4aeb0Sopenharmony_ci#if defined (__ARMCC_2__) 13502f4aeb0Sopenharmony_ci#define KHRONOS_APIATTRIBUTES __softfp 13602f4aeb0Sopenharmony_ci#else 13702f4aeb0Sopenharmony_ci#define KHRONOS_APIATTRIBUTES 13802f4aeb0Sopenharmony_ci#endif 13902f4aeb0Sopenharmony_ci 14002f4aeb0Sopenharmony_ci/*------------------------------------------------------------------------- 14102f4aeb0Sopenharmony_ci * basic type definitions 14202f4aeb0Sopenharmony_ci *-----------------------------------------------------------------------*/ 14302f4aeb0Sopenharmony_ci#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) 14402f4aeb0Sopenharmony_ci 14502f4aeb0Sopenharmony_ci 14602f4aeb0Sopenharmony_ci/* 14702f4aeb0Sopenharmony_ci * Using <stdint.h> 14802f4aeb0Sopenharmony_ci */ 14902f4aeb0Sopenharmony_ci#include <stdint.h> 15002f4aeb0Sopenharmony_citypedef int32_t khronos_int32_t; 15102f4aeb0Sopenharmony_citypedef uint32_t khronos_uint32_t; 15202f4aeb0Sopenharmony_citypedef int64_t khronos_int64_t; 15302f4aeb0Sopenharmony_citypedef uint64_t khronos_uint64_t; 15402f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_INT64 1 15502f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_FLOAT 1 15602f4aeb0Sopenharmony_ci/* 15702f4aeb0Sopenharmony_ci * To support platform where unsigned long cannot be used interchangeably with 15802f4aeb0Sopenharmony_ci * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t. 15902f4aeb0Sopenharmony_ci * Ideally, we could just use (u)intptr_t everywhere, but this could result in 16002f4aeb0Sopenharmony_ci * ABI breakage if khronos_uintptr_t is changed from unsigned long to 16102f4aeb0Sopenharmony_ci * unsigned long long or similar (this results in different C++ name mangling). 16202f4aeb0Sopenharmony_ci * To avoid changes for existing platforms, we restrict usage of intptr_t to 16302f4aeb0Sopenharmony_ci * platforms where the size of a pointer is larger than the size of long. 16402f4aeb0Sopenharmony_ci */ 16502f4aeb0Sopenharmony_ci#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__) 16602f4aeb0Sopenharmony_ci#if __SIZEOF_POINTER__ > __SIZEOF_LONG__ 16702f4aeb0Sopenharmony_ci#define KHRONOS_USE_INTPTR_T 16802f4aeb0Sopenharmony_ci#endif 16902f4aeb0Sopenharmony_ci#endif 17002f4aeb0Sopenharmony_ci 17102f4aeb0Sopenharmony_ci#elif defined(__VMS ) || defined(__sgi) 17202f4aeb0Sopenharmony_ci 17302f4aeb0Sopenharmony_ci/* 17402f4aeb0Sopenharmony_ci * Using <inttypes.h> 17502f4aeb0Sopenharmony_ci */ 17602f4aeb0Sopenharmony_ci#include <inttypes.h> 17702f4aeb0Sopenharmony_citypedef int32_t khronos_int32_t; 17802f4aeb0Sopenharmony_citypedef uint32_t khronos_uint32_t; 17902f4aeb0Sopenharmony_citypedef int64_t khronos_int64_t; 18002f4aeb0Sopenharmony_citypedef uint64_t khronos_uint64_t; 18102f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_INT64 1 18202f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_FLOAT 1 18302f4aeb0Sopenharmony_ci 18402f4aeb0Sopenharmony_ci#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) 18502f4aeb0Sopenharmony_ci 18602f4aeb0Sopenharmony_ci/* 18702f4aeb0Sopenharmony_ci * Win32 18802f4aeb0Sopenharmony_ci */ 18902f4aeb0Sopenharmony_citypedef __int32 khronos_int32_t; 19002f4aeb0Sopenharmony_citypedef unsigned __int32 khronos_uint32_t; 19102f4aeb0Sopenharmony_citypedef __int64 khronos_int64_t; 19202f4aeb0Sopenharmony_citypedef unsigned __int64 khronos_uint64_t; 19302f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_INT64 1 19402f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_FLOAT 1 19502f4aeb0Sopenharmony_ci 19602f4aeb0Sopenharmony_ci#elif defined(__sun__) || defined(__digital__) 19702f4aeb0Sopenharmony_ci 19802f4aeb0Sopenharmony_ci/* 19902f4aeb0Sopenharmony_ci * Sun or Digital 20002f4aeb0Sopenharmony_ci */ 20102f4aeb0Sopenharmony_citypedef int khronos_int32_t; 20202f4aeb0Sopenharmony_citypedef unsigned int khronos_uint32_t; 20302f4aeb0Sopenharmony_ci#if defined(__arch64__) || defined(_LP64) 20402f4aeb0Sopenharmony_citypedef long int khronos_int64_t; 20502f4aeb0Sopenharmony_citypedef unsigned long int khronos_uint64_t; 20602f4aeb0Sopenharmony_ci#else 20702f4aeb0Sopenharmony_citypedef long long int khronos_int64_t; 20802f4aeb0Sopenharmony_citypedef unsigned long long int khronos_uint64_t; 20902f4aeb0Sopenharmony_ci#endif /* __arch64__ */ 21002f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_INT64 1 21102f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_FLOAT 1 21202f4aeb0Sopenharmony_ci 21302f4aeb0Sopenharmony_ci#elif 0 21402f4aeb0Sopenharmony_ci 21502f4aeb0Sopenharmony_ci/* 21602f4aeb0Sopenharmony_ci * Hypothetical platform with no float or int64 support 21702f4aeb0Sopenharmony_ci */ 21802f4aeb0Sopenharmony_citypedef int khronos_int32_t; 21902f4aeb0Sopenharmony_citypedef unsigned int khronos_uint32_t; 22002f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_INT64 0 22102f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_FLOAT 0 22202f4aeb0Sopenharmony_ci 22302f4aeb0Sopenharmony_ci#else 22402f4aeb0Sopenharmony_ci 22502f4aeb0Sopenharmony_ci/* 22602f4aeb0Sopenharmony_ci * Generic fallback 22702f4aeb0Sopenharmony_ci */ 22802f4aeb0Sopenharmony_ci#include <stdint.h> 22902f4aeb0Sopenharmony_citypedef int32_t khronos_int32_t; 23002f4aeb0Sopenharmony_citypedef uint32_t khronos_uint32_t; 23102f4aeb0Sopenharmony_citypedef int64_t khronos_int64_t; 23202f4aeb0Sopenharmony_citypedef uint64_t khronos_uint64_t; 23302f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_INT64 1 23402f4aeb0Sopenharmony_ci#define KHRONOS_SUPPORT_FLOAT 1 23502f4aeb0Sopenharmony_ci 23602f4aeb0Sopenharmony_ci#endif 23702f4aeb0Sopenharmony_ci 23802f4aeb0Sopenharmony_ci 23902f4aeb0Sopenharmony_ci/* 24002f4aeb0Sopenharmony_ci * Types that are (so far) the same on all platforms 24102f4aeb0Sopenharmony_ci */ 24202f4aeb0Sopenharmony_citypedef signed char khronos_int8_t; 24302f4aeb0Sopenharmony_citypedef unsigned char khronos_uint8_t; 24402f4aeb0Sopenharmony_citypedef signed short int khronos_int16_t; 24502f4aeb0Sopenharmony_citypedef unsigned short int khronos_uint16_t; 24602f4aeb0Sopenharmony_ci 24702f4aeb0Sopenharmony_ci/* 24802f4aeb0Sopenharmony_ci * Types that differ between LLP64 and LP64 architectures - in LLP64, 24902f4aeb0Sopenharmony_ci * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears 25002f4aeb0Sopenharmony_ci * to be the only LLP64 architecture in current use. 25102f4aeb0Sopenharmony_ci */ 25202f4aeb0Sopenharmony_ci#ifdef KHRONOS_USE_INTPTR_T 25302f4aeb0Sopenharmony_citypedef intptr_t khronos_intptr_t; 25402f4aeb0Sopenharmony_citypedef uintptr_t khronos_uintptr_t; 25502f4aeb0Sopenharmony_ci#elif defined(_WIN64) 25602f4aeb0Sopenharmony_citypedef signed long long int khronos_intptr_t; 25702f4aeb0Sopenharmony_citypedef unsigned long long int khronos_uintptr_t; 25802f4aeb0Sopenharmony_ci#else 25902f4aeb0Sopenharmony_citypedef signed long int khronos_intptr_t; 26002f4aeb0Sopenharmony_citypedef unsigned long int khronos_uintptr_t; 26102f4aeb0Sopenharmony_ci#endif 26202f4aeb0Sopenharmony_ci 26302f4aeb0Sopenharmony_ci#if defined(_WIN64) 26402f4aeb0Sopenharmony_citypedef signed long long int khronos_ssize_t; 26502f4aeb0Sopenharmony_citypedef unsigned long long int khronos_usize_t; 26602f4aeb0Sopenharmony_ci#else 26702f4aeb0Sopenharmony_citypedef signed long int khronos_ssize_t; 26802f4aeb0Sopenharmony_citypedef unsigned long int khronos_usize_t; 26902f4aeb0Sopenharmony_ci#endif 27002f4aeb0Sopenharmony_ci 27102f4aeb0Sopenharmony_ci#if KHRONOS_SUPPORT_FLOAT 27202f4aeb0Sopenharmony_ci/* 27302f4aeb0Sopenharmony_ci * Float type 27402f4aeb0Sopenharmony_ci */ 27502f4aeb0Sopenharmony_citypedef float khronos_float_t; 27602f4aeb0Sopenharmony_ci#endif 27702f4aeb0Sopenharmony_ci 27802f4aeb0Sopenharmony_ci#if KHRONOS_SUPPORT_INT64 27902f4aeb0Sopenharmony_ci/* Time types 28002f4aeb0Sopenharmony_ci * 28102f4aeb0Sopenharmony_ci * These types can be used to represent a time interval in nanoseconds or 28202f4aeb0Sopenharmony_ci * an absolute Unadjusted System Time. Unadjusted System Time is the number 28302f4aeb0Sopenharmony_ci * of nanoseconds since some arbitrary system event (e.g. since the last 28402f4aeb0Sopenharmony_ci * time the system booted). The Unadjusted System Time is an unsigned 28502f4aeb0Sopenharmony_ci * 64 bit value that wraps back to 0 every 584 years. Time intervals 28602f4aeb0Sopenharmony_ci * may be either signed or unsigned. 28702f4aeb0Sopenharmony_ci */ 28802f4aeb0Sopenharmony_citypedef khronos_uint64_t khronos_utime_nanoseconds_t; 28902f4aeb0Sopenharmony_citypedef khronos_int64_t khronos_stime_nanoseconds_t; 29002f4aeb0Sopenharmony_ci#endif 29102f4aeb0Sopenharmony_ci 29202f4aeb0Sopenharmony_ci/* 29302f4aeb0Sopenharmony_ci * Dummy value used to pad enum types to 32 bits. 29402f4aeb0Sopenharmony_ci */ 29502f4aeb0Sopenharmony_ci#ifndef KHRONOS_MAX_ENUM 29602f4aeb0Sopenharmony_ci#define KHRONOS_MAX_ENUM 0x7FFFFFFF 29702f4aeb0Sopenharmony_ci#endif 29802f4aeb0Sopenharmony_ci 29902f4aeb0Sopenharmony_ci/* 30002f4aeb0Sopenharmony_ci * Enumerated boolean type 30102f4aeb0Sopenharmony_ci * 30202f4aeb0Sopenharmony_ci * Values other than zero should be considered to be true. Therefore 30302f4aeb0Sopenharmony_ci * comparisons should not be made against KHRONOS_TRUE. 30402f4aeb0Sopenharmony_ci */ 30502f4aeb0Sopenharmony_citypedef enum { 30602f4aeb0Sopenharmony_ci KHRONOS_FALSE = 0, 30702f4aeb0Sopenharmony_ci KHRONOS_TRUE = 1, 30802f4aeb0Sopenharmony_ci KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM 30902f4aeb0Sopenharmony_ci} khronos_boolean_enum_t; 31002f4aeb0Sopenharmony_ci 31102f4aeb0Sopenharmony_ci#endif /* __khrplatform_h_ */ 312