22//
33// Provides a universal resolver to find GL function pointers.
44
5- #include " CrossGlLoader .hpp"
5+ #include " PlatformGLResolver .hpp"
66
7- #include < Logging.hpp>
87#include " OpenGL.h"
8+ #include < Logging.hpp>
99
1010#include < array>
1111#include < cstdio>
1212
1313namespace libprojectM {
14+
1415namespace Renderer {
1516
16- auto CrossGlLoader::Instance () -> CrossGlLoader&
17+ namespace Platform {
18+
19+ auto GLResolver::Instance () -> GLResolver&
1720{
18- static CrossGlLoader instance;
21+ static GLResolver instance;
1922 return instance;
2023}
2124
22- auto CrossGlLoader ::Initialize (UserResolver resolver, void * userData) -> bool
25+ auto GLResolver ::Initialize (UserResolver resolver, void * userData) -> bool
2326{
2427 const std::lock_guard<std::mutex> lock (m_mutex);
2528
@@ -35,7 +38,7 @@ auto CrossGlLoader::Initialize(UserResolver resolver, void* userData) -> bool
3538 ResolveProviderFunctions ();
3639 DetectBackend ();
3740
38- if (LoadViaGlad ())
41+ if (LoadGlad ())
3942 {
4043 // If detection failed, but loading succeeded
4144 // fall back to a sensible default
@@ -55,7 +58,7 @@ auto CrossGlLoader::Initialize(UserResolver resolver, void* userData) -> bool
5558 return false ;
5659}
5760
58- void CrossGlLoader ::Shutdown ()
61+ void GLResolver ::Shutdown ()
5962{
6063 const std::lock_guard<std::mutex> lock (m_mutex);
6164
@@ -73,26 +76,26 @@ void CrossGlLoader::Shutdown()
7376 m_glLib.Close ();
7477}
7578
76- auto CrossGlLoader ::IsLoaded () const -> bool
79+ auto GLResolver ::IsLoaded () const -> bool
7780{
7881 const std::lock_guard<std::mutex> lock (m_mutex);
7982 return m_loaded;
8083}
8184
82- auto CrossGlLoader ::CurrentBackend () const -> Backend
85+ auto GLResolver ::CurrentBackend () const -> Backend
8386{
8487 const std::lock_guard<std::mutex> lock (m_mutex);
8588 return m_backend;
8689}
8790
88- auto CrossGlLoader ::GetProcAddress (const char * name) const -> GLapiproc
91+ auto GLResolver ::GetProcAddress (const char * name) const -> GLapiproc
8992{
9093 // NOTE: This method is used during GLAD loading. Avoid taking the mutex here to
9194 // prevent deadlocks if GLAD calls back into us while Initialize() is holding the lock
9295 return Resolve (name);
9396}
9497
95- void CrossGlLoader ::OpenNativeLibraries ()
98+ void GLResolver ::OpenNativeLibraries ()
9699{
97100 // Best-effort: macOS or minimal EGL setups may fail to open
98101
@@ -111,15 +114,15 @@ void CrossGlLoader::OpenNativeLibraries()
111114 m_glLib.Open (kGlNames .data ());
112115}
113116
114- void CrossGlLoader ::ResolveProviderFunctions ()
117+ void GLResolver ::ResolveProviderFunctions ()
115118{
116119 // EGL
117120 if (m_eglLib.IsOpen ())
118121 {
119122 void * sym = m_eglLib.GetSymbol (" eglGetProcAddress" );
120123 if (sym == nullptr )
121124 {
122- sym = Platform:: DynamicLibrary::FindGlobalSymbol (" eglGetProcAddress" );
125+ sym = DynamicLibrary::FindGlobalSymbol (" eglGetProcAddress" );
123126 }
124127 m_eglGetProcAddress = reinterpret_cast <GetProcFunc>(sym);
125128 }
@@ -131,7 +134,7 @@ void CrossGlLoader::ResolveProviderFunctions()
131134 void * sym = m_glLib.GetSymbol (" wglGetProcAddress" );
132135 if (!sym)
133136 {
134- sym = Platform:: DynamicLibrary::FindGlobalSymbol (" wglGetProcAddress" );
137+ sym = DynamicLibrary::FindGlobalSymbol (" wglGetProcAddress" );
135138 }
136139 m_wglGetProcAddress = reinterpret_cast <GetProcFunc>(sym);
137140#else
@@ -142,23 +145,23 @@ void CrossGlLoader::ResolveProviderFunctions()
142145 }
143146 if (sym == nullptr )
144147 {
145- sym = Platform:: DynamicLibrary::FindGlobalSymbol (" glXGetProcAddress" );
148+ sym = DynamicLibrary::FindGlobalSymbol (" glXGetProcAddress" );
146149 }
147150 m_glxGetProcAddress = reinterpret_cast <GetProcFunc>(sym);
148151#endif
149152 }
150153
151- [&] {
154+ {
152155 char buf[256 ];
153- std::snprintf (buf, sizeof (buf), " CrossGlLoader : egl=%p gl=%p" ,
156+ std::snprintf (buf, sizeof (buf), " [PlatformGLResolver] Library handles : egl=%p gl=%p" ,
154157 reinterpret_cast <void *>(m_eglLib.Handle ()),
155158 reinterpret_cast <void *>(m_glLib.Handle ()));
156159 LOG_DEBUG (buf);
157- }();
160+ }
158161
159162}
160163
161- void CrossGlLoader ::DetectBackend ()
164+ void GLResolver ::DetectBackend ()
162165{
163166 // Detect current context provider
164167 // This is best-effort: on some platforms (e.g. macOS/CGL) it may report "unknown"
@@ -168,37 +171,37 @@ void CrossGlLoader::DetectBackend()
168171#ifndef _WIN32
169172 const bool usingGlx = m_glLib.IsOpen () && IsCurrentGlx (m_glLib);
170173#else
171- const bool usingWgl = Platform:: IsCurrentWgl ();
174+ const bool usingWgl = IsCurrentWgl ();
172175#endif
173176
174177 if (usingEgl)
175178 {
176- LOG_DEBUG (" CrossGlLoader: current context: EGL" );
179+ LOG_DEBUG (" [PlatformGLResolver] current context: EGL" );
177180 m_backend = Backend::EglGles;
178181 return ;
179182 }
180183
181184#ifndef _WIN32
182185 if (usingGlx)
183186 {
184- LOG_DEBUG (" CrossGlLoader: current context: GLX" );
187+ LOG_DEBUG (" [PlatformGLResolver] current context: GLX" );
185188 m_backend = Backend::GlxGl;
186189 return ;
187190 }
188191#else
189192 if (usingWgl)
190193 {
191- LOG_DEBUG (" CrossGlLoader: current context: WGL" );
194+ LOG_DEBUG (" [PlatformGLResolver] current context: WGL" );
192195 m_backend = Backend::WglGl;
193196 return ;
194197 }
195198#endif
196199
197- LOG_DEBUG (" CrossGlLoader: current context: (unknown, will try generic loader)" );
200+ LOG_DEBUG (" [PlatformGLResolver] current context: (unknown, will try generic loader)" );
198201 m_backend = Backend::None;
199202}
200203
201- auto CrossGlLoader ::GladResolverThunk (const char * name) -> GLapiproc
204+ auto GLResolver ::GladResolverThunk (const char * name) -> GLapiproc
202205{
203206 return Instance ().Resolve (name);
204207}
@@ -207,36 +210,36 @@ namespace {
207210// adapt external void* handle to GLAD type
208211auto gladBridgeResolverThunk (const char * name) -> GLADapiproc
209212{
210- return reinterpret_cast <GLADapiproc>(CrossGlLoader ::GladResolverThunk (name));
213+ return reinterpret_cast <GLADapiproc>(GLResolver ::GladResolverThunk (name));
211214}
212215}
213216
214- auto CrossGlLoader::LoadViaGlad () -> bool
217+ auto GLResolver::LoadGlad () -> bool
215218{
216219 int result = 0 ;
217220
218221#ifndef USE_GLES
219222 result = gladLoadGL (&gladBridgeResolverThunk);
220223 if (result != 0 )
221224 {
222- LOG_DEBUG (" CrossGlLoader: gladLoadGL() succeeded" );
225+ LOG_DEBUG (" [PlatformGLResolver] gladLoadGL() succeeded" );
223226 return true ;
224227 }
225- LOG_DEBUG ( " CrossGlLoader: gladLoadGL() failed" );
228+ LOG_FATAL ( " [PlatformGLResolver] gladLoadGL() failed" );
226229 return false ;
227230#else
228231 result = gladLoadGLES2 (&gladBridgeResolverThunk);
229232 if (result != 0 )
230233 {
231- LOG_DEBUG (" CrossGlLoader: gladLoadGLES2() succeeded" );
234+ LOG_DEBUG (" [PlatformGLResolver] gladLoadGLES2() succeeded" );
232235 return true ;
233236 }
234- LOG_DEBUG ( " CrossGlLoader: gladLoadGLES2() failed" );
237+ LOG_FATAL ( " [PlatformGLResolver] gladLoadGLES2() failed" );
235238 return false ;
236239#endif
237240}
238241
239- auto CrossGlLoader ::Resolve (const char * name) const -> GLapiproc
242+ auto GLResolver ::Resolve (const char * name) const -> GLapiproc
240243{
241244 if (name == nullptr )
242245 {
@@ -253,7 +256,7 @@ auto CrossGlLoader::Resolve(const char* name) const -> GLapiproc
253256 }
254257
255258 // 2) Global symbol table
256- if (void * ptr = Platform:: DynamicLibrary::FindGlobalSymbol (name))
259+ if (void * ptr = DynamicLibrary::FindGlobalSymbol (name))
257260 {
258261 return ptr;
259262 }
@@ -300,5 +303,6 @@ auto CrossGlLoader::Resolve(const char* name) const -> GLapiproc
300303 return nullptr ;
301304}
302305
306+ } // namespace Platform
303307} // namespace Renderer
304308} // namespace libprojectM
0 commit comments