11// Cross-platform runtime GL/GLES loader using GLAD2 C API (non-MX).
22//
3- // Only forward declares the GLAD loader entrypoints (gladLoadGL / gladLoadGLES2) and provides
4- // a universal resolver.
3+ // Provides a universal resolver to find GL function pointers.
54
65#include " CrossGlLoader.hpp"
76
87#include < Logging.hpp>
8+ #include " OpenGL.h"
99
1010#include < array>
1111#include < cstdio>
1212
13- // forward declare glad interfaces to contain dependency to this cpp
14- namespace {
15-
16- using GladLoadFunc = void * (*) (const char * name);
17-
18- extern " C" {
19- #ifndef USE_GLES
20- int gladLoadGL (GladLoadFunc load);
21- #else
22- int gladLoadGLES2 (GladLoadFunc load);
23- #endif
24- }
25-
26- } // namespace
27-
2813namespace libprojectM {
2914namespace Renderer {
3015
@@ -100,7 +85,7 @@ auto CrossGlLoader::CurrentBackend() const -> Backend
10085 return m_backend;
10186}
10287
103- auto CrossGlLoader::GetProcAddress (const char * name) const -> void*
88+ auto CrossGlLoader::GetProcAddress (const char * name) const -> GLapiproc
10489{
10590 // NOTE: This method is used during GLAD loading. Avoid taking the mutex here to
10691 // prevent deadlocks if GLAD calls back into us while Initialize() is holding the lock
@@ -213,17 +198,25 @@ void CrossGlLoader::DetectBackend()
213198 m_backend = Backend::None;
214199}
215200
216- auto CrossGlLoader::GladResolverThunk (const char * name) -> void*
201+ auto CrossGlLoader::GladResolverThunk (const char * name) -> GLapiproc
217202{
218203 return Instance ().Resolve (name);
219204}
220205
206+ namespace {
207+ // adapt external void* handle to GLAD type
208+ auto gladBridgeResolverThunk (const char * name) -> GLADapiproc
209+ {
210+ return reinterpret_cast <GLADapiproc>(CrossGlLoader::GladResolverThunk (name));
211+ }
212+ }
213+
221214auto CrossGlLoader::LoadViaGlad () -> bool
222215{
223216 int result = 0 ;
224217
225218#ifndef USE_GLES
226- result = gladLoadGL (&CrossGlLoader::GladResolverThunk );
219+ result = gladLoadGL (&gladBridgeResolverThunk );
227220 if (result != 0 )
228221 {
229222 LOG_DEBUG (" CrossGlLoader: gladLoadGL() succeeded" );
@@ -232,7 +225,7 @@ auto CrossGlLoader::LoadViaGlad() -> bool
232225 LOG_DEBUG (" CrossGlLoader: gladLoadGL() failed" );
233226 return false ;
234227#else
235- result = gladLoadGLES2 (&CrossGlLoader::GladResolverThunk );
228+ result = gladLoadGLES2 (&gladBridgeResolverThunk );
236229 if (result != 0 )
237230 {
238231 LOG_DEBUG (" CrossGlLoader: gladLoadGLES2() succeeded" );
@@ -243,7 +236,7 @@ auto CrossGlLoader::LoadViaGlad() -> bool
243236#endif
244237}
245238
246- auto CrossGlLoader::Resolve (const char * name) const -> void*
239+ auto CrossGlLoader::Resolve (const char * name) const -> GLapiproc
247240{
248241 if (name == nullptr )
249242 {
0 commit comments