diff --git a/CMakeLists.txt b/CMakeLists.txt index ba907f8c1..017035253 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,11 @@ cmake_dependent_option(WITH_SHAPES "Build Shapes library" ON "NOT WITH_DEBUGTOOL option(WITH_TEXT "Build Text library" ON) cmake_dependent_option(WITH_TEXTURETOOLS "Build TextureTools library" ON "NOT WITH_TEXT;NOT WITH_DISTANCEFIELDCONVERTER" ON) +# EGL context, available everywhere except on platforms which don't support extension loading +if(NOT CORRADE_TARGET_EMSCRIPTEN AND NOT CORRADE_TARGET_NACL) + option(WITH_EGLCONTEXT "Build EglContext library" OFF) +endif() + # NaCl-specific application libraries if(CORRADE_TARGET_NACL) option(WITH_NACLAPPLICATION "Build NaClApplication library" OFF) @@ -61,19 +66,19 @@ elseif(CORRADE_TARGET_ANDROID) # OS X-specific application libraries elseif(CORRADE_TARGET_APPLE) cmake_dependent_option(WITH_WINDOWLESSCGLAPPLICATION "Build WindowlessCglApplication library" OFF "NOT WITH_MAGNUMINFO;NOT WITH_FONTCONVERTER;NOT WITH_DISTANCEFIELDCONVERTER" ON) - cmake_dependent_option(WITH_CGLCONTEXT "Build CglContext library" OFF "NOT TARGET_GLES" OFF) + option(WITH_CGLCONTEXT "Build CglContext library" OFF) # X11 + GLX/EGL-specific application libraries elseif(CORRADE_TARGET_UNIX) option(WITH_GLXAPPLICATION "Build GlxApplication library" OFF) cmake_dependent_option(WITH_WINDOWLESSGLXAPPLICATION "Build WindowlessGlxApplication library" OFF "NOT WITH_MAGNUMINFO;NOT WITH_FONTCONVERTER;NOT WITH_DISTANCEFIELDCONVERTER" ON) cmake_dependent_option(WITH_XEGLAPPLICATION "Build XEglApplication library" OFF "TARGET_GLES" OFF) - cmake_dependent_option(WITH_GLXCONTEXT "Build GlxContext library" OFF "NOT TARGET_GLES" OFF) + option(WITH_GLXCONTEXT "Build GlxContext library" OFF) # Windows-specific application libraries elseif(CORRADE_TARGET_WINDOWS) cmake_dependent_option(WITH_WINDOWLESSWGLAPPLICATION "Build WindowlessWglApplication library" OFF "NOT WITH_MAGNUMINFO;NOT WITH_FONTCONVERTER;NOT WITH_DISTANCEFIELDCONVERTER" ON) - cmake_dependent_option(WITH_WGLCONTEXT "Build WglContext library" OFF "NOT TARGET_GLES" OFF) + option(WITH_WGLCONTEXT "Build WglContext library" OFF) endif() # Platform-independent (almost) application libraries diff --git a/doc/building.dox b/doc/building.dox index 2713c8614..423d52eb9 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -210,6 +210,7 @@ choose to not use any application library (see @ref platform-custom for more information): - `WITH_CGLCONTEXT` -- CGL context +- `WITH_EGLCONTEXT` -- EGL context - `WITH_GLXCONTEXT` -- GLX context - `WITH_WGLCONTEXT` -- WGL context diff --git a/doc/cmake.dox b/doc/cmake.dox index cea2328cb..46ba9862a 100644 --- a/doc/cmake.dox +++ b/doc/cmake.dox @@ -107,6 +107,7 @@ platform-specific context libraries (see @ref platform-custom for more information): - `CglContext` -- CGL context +- `EglContext` -- EGL context - `GlxContext` -- GLX context - `WglContext` -- WGL context diff --git a/doc/platform.dox b/doc/platform.dox index e6a4199f4..b15efcf0b 100644 --- a/doc/platform.dox +++ b/doc/platform.dox @@ -293,6 +293,7 @@ find particular `*Context` library, add its include dir and then link to it. These platform-specific libraries are available: - `CglContext` -- CGL context (Mac OS X) +- `EglContext` -- EGL context (everywhere except Emscripten and NaCl) - `GlxContext` -- GLX context (X11-based Unix) - `WglContext` -- WGL context (Windows) diff --git a/modules/FindMagnum.cmake b/modules/FindMagnum.cmake index 66f41f4fc..3af940f32 100644 --- a/modules/FindMagnum.cmake +++ b/modules/FindMagnum.cmake @@ -61,6 +61,7 @@ # WindowlessNaClApplication - Windowless NaCl application # WindowlessWglApplication - Windowless WGL application # CglContext - CGL context +# EglContext - EGL context # GlxContext - GLX context # WglContext - WGL context # Example usage with specifying additional components is: @@ -430,6 +431,16 @@ foreach(component ${Magnum_FIND_COMPONENTS}) endif() endif() + # EGL context dependencies + if(${component} STREQUAL EglContext) + find_package(EGL) + if(EGL_FOUND) + set(_MAGNUM_${_COMPONENT}_LIBRARIES ${EGL_LIBRARIES}) + else() + unset(MAGNUM_${_COMPONENT}_LIBRARY) + endif() + endif() + # No additional dependencies for CGL context # No additional dependencies for WGL context diff --git a/src/Magnum/Platform/CMakeLists.txt b/src/Magnum/Platform/CMakeLists.txt index 28b59013d..9180cf20c 100644 --- a/src/Magnum/Platform/CMakeLists.txt +++ b/src/Magnum/Platform/CMakeLists.txt @@ -37,16 +37,19 @@ set(MagnumPlatform_FILES ) install(FILES ${MagnumPlatform_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Platform) # Decide about platform-specific context for cross-platform toolkits -if((WITH_GLUTAPPLICATION OR WITH_SDL2APPLICATION) AND NOT MAGNUM_TARGET_GLES) - if(CORRADE_TARGET_APPLE) +if(WITH_GLUTAPPLICATION OR WITH_SDL2APPLICATION) + if(CORRADE_TARGET_APPLE AND NOT MAGNUM_TARGET_GLES) set(NEED_CGLCONTEXT 1) set(MagnumSomeContext_OBJECTS $) - elseif(CORRADE_TARGET_WINDOWS) + elseif(CORRADE_TARGET_WINDOWS AND NOT MAGNUM_TARGET_GLES) set(NEED_WGLCONTEXT 1) set(MagnumSomeContext_OBJECTS $) - elseif(CORRADE_TARGET_UNIX) + elseif(CORRADE_TARGET_UNIX AND (NOT MAGNUM_TARGET_GLES OR MAGNUM_TARGET_DESKTOP_GLES)) set(NEED_GLXCONTEXT 1) set(MagnumSomeContext_OBJECTS $) + elseif(MAGNUM_TARGET_GLES AND NOT CORRADE_TARGET_EMSCRIPTEN AND NOT CORRADE_TARGET_NACL) + set(NEED_EGLCONTEXT 1) + set(MagnumSomeContext_OBJECTS $) endif() endif() @@ -56,11 +59,14 @@ if(WITH_ANDROIDAPPLICATION) message(FATAL_ERROR "AndroidApplication is available only when targeting Android. Set WITH_ANDROIDAPPLICATION to OFF to skip building it.") endif() + set(NEED_EGLCONTEXT 1) + include_directories(${ANDROID_NATIVE_APP_GLUE_INCLUDE_DIR}) set(MagnumAndroidApplication_SRCS AndroidApplication.cpp - Implementation/Egl.cpp) + Implementation/Egl.cpp + $) set(MagnumAndroidApplication_HEADERS AndroidApplication.h) set(MagnumAndroidApplication_PRIVATE_HEADERS @@ -190,17 +196,13 @@ endif() if(WITH_GLXAPPLICATION) set(NEED_ABSTRACTXAPPLICATION 1) set(NEED_GLXCONTEXTHANDLER 1) - if(NOT MAGNUM_TARGET_GLES) - set(NEED_GLXCONTEXT 1) - endif() + set(NEED_GLXCONTEXT 1) set(MagnumGlxApplication_SRCS GlxApplication.cpp $ - $) - if(NOT MAGNUM_TARGET_GLES) - list(APPEND MagnumWindowlessGlxApplication_SRCS $) - endif() + $ + $) set(MagnumGlxApplication_HEADERS GlxApplication.h) add_library(MagnumGlxApplication STATIC @@ -218,11 +220,13 @@ endif() if(WITH_XEGLAPPLICATION) set(NEED_ABSTRACTXAPPLICATION 1) set(NEED_EGLCONTEXTHANDLER 1) + set(NEED_EGLCONTEXT 1) set(MagnumXEglApplication_SRCS XEglApplication.cpp $ - $) + $ + $) set(MagnumXEglApplication_HEADERS XEglApplication.h) add_library(MagnumXEglApplication STATIC @@ -245,14 +249,11 @@ endif() # Windowless GLX application if(WITH_WINDOWLESSGLXAPPLICATION) - if(NOT MAGNUM_TARGET_GLES) - set(NEED_GLXCONTEXT 1) - endif() + set(NEED_GLXCONTEXT 1) - set(MagnumWindowlessGlxApplication_SRCS WindowlessGlxApplication.cpp) - if(NOT MAGNUM_TARGET_GLES) - list(APPEND MagnumWindowlessGlxApplication_SRCS $) - endif() + set(MagnumWindowlessGlxApplication_SRCS + WindowlessGlxApplication.cpp + $) set(MagnumWindowlessGlxApplication_HEADERS WindowlessGlxApplication.h) add_library(MagnumWindowlessGlxApplication STATIC @@ -365,10 +366,13 @@ if(NEED_EGLCONTEXTHANDLER) endif() # Platform-specific sources for context library +set(MagnumContext_SRCS Implementation/OpenGLFunctionLoader.cpp) if(NOT MAGNUM_TARGET_GLES) - set(MagnumContext_SRCS - Implementation/OpenGLFunctionLoader.cpp - ../../MagnumExternal/OpenGL/GL/flextGLPlatform.cpp) + list(APPEND MagnumContext_SRCS ../../MagnumExternal/OpenGL/GL/flextGLPlatform.cpp) +elseif(MAGNUM_TARGET_GLES AND MAGNUM_TARGET_GLES2) + list(APPEND MagnumContext_SRCS ../../MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp) +elseif(MAGNUM_TARGET_GLES AND NOT MAGNUM_TARGET_GLES2) + list(APPEND MagnumContext_SRCS ../../MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp) endif() # CGL context @@ -389,6 +393,22 @@ if(NEED_CGLCONTEXT OR WITH_CGLCONTEXT) endif() endif() +# EGL context +if(NEED_EGLCONTEXT OR WITH_EGLCONTEXT) + add_library(MagnumEglContextObjects OBJECT ${MagnumContext_SRCS}) + set_target_properties(MagnumEglContextObjects PROPERTIES COMPILE_DEFINITIONS "MAGNUM_PLATFORM_USE_EGL") + + # Also create proper static library, if requested + if(WITH_EGLCONTEXT) + add_library(MagnumEglContext STATIC $) + set_target_properties(MagnumEglContext PROPERTIES DEBUG_POSTFIX "-d") + install(TARGETS MagnumEglContext + RUNTIME DESTINATION ${MAGNUM_BINARY_INSTALL_DIR} + LIBRARY DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR} + ARCHIVE DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR}) + endif() +endif() + # GLX context if(NEED_GLXCONTEXT OR WITH_GLXCONTEXT) add_library(MagnumGlxContextObjects OBJECT ${MagnumContext_SRCS}) diff --git a/src/Magnum/Platform/Context.h b/src/Magnum/Platform/Context.h index e08615409..f0503c9c9 100644 --- a/src/Magnum/Platform/Context.h +++ b/src/Magnum/Platform/Context.h @@ -52,7 +52,7 @@ class Context: public Magnum::Context { * @fn_gl{GetString} with @def_gl{EXTENSIONS} */ explicit Context(): - #ifndef MAGNUM_TARGET_GLES + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) Magnum::Context{flextGLInit} {} #else Magnum::Context{nullptr} {} diff --git a/src/Magnum/Platform/Implementation/OpenGLFunctionLoader.cpp b/src/Magnum/Platform/Implementation/OpenGLFunctionLoader.cpp index c86805634..239f7b545 100644 --- a/src/Magnum/Platform/Implementation/OpenGLFunctionLoader.cpp +++ b/src/Magnum/Platform/Implementation/OpenGLFunctionLoader.cpp @@ -42,6 +42,10 @@ #elif defined(CORRADE_TARGET_UNIX) && defined(MAGNUM_PLATFORM_USE_GLX) #include +/* EGL-specific includes */ +#elif defined(MAGNUM_PLATFORM_USE_EGL) +#include + /* Otherwise unsupported */ #else #error Unsupported platform @@ -92,6 +96,16 @@ auto OpenGLFunctionLoader::load(const char* const name) -> FunctionPointer { return glXGetProcAddressARB(reinterpret_cast(name)); } +/* EGL-specific implementation */ +#elif defined(MAGNUM_PLATFORM_USE_EGL) +OpenGLFunctionLoader::OpenGLFunctionLoader() = default; + +OpenGLFunctionLoader::~OpenGLFunctionLoader() = default; + +auto OpenGLFunctionLoader::load(const char* const name) -> FunctionPointer { + return eglGetProcAddress(name); +} + /* Otherwise unsupported */ #else #error Unsupported platform diff --git a/src/Magnum/Platform/Implementation/OpenGLFunctionLoader.h b/src/Magnum/Platform/Implementation/OpenGLFunctionLoader.h index 986f99117..a15c33220 100644 --- a/src/Magnum/Platform/Implementation/OpenGLFunctionLoader.h +++ b/src/Magnum/Platform/Implementation/OpenGLFunctionLoader.h @@ -59,6 +59,9 @@ class OpenGLFunctionLoader { /* GLX-specific handles (nothing needed) */ #elif defined(CORRADE_TARGET_UNIX) && defined(MAGNUM_PLATFORM_USE_GLX) + /* EGL-specific handles (nothing needed) */ + #elif defined(MAGNUM_PLATFORM_USE_EGL) + /* Otherwise unsupported */ #else #error Unsupported platform diff --git a/src/MagnumExternal/OpenGL/GLES2/CMakeLists.txt b/src/MagnumExternal/OpenGL/GLES2/CMakeLists.txt index 4c0924774..11840c3b8 100644 --- a/src/MagnumExternal/OpenGL/GLES2/CMakeLists.txt +++ b/src/MagnumExternal/OpenGL/GLES2/CMakeLists.txt @@ -25,6 +25,7 @@ # NaCl and Emscripten don't have the ability to load function pointers manually if(NOT CORRADE_TARGET_NACL AND NOT CORRADE_TARGET_EMSCRIPTEN) + # flextGLPlatform.cpp is compiled as part of Magnum*Context libraries in Platform add_library(MagnumFlextGLObjects OBJECT flextGL.cpp) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?Clang") diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp new file mode 100644 index 000000000..f4d1d7caa --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp @@ -0,0 +1,273 @@ +#include "flextGL.h" + +#include +#include + +#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h" + +void flextGLInit() { + Magnum::Platform::Implementation::OpenGLFunctionLoader loader; + + /* GL_ANGLE_framebuffer_blit */ + flextglBlitFramebufferANGLE = reinterpret_cast(loader.load("glBlitFramebufferANGLE")); + + /* GL_ANGLE_framebuffer_multisample */ + flextglRenderbufferStorageMultisampleANGLE = reinterpret_cast(loader.load("glRenderbufferStorageMultisampleANGLE")); + + /* GL_ANGLE_instanced_arrays */ + flextglDrawArraysInstancedANGLE = reinterpret_cast(loader.load("glDrawArraysInstancedANGLE")); + flextglDrawElementsInstancedANGLE = reinterpret_cast(loader.load("glDrawElementsInstancedANGLE")); + flextglVertexAttribDivisorANGLE = reinterpret_cast(loader.load("glVertexAttribDivisorANGLE")); + + /* GL_ANGLE_depth_texture */ + + /* GL_APPLE_framebuffer_multisample */ + flextglRenderbufferStorageMultisampleAPPLE = reinterpret_cast(loader.load("glRenderbufferStorageMultisampleAPPLE")); + flextglResolveMultisampleFramebufferAPPLE = reinterpret_cast(loader.load("glResolveMultisampleFramebufferAPPLE")); + + /* GL_APPLE_texture_max_level */ + + /* GL_ARM_rgba8 */ + + /* GL_EXT_texture_type_2_10_10_10_REV */ + + /* GL_EXT_discard_framebuffer */ + flextglDiscardFramebufferEXT = reinterpret_cast(loader.load("glDiscardFramebufferEXT")); + + /* GL_EXT_blend_minmax */ + flextglBlendEquationEXT = reinterpret_cast(loader.load("glBlendEquationEXT")); + + /* GL_EXT_shader_texture_lod */ + + /* GL_EXT_occlusion_query_boolean */ + flextglGenQueriesEXT = reinterpret_cast(loader.load("glGenQueriesEXT")); + flextglDeleteQueriesEXT = reinterpret_cast(loader.load("glDeleteQueriesEXT")); + flextglIsQueryEXT = reinterpret_cast(loader.load("glIsQueryEXT")); + flextglBeginQueryEXT = reinterpret_cast(loader.load("glBeginQueryEXT")); + flextglEndQueryEXT = reinterpret_cast(loader.load("glEndQueryEXT")); + flextglGetQueryivEXT = reinterpret_cast(loader.load("glGetQueryivEXT")); + flextglGetQueryObjectuivEXT = reinterpret_cast(loader.load("glGetQueryObjectuivEXT")); + + /* GL_EXT_shadow_samplers */ + + /* GL_EXT_texture_rg */ + + /* GL_EXT_texture_storage */ + flextglTexStorage1DEXT = reinterpret_cast(loader.load("glTexStorage1DEXT")); + flextglTexStorage2DEXT = reinterpret_cast(loader.load("glTexStorage2DEXT")); + flextglTexStorage3DEXT = reinterpret_cast(loader.load("glTexStorage3DEXT")); + flextglTextureStorage1DEXT = reinterpret_cast(loader.load("glTextureStorage1DEXT")); + flextglTextureStorage2DEXT = reinterpret_cast(loader.load("glTextureStorage2DEXT")); + flextglTextureStorage3DEXT = reinterpret_cast(loader.load("glTextureStorage3DEXT")); + + /* GL_EXT_map_buffer_range */ + flextglMapBufferRangeEXT = reinterpret_cast(loader.load("glMapBufferRangeEXT")); + flextglFlushMappedBufferRangeEXT = reinterpret_cast(loader.load("glFlushMappedBufferRangeEXT")); + + /* GL_EXT_instanced_arrays */ + flextglDrawArraysInstancedEXT = reinterpret_cast(loader.load("glDrawArraysInstancedEXT")); + flextglDrawElementsInstancedEXT = reinterpret_cast(loader.load("glDrawElementsInstancedEXT")); + flextglVertexAttribDivisorEXT = reinterpret_cast(loader.load("glVertexAttribDivisorEXT")); + + /* GL_EXT_draw_instanced */ + + /* GL_NV_draw_buffers */ + flextglDrawBuffersNV = reinterpret_cast(loader.load("glDrawBuffersNV")); + + /* GL_NV_fbo_color_attachments */ + + /* GL_NV_read_buffer */ + flextglReadBufferNV = reinterpret_cast(loader.load("glReadBufferNV")); + + /* GL_NV_draw_instanced */ + flextglDrawArraysInstancedNV = reinterpret_cast(loader.load("glDrawArraysInstancedNV")); + flextglDrawElementsInstancedNV = reinterpret_cast(loader.load("glDrawElementsInstancedNV")); + + /* GL_NV_framebuffer_blit */ + flextglBlitFramebufferNV = reinterpret_cast(loader.load("glBlitFramebufferNV")); + + /* GL_NV_framebuffer_multisample */ + flextglRenderbufferStorageMultisampleNV = reinterpret_cast(loader.load("glRenderbufferStorageMultisampleNV")); + + /* GL_NV_instanced_arrays */ + flextglVertexAttribDivisorNV = reinterpret_cast(loader.load("glVertexAttribDivisorNV")); + + /* GL_NV_shadow_samplers_array */ + + /* GL_NV_shadow_samplers_cube */ + + /* GL_OES_depth24 */ + + /* GL_OES_element_index_uint */ + + /* GL_OES_rgb8_rgba8 */ + + /* GL_OES_texture_3D */ + flextglTexImage3DOES = reinterpret_cast(loader.load("glTexImage3DOES")); + flextglTexSubImage3DOES = reinterpret_cast(loader.load("glTexSubImage3DOES")); + flextglCopyTexSubImage3DOES = reinterpret_cast(loader.load("glCopyTexSubImage3DOES")); + flextglCompressedTexImage3DOES = reinterpret_cast(loader.load("glCompressedTexImage3DOES")); + flextglCompressedTexSubImage3DOES = reinterpret_cast(loader.load("glCompressedTexSubImage3DOES")); + flextglFramebufferTexture3DOES = reinterpret_cast(loader.load("glFramebufferTexture3DOES")); + + /* GL_OES_texture_half_float_linear */ + + /* GL_OES_texture_float_linear */ + + /* GL_OES_texture_half_float */ + + /* GL_OES_texture_float */ + + /* GL_OES_vertex_half_float */ + + /* GL_OES_packed_depth_stencil */ + + /* GL_OES_depth_texture */ + + /* GL_OES_standard_derivatives */ + + /* GL_OES_vertex_array_object */ + flextglBindVertexArrayOES = reinterpret_cast(loader.load("glBindVertexArrayOES")); + flextglDeleteVertexArraysOES = reinterpret_cast(loader.load("glDeleteVertexArraysOES")); + flextglGenVertexArraysOES = reinterpret_cast(loader.load("glGenVertexArraysOES")); + flextglIsVertexArrayOES = reinterpret_cast(loader.load("glIsVertexArrayOES")); + + /* GL_OES_required_internalformat */ + + /* GL_OES_surfaceless_context */ + + /* GL_APPLE_texture_format_BGRA8888 */ + + /* GL_EXT_texture_filter_anisotropic */ + + /* GL_EXT_texture_format_BGRA8888 */ + + /* GL_EXT_read_format_bgra */ + + /* GL_EXT_multi_draw_arrays */ + flextglMultiDrawArraysEXT = reinterpret_cast(loader.load("glMultiDrawArraysEXT")); + flextglMultiDrawElementsEXT = reinterpret_cast(loader.load("glMultiDrawElementsEXT")); + + /* GL_EXT_debug_label */ + flextglLabelObjectEXT = reinterpret_cast(loader.load("glLabelObjectEXT")); + flextglGetObjectLabelEXT = reinterpret_cast(loader.load("glGetObjectLabelEXT")); + + /* GL_EXT_debug_marker */ + flextglInsertEventMarkerEXT = reinterpret_cast(loader.load("glInsertEventMarkerEXT")); + flextglPushGroupMarkerEXT = reinterpret_cast(loader.load("glPushGroupMarkerEXT")); + flextglPopGroupMarkerEXT = reinterpret_cast(loader.load("glPopGroupMarkerEXT")); + + /* GL_EXT_disjoint_timer_query */ + flextglQueryCounterEXT = reinterpret_cast(loader.load("glQueryCounterEXT")); + flextglGetQueryObjectivEXT = reinterpret_cast(loader.load("glGetQueryObjectivEXT")); + flextglGetQueryObjecti64vEXT = reinterpret_cast(loader.load("glGetQueryObjecti64vEXT")); + flextglGetQueryObjectui64vEXT = reinterpret_cast(loader.load("glGetQueryObjectui64vEXT")); + + /* GL_EXT_texture_sRGB_decode */ + + /* GL_EXT_separate_shader_objects */ + flextglUseShaderProgramEXT = reinterpret_cast(loader.load("glUseShaderProgramEXT")); + flextglActiveProgramEXT = reinterpret_cast(loader.load("glActiveProgramEXT")); + flextglCreateShaderProgramEXT = reinterpret_cast(loader.load("glCreateShaderProgramEXT")); + flextglActiveShaderProgramEXT = reinterpret_cast(loader.load("glActiveShaderProgramEXT")); + flextglBindProgramPipelineEXT = reinterpret_cast(loader.load("glBindProgramPipelineEXT")); + flextglCreateShaderProgramvEXT = reinterpret_cast(loader.load("glCreateShaderProgramvEXT")); + flextglDeleteProgramPipelinesEXT = reinterpret_cast(loader.load("glDeleteProgramPipelinesEXT")); + flextglGenProgramPipelinesEXT = reinterpret_cast(loader.load("glGenProgramPipelinesEXT")); + flextglGetProgramPipelineInfoLogEXT = reinterpret_cast(loader.load("glGetProgramPipelineInfoLogEXT")); + flextglGetProgramPipelineivEXT = reinterpret_cast(loader.load("glGetProgramPipelineivEXT")); + flextglIsProgramPipelineEXT = reinterpret_cast(loader.load("glIsProgramPipelineEXT")); + flextglProgramParameteriEXT = reinterpret_cast(loader.load("glProgramParameteriEXT")); + flextglProgramUniform1fEXT = reinterpret_cast(loader.load("glProgramUniform1fEXT")); + flextglProgramUniform1fvEXT = reinterpret_cast(loader.load("glProgramUniform1fvEXT")); + flextglProgramUniform1iEXT = reinterpret_cast(loader.load("glProgramUniform1iEXT")); + flextglProgramUniform1ivEXT = reinterpret_cast(loader.load("glProgramUniform1ivEXT")); + flextglProgramUniform2fEXT = reinterpret_cast(loader.load("glProgramUniform2fEXT")); + flextglProgramUniform2fvEXT = reinterpret_cast(loader.load("glProgramUniform2fvEXT")); + flextglProgramUniform2iEXT = reinterpret_cast(loader.load("glProgramUniform2iEXT")); + flextglProgramUniform2ivEXT = reinterpret_cast(loader.load("glProgramUniform2ivEXT")); + flextglProgramUniform3fEXT = reinterpret_cast(loader.load("glProgramUniform3fEXT")); + flextglProgramUniform3fvEXT = reinterpret_cast(loader.load("glProgramUniform3fvEXT")); + flextglProgramUniform3iEXT = reinterpret_cast(loader.load("glProgramUniform3iEXT")); + flextglProgramUniform3ivEXT = reinterpret_cast(loader.load("glProgramUniform3ivEXT")); + flextglProgramUniform4fEXT = reinterpret_cast(loader.load("glProgramUniform4fEXT")); + flextglProgramUniform4fvEXT = reinterpret_cast(loader.load("glProgramUniform4fvEXT")); + flextglProgramUniform4iEXT = reinterpret_cast(loader.load("glProgramUniform4iEXT")); + flextglProgramUniform4ivEXT = reinterpret_cast(loader.load("glProgramUniform4ivEXT")); + flextglProgramUniformMatrix2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2fvEXT")); + flextglProgramUniformMatrix3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3fvEXT")); + flextglProgramUniformMatrix4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4fvEXT")); + flextglUseProgramStagesEXT = reinterpret_cast(loader.load("glUseProgramStagesEXT")); + flextglValidateProgramPipelineEXT = reinterpret_cast(loader.load("glValidateProgramPipelineEXT")); + flextglProgramUniform1uiEXT = reinterpret_cast(loader.load("glProgramUniform1uiEXT")); + flextglProgramUniform2uiEXT = reinterpret_cast(loader.load("glProgramUniform2uiEXT")); + flextglProgramUniform3uiEXT = reinterpret_cast(loader.load("glProgramUniform3uiEXT")); + flextglProgramUniform4uiEXT = reinterpret_cast(loader.load("glProgramUniform4uiEXT")); + flextglProgramUniform1uivEXT = reinterpret_cast(loader.load("glProgramUniform1uivEXT")); + flextglProgramUniform2uivEXT = reinterpret_cast(loader.load("glProgramUniform2uivEXT")); + flextglProgramUniform3uivEXT = reinterpret_cast(loader.load("glProgramUniform3uivEXT")); + flextglProgramUniform4uivEXT = reinterpret_cast(loader.load("glProgramUniform4uivEXT")); + flextglProgramUniformMatrix2x3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2x3fvEXT")); + flextglProgramUniformMatrix3x2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3x2fvEXT")); + flextglProgramUniformMatrix2x4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2x4fvEXT")); + flextglProgramUniformMatrix4x2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4x2fvEXT")); + flextglProgramUniformMatrix3x4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3x4fvEXT")); + flextglProgramUniformMatrix4x3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4x3fvEXT")); + + /* GL_EXT_sRGB */ + + /* GL_EXT_multisampled_render_to_texture */ + flextglRenderbufferStorageMultisampleEXT = reinterpret_cast(loader.load("glRenderbufferStorageMultisampleEXT")); + flextglFramebufferTexture2DMultisampleEXT = reinterpret_cast(loader.load("glFramebufferTexture2DMultisampleEXT")); + + /* GL_EXT_robustness */ + flextglGetGraphicsResetStatusEXT = reinterpret_cast(loader.load("glGetGraphicsResetStatusEXT")); + flextglReadnPixelsEXT = reinterpret_cast(loader.load("glReadnPixelsEXT")); + flextglGetnUniformfvEXT = reinterpret_cast(loader.load("glGetnUniformfvEXT")); + flextglGetnUniformivEXT = reinterpret_cast(loader.load("glGetnUniformivEXT")); + + /* GL_KHR_debug */ + flextglDebugMessageControl = reinterpret_cast(loader.load("glDebugMessageControl")); + flextglDebugMessageInsert = reinterpret_cast(loader.load("glDebugMessageInsert")); + flextglDebugMessageCallback = reinterpret_cast(loader.load("glDebugMessageCallback")); + flextglGetDebugMessageLog = reinterpret_cast(loader.load("glGetDebugMessageLog")); + flextglPushDebugGroup = reinterpret_cast(loader.load("glPushDebugGroup")); + flextglPopDebugGroup = reinterpret_cast(loader.load("glPopDebugGroup")); + flextglObjectLabel = reinterpret_cast(loader.load("glObjectLabel")); + flextglGetObjectLabel = reinterpret_cast(loader.load("glGetObjectLabel")); + flextglObjectPtrLabel = reinterpret_cast(loader.load("glObjectPtrLabel")); + flextglGetObjectPtrLabel = reinterpret_cast(loader.load("glGetObjectPtrLabel")); + flextglGetPointerv = reinterpret_cast(loader.load("glGetPointerv")); + flextglDebugMessageControlKHR = reinterpret_cast(loader.load("glDebugMessageControlKHR")); + flextglDebugMessageInsertKHR = reinterpret_cast(loader.load("glDebugMessageInsertKHR")); + flextglDebugMessageCallbackKHR = reinterpret_cast(loader.load("glDebugMessageCallbackKHR")); + flextglGetDebugMessageLogKHR = reinterpret_cast(loader.load("glGetDebugMessageLogKHR")); + flextglPushDebugGroupKHR = reinterpret_cast(loader.load("glPushDebugGroupKHR")); + flextglPopDebugGroupKHR = reinterpret_cast(loader.load("glPopDebugGroupKHR")); + flextglObjectLabelKHR = reinterpret_cast(loader.load("glObjectLabelKHR")); + flextglGetObjectLabelKHR = reinterpret_cast(loader.load("glGetObjectLabelKHR")); + flextglObjectPtrLabelKHR = reinterpret_cast(loader.load("glObjectPtrLabelKHR")); + flextglGetObjectPtrLabelKHR = reinterpret_cast(loader.load("glGetObjectPtrLabelKHR")); + flextglGetPointervKHR = reinterpret_cast(loader.load("glGetPointervKHR")); + + /* GL_NV_read_buffer_front */ + + /* GL_NV_read_depth */ + + /* GL_NV_read_stencil */ + + /* GL_NV_read_depth_stencil */ + + /* GL_NV_texture_border_clamp */ + + /* GL_OES_depth32 */ + + /* GL_OES_mapbuffer */ + flextglMapBufferOES = reinterpret_cast(loader.load("glMapBufferOES")); + flextglUnmapBufferOES = reinterpret_cast(loader.load("glUnmapBufferOES")); + flextglGetBufferPointervOES = reinterpret_cast(loader.load("glGetBufferPointervOES")); + + /* GL_OES_stencil1 */ + + /* GL_OES_stencil4 */ +} diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp.template b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp.template new file mode 100644 index 000000000..37e72476a --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp.template @@ -0,0 +1,21 @@ +@require(passthru, functions, enums, options, version, extensions) +#include "flextGL.h" + +#include +#include + +#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h" + +void flextGLInit() { + Magnum::Platform::Implementation::OpenGLFunctionLoader loader; + @for category,funcs in functions: + @if category not in ['ES_VERSION_2_0']: + + /* GL_@category */ + @for f in funcs: + flextgl@f.name = reinterpret_cast<@f.returntype\ +(APIENTRY*)(@f.param_type_list_string())>(loader.load("gl@f.name")); + @end + @end + @end +} diff --git a/src/MagnumExternal/OpenGL/GLES3/CMakeLists.txt b/src/MagnumExternal/OpenGL/GLES3/CMakeLists.txt index e38d9c5a4..31dec6995 100644 --- a/src/MagnumExternal/OpenGL/GLES3/CMakeLists.txt +++ b/src/MagnumExternal/OpenGL/GLES3/CMakeLists.txt @@ -23,6 +23,7 @@ # DEALINGS IN THE SOFTWARE. # +# flextGLPlatform.cpp is compiled as part of Magnum*Context libraries in Platform add_library(MagnumFlextGLObjects OBJECT flextGL.cpp) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?Clang") diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp new file mode 100644 index 000000000..eab5d438f --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp @@ -0,0 +1,152 @@ +#include "flextGL.h" + +#include +#include + +#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h" + +void flextGLInit() { + Magnum::Platform::Implementation::OpenGLFunctionLoader loader; + + /* GL_APPLE_texture_format_BGRA8888 */ + + /* GL_EXT_texture_filter_anisotropic */ + + /* GL_EXT_texture_format_BGRA8888 */ + + /* GL_EXT_read_format_bgra */ + + /* GL_EXT_multi_draw_arrays */ + flextglMultiDrawArraysEXT = reinterpret_cast(loader.load("glMultiDrawArraysEXT")); + flextglMultiDrawElementsEXT = reinterpret_cast(loader.load("glMultiDrawElementsEXT")); + + /* GL_EXT_debug_label */ + flextglLabelObjectEXT = reinterpret_cast(loader.load("glLabelObjectEXT")); + flextglGetObjectLabelEXT = reinterpret_cast(loader.load("glGetObjectLabelEXT")); + + /* GL_EXT_debug_marker */ + flextglInsertEventMarkerEXT = reinterpret_cast(loader.load("glInsertEventMarkerEXT")); + flextglPushGroupMarkerEXT = reinterpret_cast(loader.load("glPushGroupMarkerEXT")); + flextglPopGroupMarkerEXT = reinterpret_cast(loader.load("glPopGroupMarkerEXT")); + + /* GL_EXT_disjoint_timer_query */ + flextglGenQueriesEXT = reinterpret_cast(loader.load("glGenQueriesEXT")); + flextglDeleteQueriesEXT = reinterpret_cast(loader.load("glDeleteQueriesEXT")); + flextglIsQueryEXT = reinterpret_cast(loader.load("glIsQueryEXT")); + flextglBeginQueryEXT = reinterpret_cast(loader.load("glBeginQueryEXT")); + flextglEndQueryEXT = reinterpret_cast(loader.load("glEndQueryEXT")); + flextglQueryCounterEXT = reinterpret_cast(loader.load("glQueryCounterEXT")); + flextglGetQueryivEXT = reinterpret_cast(loader.load("glGetQueryivEXT")); + flextglGetQueryObjectivEXT = reinterpret_cast(loader.load("glGetQueryObjectivEXT")); + flextglGetQueryObjectuivEXT = reinterpret_cast(loader.load("glGetQueryObjectuivEXT")); + flextglGetQueryObjecti64vEXT = reinterpret_cast(loader.load("glGetQueryObjecti64vEXT")); + flextglGetQueryObjectui64vEXT = reinterpret_cast(loader.load("glGetQueryObjectui64vEXT")); + + /* GL_EXT_texture_sRGB_decode */ + + /* GL_EXT_separate_shader_objects */ + flextglUseShaderProgramEXT = reinterpret_cast(loader.load("glUseShaderProgramEXT")); + flextglActiveProgramEXT = reinterpret_cast(loader.load("glActiveProgramEXT")); + flextglCreateShaderProgramEXT = reinterpret_cast(loader.load("glCreateShaderProgramEXT")); + flextglActiveShaderProgramEXT = reinterpret_cast(loader.load("glActiveShaderProgramEXT")); + flextglBindProgramPipelineEXT = reinterpret_cast(loader.load("glBindProgramPipelineEXT")); + flextglCreateShaderProgramvEXT = reinterpret_cast(loader.load("glCreateShaderProgramvEXT")); + flextglDeleteProgramPipelinesEXT = reinterpret_cast(loader.load("glDeleteProgramPipelinesEXT")); + flextglGenProgramPipelinesEXT = reinterpret_cast(loader.load("glGenProgramPipelinesEXT")); + flextglGetProgramPipelineInfoLogEXT = reinterpret_cast(loader.load("glGetProgramPipelineInfoLogEXT")); + flextglGetProgramPipelineivEXT = reinterpret_cast(loader.load("glGetProgramPipelineivEXT")); + flextglIsProgramPipelineEXT = reinterpret_cast(loader.load("glIsProgramPipelineEXT")); + flextglProgramParameteriEXT = reinterpret_cast(loader.load("glProgramParameteriEXT")); + flextglProgramUniform1fEXT = reinterpret_cast(loader.load("glProgramUniform1fEXT")); + flextglProgramUniform1fvEXT = reinterpret_cast(loader.load("glProgramUniform1fvEXT")); + flextglProgramUniform1iEXT = reinterpret_cast(loader.load("glProgramUniform1iEXT")); + flextglProgramUniform1ivEXT = reinterpret_cast(loader.load("glProgramUniform1ivEXT")); + flextglProgramUniform2fEXT = reinterpret_cast(loader.load("glProgramUniform2fEXT")); + flextglProgramUniform2fvEXT = reinterpret_cast(loader.load("glProgramUniform2fvEXT")); + flextglProgramUniform2iEXT = reinterpret_cast(loader.load("glProgramUniform2iEXT")); + flextglProgramUniform2ivEXT = reinterpret_cast(loader.load("glProgramUniform2ivEXT")); + flextglProgramUniform3fEXT = reinterpret_cast(loader.load("glProgramUniform3fEXT")); + flextglProgramUniform3fvEXT = reinterpret_cast(loader.load("glProgramUniform3fvEXT")); + flextglProgramUniform3iEXT = reinterpret_cast(loader.load("glProgramUniform3iEXT")); + flextglProgramUniform3ivEXT = reinterpret_cast(loader.load("glProgramUniform3ivEXT")); + flextglProgramUniform4fEXT = reinterpret_cast(loader.load("glProgramUniform4fEXT")); + flextglProgramUniform4fvEXT = reinterpret_cast(loader.load("glProgramUniform4fvEXT")); + flextglProgramUniform4iEXT = reinterpret_cast(loader.load("glProgramUniform4iEXT")); + flextglProgramUniform4ivEXT = reinterpret_cast(loader.load("glProgramUniform4ivEXT")); + flextglProgramUniformMatrix2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2fvEXT")); + flextglProgramUniformMatrix3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3fvEXT")); + flextglProgramUniformMatrix4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4fvEXT")); + flextglUseProgramStagesEXT = reinterpret_cast(loader.load("glUseProgramStagesEXT")); + flextglValidateProgramPipelineEXT = reinterpret_cast(loader.load("glValidateProgramPipelineEXT")); + flextglProgramUniform1uiEXT = reinterpret_cast(loader.load("glProgramUniform1uiEXT")); + flextglProgramUniform2uiEXT = reinterpret_cast(loader.load("glProgramUniform2uiEXT")); + flextglProgramUniform3uiEXT = reinterpret_cast(loader.load("glProgramUniform3uiEXT")); + flextglProgramUniform4uiEXT = reinterpret_cast(loader.load("glProgramUniform4uiEXT")); + flextglProgramUniform1uivEXT = reinterpret_cast(loader.load("glProgramUniform1uivEXT")); + flextglProgramUniform2uivEXT = reinterpret_cast(loader.load("glProgramUniform2uivEXT")); + flextglProgramUniform3uivEXT = reinterpret_cast(loader.load("glProgramUniform3uivEXT")); + flextglProgramUniform4uivEXT = reinterpret_cast(loader.load("glProgramUniform4uivEXT")); + flextglProgramUniformMatrix2x3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2x3fvEXT")); + flextglProgramUniformMatrix3x2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3x2fvEXT")); + flextglProgramUniformMatrix2x4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2x4fvEXT")); + flextglProgramUniformMatrix4x2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4x2fvEXT")); + flextglProgramUniformMatrix3x4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3x4fvEXT")); + flextglProgramUniformMatrix4x3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4x3fvEXT")); + + /* GL_EXT_sRGB */ + + /* GL_EXT_multisampled_render_to_texture */ + flextglRenderbufferStorageMultisampleEXT = reinterpret_cast(loader.load("glRenderbufferStorageMultisampleEXT")); + flextglFramebufferTexture2DMultisampleEXT = reinterpret_cast(loader.load("glFramebufferTexture2DMultisampleEXT")); + + /* GL_EXT_robustness */ + flextglGetGraphicsResetStatusEXT = reinterpret_cast(loader.load("glGetGraphicsResetStatusEXT")); + flextglReadnPixelsEXT = reinterpret_cast(loader.load("glReadnPixelsEXT")); + flextglGetnUniformfvEXT = reinterpret_cast(loader.load("glGetnUniformfvEXT")); + flextglGetnUniformivEXT = reinterpret_cast(loader.load("glGetnUniformivEXT")); + + /* GL_KHR_debug */ + flextglDebugMessageControl = reinterpret_cast(loader.load("glDebugMessageControl")); + flextglDebugMessageInsert = reinterpret_cast(loader.load("glDebugMessageInsert")); + flextglDebugMessageCallback = reinterpret_cast(loader.load("glDebugMessageCallback")); + flextglGetDebugMessageLog = reinterpret_cast(loader.load("glGetDebugMessageLog")); + flextglPushDebugGroup = reinterpret_cast(loader.load("glPushDebugGroup")); + flextglPopDebugGroup = reinterpret_cast(loader.load("glPopDebugGroup")); + flextglObjectLabel = reinterpret_cast(loader.load("glObjectLabel")); + flextglGetObjectLabel = reinterpret_cast(loader.load("glGetObjectLabel")); + flextglObjectPtrLabel = reinterpret_cast(loader.load("glObjectPtrLabel")); + flextglGetObjectPtrLabel = reinterpret_cast(loader.load("glGetObjectPtrLabel")); + flextglGetPointerv = reinterpret_cast(loader.load("glGetPointerv")); + flextglDebugMessageControlKHR = reinterpret_cast(loader.load("glDebugMessageControlKHR")); + flextglDebugMessageInsertKHR = reinterpret_cast(loader.load("glDebugMessageInsertKHR")); + flextglDebugMessageCallbackKHR = reinterpret_cast(loader.load("glDebugMessageCallbackKHR")); + flextglGetDebugMessageLogKHR = reinterpret_cast(loader.load("glGetDebugMessageLogKHR")); + flextglPushDebugGroupKHR = reinterpret_cast(loader.load("glPushDebugGroupKHR")); + flextglPopDebugGroupKHR = reinterpret_cast(loader.load("glPopDebugGroupKHR")); + flextglObjectLabelKHR = reinterpret_cast(loader.load("glObjectLabelKHR")); + flextglGetObjectLabelKHR = reinterpret_cast(loader.load("glGetObjectLabelKHR")); + flextglObjectPtrLabelKHR = reinterpret_cast(loader.load("glObjectPtrLabelKHR")); + flextglGetObjectPtrLabelKHR = reinterpret_cast(loader.load("glGetObjectPtrLabelKHR")); + flextglGetPointervKHR = reinterpret_cast(loader.load("glGetPointervKHR")); + + /* GL_NV_read_buffer_front */ + + /* GL_NV_read_depth */ + + /* GL_NV_read_stencil */ + + /* GL_NV_read_depth_stencil */ + + /* GL_NV_texture_border_clamp */ + + /* GL_OES_depth32 */ + + /* GL_OES_mapbuffer */ + flextglMapBufferOES = reinterpret_cast(loader.load("glMapBufferOES")); + flextglUnmapBufferOES = reinterpret_cast(loader.load("glUnmapBufferOES")); + flextglGetBufferPointervOES = reinterpret_cast(loader.load("glGetBufferPointervOES")); + + /* GL_OES_stencil1 */ + + /* GL_OES_stencil4 */ +} diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp.template b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp.template new file mode 100644 index 000000000..756588a3a --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp.template @@ -0,0 +1,21 @@ +@require(passthru, functions, enums, options, version, extensions) +#include "flextGL.h" + +#include +#include + +#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h" + +void flextGLInit() { + Magnum::Platform::Implementation::OpenGLFunctionLoader loader; + @for category,funcs in functions: + @if category not in ['ES_VERSION_2_0', 'ES_VERSION_3_0']: + + /* GL_@category */ + @for f in funcs: + flextgl@f.name = reinterpret_cast<@f.returntype\ +(APIENTRY*)(@f.param_type_list_string())>(loader.load("gl@f.name")); + @end + @end + @end +}