guard against concurrent OpenGL extension loading
This commit is contained in:
@@ -16,6 +16,9 @@
|
||||
#include <mbgl/platform/gl.hpp>
|
||||
#include <mbgl/util/std.hpp>
|
||||
|
||||
|
||||
pthread_once_t loadGLExtensions = PTHREAD_ONCE_INIT;
|
||||
|
||||
namespace mbgl {
|
||||
namespace android {
|
||||
|
||||
@@ -296,6 +299,8 @@ void NativeMapView::terminateContext() {
|
||||
context = EGL_NO_CONTEXT;
|
||||
}
|
||||
|
||||
void loadExtensions();
|
||||
|
||||
void NativeMapView::createSurface(ANativeWindow *window_) {
|
||||
mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::createSurface");
|
||||
|
||||
@@ -337,7 +342,7 @@ void NativeMapView::createSurface(ANativeWindow *window_) {
|
||||
}
|
||||
log_gl_string(GL_EXTENSIONS, "Extensions");
|
||||
|
||||
loadExtensions();
|
||||
pthread_once(&loadGLExtensions, loadExtensions);
|
||||
|
||||
if (!eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) {
|
||||
mbgl::Log::Error(mbgl::Event::OpenGL,
|
||||
@@ -553,7 +558,6 @@ EGLConfig NativeMapView::chooseConfig(const EGLConfig configs[], EGLint numConfi
|
||||
|
||||
// Sort the configs to find the best one
|
||||
configList.sort();
|
||||
usingDepth24 = std::get<1>(configList.front()) == Format24Depth8Stencil;
|
||||
bool isConformant = !std::get<2>(configList.front());
|
||||
bool isCaveat = std::get<3>(configList.front());
|
||||
int configNum = std::get<4>(configList.front());
|
||||
@@ -588,7 +592,7 @@ void NativeMapView::start() {
|
||||
map.start(true);
|
||||
}
|
||||
|
||||
void NativeMapView::loadExtensions() {
|
||||
void loadExtensions() {
|
||||
const GLubyte *str = glGetString(GL_EXTENSIONS);
|
||||
if (str == nullptr) {
|
||||
mbgl::Log::Error(mbgl::Event::OpenGL, "glGetString(GL_EXTENSIONS) returned error %d",
|
||||
@@ -620,12 +624,7 @@ void NativeMapView::loadExtensions() {
|
||||
}
|
||||
|
||||
if (extensions.find("GL_OES_depth24") != std::string::npos) {
|
||||
mbgl::Log::Info(mbgl::Event::OpenGL, "Using GL_OES_depth24.");
|
||||
if (usingDepth24) {
|
||||
gl::isDepth24Supported = true;
|
||||
} else {
|
||||
mbgl::Log::Info(mbgl::Event::OpenGL, "Preferring 16 bit depth.");
|
||||
}
|
||||
gl::isDepth24Supported = true;
|
||||
}
|
||||
|
||||
if (extensions.find("GL_KHR_debug") != std::string::npos) {
|
||||
|
||||
@@ -54,8 +54,6 @@ public:
|
||||
private:
|
||||
EGLConfig chooseConfig(const EGLConfig configs[], EGLint numConfigs);
|
||||
|
||||
void loadExtensions();
|
||||
|
||||
bool inEmulator();
|
||||
|
||||
private:
|
||||
@@ -80,8 +78,6 @@ private:
|
||||
|
||||
bool firstTime = false;
|
||||
|
||||
bool usingDepth24 = false;
|
||||
|
||||
bool fpsEnabled = false;
|
||||
double fps = 0.0;
|
||||
};
|
||||
|
||||
@@ -60,6 +60,8 @@ private:
|
||||
GLXPbuffer glxPbuffer = 0;
|
||||
#endif
|
||||
|
||||
bool extensionsLoaded = false;
|
||||
|
||||
GLuint fbo = 0;
|
||||
GLuint fboDepthStencil = 0;
|
||||
GLuint fboColor = 0;
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
#include <mbgl/platform/gl.hpp>
|
||||
#include <mbgl/platform/log.hpp>
|
||||
|
||||
pthread_once_t loadGLExtensions = PTHREAD_ONCE_INIT;
|
||||
|
||||
GLFWView::GLFWView(bool fullscreen_) : fullscreen(fullscreen_) {
|
||||
#ifdef NVIDIA
|
||||
glDiscardFramebufferEXT = reinterpret_cast<PFNGLDISCARDFRAMEBUFFEREXTPROC>(glfwGetProcAddress("glDiscardFramebufferEXT"));
|
||||
@@ -71,8 +73,8 @@ void GLFWView::initialize(mbgl::Map *map_) {
|
||||
glfwSetScrollCallback(window, onScroll);
|
||||
glfwSetKeyCallback(window, onKey);
|
||||
|
||||
const std::string extensions = reinterpret_cast<const char *>(MBGL_CHECK_ERROR(glGetString(GL_EXTENSIONS)));
|
||||
{
|
||||
pthread_once(&loadGLExtensions, [] {
|
||||
const std::string extensions = reinterpret_cast<const char *>(MBGL_CHECK_ERROR(glGetString(GL_EXTENSIONS)));
|
||||
using namespace mbgl;
|
||||
|
||||
if (extensions.find("GL_KHR_debug") != std::string::npos) {
|
||||
@@ -152,7 +154,7 @@ void GLFWView::initialize(mbgl::Map *map_) {
|
||||
// Require packed depth stencil
|
||||
gl::isPackedDepthStencilSupported = true;
|
||||
gl::isDepth24Supported = true;
|
||||
}
|
||||
});
|
||||
|
||||
glfwMakeContextCurrent(nullptr);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
#include <cstring>
|
||||
#include <cassert>
|
||||
|
||||
pthread_once_t loadGLExtensions = PTHREAD_ONCE_INIT;
|
||||
|
||||
#ifdef MBGL_USE_CGL
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
|
||||
@@ -48,10 +50,18 @@ HeadlessView::HeadlessView(std::shared_ptr<HeadlessDisplay> display)
|
||||
}
|
||||
|
||||
void HeadlessView::loadExtensions() {
|
||||
activate();
|
||||
const char *extensionPtr = reinterpret_cast<const char *>(MBGL_CHECK_ERROR(glGetString(GL_EXTENSIONS)));
|
||||
if (extensionsLoaded) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (extensionPtr) {
|
||||
activate();
|
||||
|
||||
pthread_once(&loadGLExtensions, [] {
|
||||
const char *extensionPtr = reinterpret_cast<const char *>(MBGL_CHECK_ERROR(glGetString(GL_EXTENSIONS)));
|
||||
|
||||
if (!extensionPtr) {
|
||||
return;
|
||||
}
|
||||
const std::string extensions = extensionPtr;
|
||||
|
||||
#ifdef MBGL_USE_CGL
|
||||
@@ -78,12 +88,14 @@ void HeadlessView::loadExtensions() {
|
||||
assert(gl::IsVertexArray != nullptr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
});
|
||||
|
||||
// HeadlessView requires packed depth stencil
|
||||
gl::isPackedDepthStencilSupported = true;
|
||||
gl::isDepth24Supported = true;
|
||||
|
||||
extensionsLoaded = true;
|
||||
|
||||
deactivate();
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ const std::string &defaultCacheDatabase() {
|
||||
return path;
|
||||
}
|
||||
|
||||
static dispatch_once_t loadGLExtensions;
|
||||
|
||||
extern NSString *const MGLStyleKeyGeneric;
|
||||
extern NSString *const MGLStyleKeyFill;
|
||||
@@ -213,8 +214,9 @@ mbgl::DefaultFileSource *mbglFileSource = nullptr;
|
||||
|
||||
// load extensions
|
||||
//
|
||||
const std::string extensions = (char *)glGetString(GL_EXTENSIONS);
|
||||
{
|
||||
dispatch_once(&loadGLExtensions, ^{
|
||||
const std::string extensions = (char *)glGetString(GL_EXTENSIONS);
|
||||
|
||||
using namespace mbgl;
|
||||
|
||||
if (extensions.find("GL_OES_vertex_array_object") != std::string::npos) {
|
||||
@@ -231,7 +233,7 @@ mbgl::DefaultFileSource *mbglFileSource = nullptr;
|
||||
if (extensions.find("GL_OES_depth24") != std::string::npos) {
|
||||
gl::isDepth24Supported = YES;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// setup mbgl map
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user