/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TNT_FILAMENT_BACKEND_OPENGL_GL_HEADERS_H #define TNT_FILAMENT_BACKEND_OPENGL_GL_HEADERS_H /* * Configuration we aim to support: * * GL 4.5 headers * - GL 4.1 runtime (for macOS) * - GL 4.5 runtime * * GLES 2.0 headers * - GLES 2.0 runtime Android only * * GLES 3.0 headers * - GLES 3.0 runtime iOS and WebGL2 only * * GLES 3.1 headers * - GLES 2.0 runtime * - GLES 3.0 runtime * - GLES 3.1 runtime */ #if defined(__ANDROID__) || defined(FILAMENT_USE_EXTERNAL_GLES3) || defined(__EMSCRIPTEN__) #if defined(__EMSCRIPTEN__) # include #else # include #endif #include #elif defined(IOS) #define GLES_SILENCE_DEPRECATION #include #include #else // bluegl exposes symbols prefixed with bluegl_ to avoid clashing with clients that also link // against GL. // This header re-defines GL function names with the bluegl_ prefix. // For example: // #define glFunction bluegl_glFunction // This header must come before . #include #include #endif /* Validate the header configurations we aim to support */ #if defined(GL_VERSION_4_5) #elif defined(GL_ES_VERSION_3_1) #elif defined(GL_ES_VERSION_3_0) # if !defined(IOS) && !defined(__EMSCRIPTEN__) # error "GLES 3.0 headers only supported on iOS and WebGL2" # endif #elif defined(GL_ES_VERSION_2_0) # if !defined(__ANDROID__) # error "GLES 2.0 headers only supported on Android" # endif #else # error "Minimum header version must be OpenGL ES 2.0 or OpenGL 4.5" #endif /* * GLES extensions */ #if defined(GL_ES_VERSION_2_0) // this basically means all versions of GLES #if defined(IOS) // iOS headers only provide prototypes, nothing to do. #else #define FILAMENT_IMPORT_ENTRY_POINTS /* The Android NDK doesn't expose extensions, fake it with eglGetProcAddress */ namespace glext { // importGLESExtensionsEntryPoints is thread-safe and can be called multiple times. // it is currently called from PlatformEGL. void importGLESExtensionsEntryPoints(); #ifdef GL_OES_EGL_image extern PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES; #endif #ifdef GL_EXT_debug_marker extern PFNGLINSERTEVENTMARKEREXTPROC glInsertEventMarkerEXT; extern PFNGLPUSHGROUPMARKEREXTPROC glPushGroupMarkerEXT; extern PFNGLPOPGROUPMARKEREXTPROC glPopGroupMarkerEXT; #endif #ifdef GL_EXT_multisampled_render_to_texture extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; extern PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT; #endif #ifdef GL_KHR_debug extern PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR; extern PFNGLGETDEBUGMESSAGELOGKHRPROC glGetDebugMessageLogKHR; #endif #ifdef GL_EXT_clip_control extern PFNGLCLIPCONTROLEXTPROC glClipControlEXT; #endif #ifdef GL_EXT_disjoint_timer_query extern PFNGLGETQUERYOBJECTUI64VEXTPROC glGetQueryObjectui64v; #endif #if defined(__ANDROID__) extern PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; #endif } // namespace glext using namespace glext; #endif // Prevent lots of #ifdef's between desktop and mobile #ifdef GL_EXT_disjoint_timer_query # define GL_TIME_ELAPSED GL_TIME_ELAPSED_EXT #endif #ifdef GL_EXT_clip_control # define GL_LOWER_LEFT GL_LOWER_LEFT_EXT # define GL_ZERO_TO_ONE GL_ZERO_TO_ONE_EXT #endif // we need GL_TEXTURE_CUBE_MAP_ARRAY defined, but we won't use it if the extension/feature // is not available. #if defined(GL_EXT_texture_cube_map_array) # define GL_TEXTURE_CUBE_MAP_ARRAY GL_TEXTURE_CUBE_MAP_ARRAY_EXT #else # define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 #endif #if defined(GL_KHR_debug) # define GL_DEBUG_OUTPUT GL_DEBUG_OUTPUT_KHR # define GL_DEBUG_OUTPUT_SYNCHRONOUS GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR # define GL_DEBUG_SEVERITY_HIGH GL_DEBUG_SEVERITY_HIGH_KHR # define GL_DEBUG_SEVERITY_MEDIUM GL_DEBUG_SEVERITY_MEDIUM_KHR # define GL_DEBUG_SEVERITY_LOW GL_DEBUG_SEVERITY_LOW_KHR # define GL_DEBUG_SEVERITY_NOTIFICATION GL_DEBUG_SEVERITY_NOTIFICATION_KHR # define GL_DEBUG_TYPE_MARKER GL_DEBUG_TYPE_MARKER_KHR # define GL_DEBUG_TYPE_ERROR GL_DEBUG_TYPE_ERROR_KHR # define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR # define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR # define GL_DEBUG_TYPE_PORTABILITY GL_DEBUG_TYPE_PORTABILITY_KHR # define GL_DEBUG_TYPE_PERFORMANCE GL_DEBUG_TYPE_PERFORMANCE_KHR # define GL_DEBUG_TYPE_OTHER GL_DEBUG_TYPE_OTHER_KHR # define glDebugMessageCallback glDebugMessageCallbackKHR #endif #endif // GL_ES_VERSION_2_0 // This is just to simplify the implementation (i.e. so we don't have to have #ifdefs everywhere) #ifndef GL_OES_EGL_image_external #define GL_TEXTURE_EXTERNAL_OES 0x8D65 #endif // This is an odd duck function that exists in WebGL 2.0 but not in OpenGL ES. #if defined(__EMSCRIPTEN__) extern "C" { void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data); } #endif #if defined(GL_ES_VERSION_2_0) # define BACKEND_OPENGL_VERSION_GLES #elif defined(GL_VERSION_4_5) # define BACKEND_OPENGL_VERSION_GL #else # error "Unsupported header version" #endif #if defined(GL_VERSION_4_5) || defined(GL_ES_VERSION_3_1) # define BACKEND_OPENGL_LEVEL_GLES31 # ifdef __EMSCRIPTEN__ # error "__EMSCRIPTEN__ shouldn't be defined with GLES 3.1 headers" # endif #endif #if defined(GL_VERSION_4_5) || defined(GL_ES_VERSION_3_0) # define BACKEND_OPENGL_LEVEL_GLES30 #endif #if defined(GL_VERSION_4_5) || defined(GL_ES_VERSION_2_0) # define BACKEND_OPENGL_LEVEL_GLES20 #endif #include "NullGLES.h" #endif // TNT_FILAMENT_BACKEND_OPENGL_GL_HEADERS_H