diff --git a/src/core.c b/src/core.c index 553662f82..8729ad070 100644 --- a/src/core.c +++ b/src/core.c @@ -226,7 +226,7 @@ #include <android_native_app_glue.h> // Defines basic app state struct and manages activity #include <EGL/egl.h> // Native platform windowing system interface - //#include <GLES2/gl2.h> // OpenGL ES 2.0 library (not required in this module) + //#include <GLES2/gl2.h> // OpenGL ES 2.0 library (not required in this module) #endif #if defined(PLATFORM_RPI) || defined(PLATFORM_DRM) @@ -253,13 +253,13 @@ #include "EGL/egl.h" // Native platform windowing system interface #include "EGL/eglext.h" // EGL extensions - #include "GLES2/gl2.h" // OpenGL ES 2.0 library + //#include "GLES2/gl2.h" // OpenGL ES 2.0 library (not required in this module) #endif #if defined(PLATFORM_UWP) #include "EGL/egl.h" // Native platform windowing system interface #include "EGL/eglext.h" // EGL extensions - #include "GLES2/gl2.h" // OpenGL ES 2.0 library + //#include "GLES2/gl2.h" // OpenGL ES 2.0 library (not required in this module) #include "uwp_events.h" // UWP bootstrapping functions #endif @@ -4356,7 +4356,7 @@ static bool InitGraphicsDevice(int width, int height) #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) rlLoadExtensions(glfwGetProcAddress); #else - rlLoadExtensions(NULL); // Uses eglGetProcAddress() internally + rlLoadExtensions(eglGetProcAddress); #endif // Initialize OpenGL context (states and resources) diff --git a/src/rlgl.h b/src/rlgl.h index d7775260d..b3eddf0c5 100644 --- a/src/rlgl.h +++ b/src/rlgl.h @@ -544,7 +544,7 @@ RLAPI void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation); // rlgl initialization functions RLAPI void rlglInit(int width, int height); // Initialize rlgl (buffers, shaders, textures, states) RLAPI void rlglClose(void); // De-inititialize rlgl (buffers, shaders, textures) -RLAPI void rlLoadExtensions(void* loader); // Load OpenGL extensions (loader function pointer required) +RLAPI void rlLoadExtensions(void *loader); // Load OpenGL extensions (loader function required) RLAPI int rlGetVersion(void); // Returns current OpenGL version RLAPI int rlGetFramebufferWidth(void); // Get default framebuffer width RLAPI int rlGetFramebufferHeight(void); // Get default framebuffer height @@ -689,7 +689,7 @@ RLAPI void rlLoadDrawQuad(void); // Load and draw a quad #if defined(GRAPHICS_API_OPENGL_ES2) #define GL_GLEXT_PROTOTYPES - #include <EGL/egl.h> // EGL library + //#include <EGL/egl.h> // EGL library -> not required, platform layer #include <GLES2/gl2.h> // OpenGL ES 2.0 library #include <GLES2/gl2ext.h> // OpenGL ES 2.0 extensions library @@ -839,11 +839,14 @@ typedef struct rlglData { bool texMirrorClamp; // Clamp mirror wrap mode supported (GL_EXT_texture_mirror_clamp) bool texAnisoFilter; // Anisotropic texture filtering support (GL_EXT_texture_filter_anisotropic) - float maxAnisotropyLevel; // Maximum anisotropy level supported (minimum is 2.0f) + float maxAnisotropyLevel; // Maximum anisotropy level supported (minimum is 2.0f) int maxDepthBits; // Maximum bits for depth component } ExtSupported; // Extensions supported flags } rlglData; + +typedef void *(*rlglLoadProc)(const char *name); // OpenGL extension functions loader signature (same as GLADloadproc) + #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 //---------------------------------------------------------------------------------- @@ -1664,7 +1667,7 @@ void rlglClose(void) } // Load OpenGL extensions -// NOTE: External loader function could be passed as a pointer +// NOTE: External loader function must be provided void rlLoadExtensions(void *loader) { #if defined(GRAPHICS_API_OPENGL_33) // Also defined for GRAPHICS_API_OPENGL_21 @@ -1747,10 +1750,10 @@ void rlLoadExtensions(void *loader) { // The extension is supported by our hardware and driver, try to get related functions pointers // NOTE: emscripten does not support VAOs natively, it uses emulation and it reduces overall performance... - glGenVertexArrays = (PFNGLGENVERTEXARRAYSOESPROC)eglGetProcAddress("glGenVertexArraysOES"); - glBindVertexArray = (PFNGLBINDVERTEXARRAYOESPROC)eglGetProcAddress("glBindVertexArrayOES"); - glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSOESPROC)eglGetProcAddress("glDeleteVertexArraysOES"); - //glIsVertexArray = (PFNGLISVERTEXARRAYOESPROC)eglGetProcAddress("glIsVertexArrayOES"); // NOTE: Fails in WebGL, omitted + glGenVertexArrays = (PFNGLGENVERTEXARRAYSOESPROC)((rlglLoadProc)loader)("glGenVertexArraysOES"); + glBindVertexArray = (PFNGLBINDVERTEXARRAYOESPROC)((rlglLoadProc)loader)("glBindVertexArrayOES"); + glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSOESPROC)((rlglLoadProc)loader)("glDeleteVertexArraysOES"); + //glIsVertexArray = (PFNGLISVERTEXARRAYOESPROC)loader("glIsVertexArrayOES"); // NOTE: Fails in WebGL, omitted if ((glGenVertexArrays != NULL) && (glBindVertexArray != NULL) && (glDeleteVertexArrays != NULL)) RLGL.ExtSupported.vao = true; } @@ -1758,9 +1761,9 @@ void rlLoadExtensions(void *loader) // Check instanced rendering support if (strcmp(extList[i], (const char *)"GL_ANGLE_instanced_arrays") == 0) // Web ANGLE { - glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)eglGetProcAddress("glDrawArraysInstancedANGLE"); - glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)eglGetProcAddress("glDrawElementsInstancedANGLE"); - glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)eglGetProcAddress("glVertexAttribDivisorANGLE"); + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedANGLE"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedANGLE"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)("glVertexAttribDivisorANGLE"); if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL.ExtSupported.instancing = true; } @@ -1769,9 +1772,9 @@ void rlLoadExtensions(void *loader) if ((strcmp(extList[i], (const char *)"GL_EXT_draw_instanced") == 0) && // Standard EXT (strcmp(extList[i], (const char *)"GL_EXT_instanced_arrays") == 0)) { - glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)eglGetProcAddress("glDrawArraysInstancedEXT"); - glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)eglGetProcAddress("glDrawElementsInstancedEXT"); - glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)eglGetProcAddress("glVertexAttribDivisorEXT"); + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedEXT"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedEXT"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)("glVertexAttribDivisorEXT"); if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL.ExtSupported.instancing = true; }