diff --git a/android/cpp/native_map_view.cpp b/android/cpp/native_map_view.cpp index 4cd1669ef..03530aeff 100644 --- a/android/cpp/native_map_view.cpp +++ b/android/cpp/native_map_view.cpp @@ -17,10 +17,6 @@ #include #include -#include - -pthread_once_t loadGLExtensions = PTHREAD_ONCE_INIT; - namespace mbgl { namespace android { @@ -308,8 +304,6 @@ void NativeMapView::terminateContext() { context = EGL_NO_CONTEXT; } -void loadExtensions(); - void NativeMapView::createSurface(ANativeWindow *window_) { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::createSurface"); @@ -349,9 +343,11 @@ void NativeMapView::createSurface(ANativeWindow *window_) { "SL Version"); // In the emulator this returns NULL with error code 0? // https://code.google.com/p/android/issues/detail?id=78977 } - log_gl_string(GL_EXTENSIONS, "Extensions"); - pthread_once(&loadGLExtensions, loadExtensions); + log_gl_string(GL_EXTENSIONS, "Extensions"); + mbgl::gl::InitializeExtensions([] (const char * name) { + return reinterpret_cast(eglGetProcAddress(name)); + }); if (!eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) { mbgl::Log::Error(mbgl::Event::OpenGL, @@ -584,12 +580,6 @@ EGLConfig NativeMapView::chooseConfig(const EGLConfig configs[], EGLint numConfi return configId; } -void loadExtensions() { - mbgl::gl::InitializeExtensions([] (const char * name) { - return reinterpret_cast(eglGetProcAddress(name)); - }); -} - void NativeMapView::pause() { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::pause"); diff --git a/platform/default/glfw_view.cpp b/platform/default/glfw_view.cpp index ed499d374..8265bb8bb 100644 --- a/platform/default/glfw_view.cpp +++ b/platform/default/glfw_view.cpp @@ -4,9 +4,6 @@ #include #include -#include - -pthread_once_t loadGLExtensions = PTHREAD_ONCE_INIT; void glfwError(int error, const char *description) { mbgl::Log::Error(mbgl::Event::OpenGL, "GLFW error (%i): %s", error, description); @@ -61,9 +58,7 @@ GLFWView::GLFWView(bool fullscreen_) : fullscreen(fullscreen_) { glfwSetScrollCallback(window, onScroll); glfwSetKeyCallback(window, onKey); - pthread_once(&loadGLExtensions, [] { - mbgl::gl::InitializeExtensions(glfwGetProcAddress); - }); + mbgl::gl::InitializeExtensions(glfwGetProcAddress); glfwMakeContextCurrent(nullptr); } diff --git a/platform/default/headless_view.cpp b/platform/default/headless_view.cpp index 357c6fac7..aa07706d8 100644 --- a/platform/default/headless_view.cpp +++ b/platform/default/headless_view.cpp @@ -13,8 +13,6 @@ #include #include -pthread_once_t loadGLExtensions = PTHREAD_ONCE_INIT; - #ifdef MBGL_USE_CGL #include #elif MBGL_USE_GLX @@ -45,28 +43,26 @@ void HeadlessView::loadExtensions() { return; } - pthread_once(&loadGLExtensions, [] { #ifdef MBGL_USE_CGL - gl::InitializeExtensions([](const char * name) { - static CFBundleRef framework = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.opengl")); - if (!framework) { - throw std::runtime_error("Failed to load OpenGL framework."); - } + gl::InitializeExtensions([](const char * name) { + static CFBundleRef framework = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.opengl")); + if (!framework) { + throw std::runtime_error("Failed to load OpenGL framework."); + } - CFStringRef str = CFStringCreateWithCString(kCFAllocatorDefault, name, kCFStringEncodingASCII); - void* symbol = CFBundleGetFunctionPointerForName(framework, str); - CFRelease(str); + CFStringRef str = CFStringCreateWithCString(kCFAllocatorDefault, name, kCFStringEncodingASCII); + void* symbol = CFBundleGetFunctionPointerForName(framework, str); + CFRelease(str); - return reinterpret_cast(symbol); - }); + return reinterpret_cast(symbol); + }); #endif #ifdef MBGL_USE_GLX - gl::InitializeExtensions([](const char * name) { - return glXGetProcAddress(reinterpret_cast(name)); - }); -#endif + gl::InitializeExtensions([](const char * name) { + return glXGetProcAddress(reinterpret_cast(name)); }); +#endif extensionsLoaded = true; } diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index a2e55b337..586ceb20f 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -35,8 +35,6 @@ class MBGLView; -static dispatch_once_t loadGLExtensions; - NSString *const MGLDefaultStyleName = @"mapbox-streets"; NSString *const MGLStyleVersion = @"7"; NSString *const MGLDefaultStyleMarkerSymbolName = @"default_marker"; @@ -233,20 +231,17 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) // load extensions // - dispatch_once(&loadGLExtensions, ^ - { - mbgl::gl::InitializeExtensions([](const char * name) { - static CFBundleRef framework = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.opengles")); - if (!framework) { - throw std::runtime_error("Failed to load OpenGL framework."); - } + mbgl::gl::InitializeExtensions([](const char * name) { + static CFBundleRef framework = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.opengles")); + if (!framework) { + throw std::runtime_error("Failed to load OpenGL framework."); + } - CFStringRef str = CFStringCreateWithCString(kCFAllocatorDefault, name, kCFStringEncodingASCII); - void* symbol = CFBundleGetFunctionPointerForName(framework, str); - CFRelease(str); + CFStringRef str = CFStringCreateWithCString(kCFAllocatorDefault, name, kCFStringEncodingASCII); + void* symbol = CFBundleGetFunctionPointerForName(framework, str); + CFRelease(str); - return reinterpret_cast(symbol); - }); + return reinterpret_cast(symbol); }); // setup mbgl map diff --git a/src/mbgl/platform/gl.cpp b/src/mbgl/platform/gl.cpp index 3d8a237c7..76be580b9 100644 --- a/src/mbgl/platform/gl.cpp +++ b/src/mbgl/platform/gl.cpp @@ -1,5 +1,7 @@ #include +#include + namespace mbgl { namespace gl { @@ -8,22 +10,26 @@ std::vector& ExtensionFunctionBase::functions() { return functions; } +static std::once_flag initializeExtensionsOnce; + void InitializeExtensions(glProc (*getProcAddress)(const char *)) { - const char * extensionsPtr = reinterpret_cast( - MBGL_CHECK_ERROR(glGetString(GL_EXTENSIONS))); + std::call_once(initializeExtensionsOnce, [getProcAddress] { + const char * extensionsPtr = reinterpret_cast( + MBGL_CHECK_ERROR(glGetString(GL_EXTENSIONS))); - if (!extensionsPtr) - return; + if (!extensionsPtr) + return; - const std::string extensions = extensionsPtr; - for (auto fn : ExtensionFunctionBase::functions()) { - for (auto probe : fn->probes) { - if (extensions.find(probe.first) != std::string::npos) { - fn->ptr = getProcAddress(probe.second); - break; + const std::string extensions = extensionsPtr; + for (auto fn : ExtensionFunctionBase::functions()) { + for (auto probe : fn->probes) { + if (extensions.find(probe.first) != std::string::npos) { + fn->ptr = getProcAddress(probe.second); + break; + } } } - } + }); } void checkError(const char *cmd, const char *file, int line) {