diff options
Diffstat (limited to 'android')
-rw-r--r-- | android/cpp/native_map_view.cpp | 124 |
1 files changed, 15 insertions, 109 deletions
diff --git a/android/cpp/native_map_view.cpp b/android/cpp/native_map_view.cpp index 327d1dc598..03530aefff 100644 --- a/android/cpp/native_map_view.cpp +++ b/android/cpp/native_map_view.cpp @@ -17,10 +17,6 @@ #include <mbgl/platform/gl.hpp> #include <mbgl/util/std.hpp> -#include <pthread.h> - -pthread_once_t loadGLExtensions = PTHREAD_ONCE_INIT; - namespace mbgl { namespace android { @@ -61,9 +57,11 @@ NativeMapView::NativeMapView(JNIEnv *env, jobject obj_) : mbgl::View(*this), fileCache(mbgl::android::cachePath + "/mbgl-cache.db"), fileSource(&fileCache), - map(*this, fileSource, MapMode::Continuous, true) { + map(*this, fileSource, MapMode::Continuous) { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::NativeMapView"); + map.pause(); + assert(env != nullptr); assert(obj_ != nullptr); @@ -116,10 +114,14 @@ void NativeMapView::activate() { void NativeMapView::deactivate() { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::deactivate"); - if (!eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) { - mbgl::Log::Error(mbgl::Event::OpenGL, "eglMakeCurrent(EGL_NO_CONTEXT) returned error %d", - eglGetError()); - throw new std::runtime_error("eglMakeCurrent() failed"); + if (display != EGL_NO_DISPLAY) { + if (!eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) { + mbgl::Log::Error(mbgl::Event::OpenGL, "eglMakeCurrent(EGL_NO_CONTEXT) returned error %d", + eglGetError()); + throw new std::runtime_error("eglMakeCurrent() failed"); + } + } else { + mbgl::Log::Info(mbgl::Event::Android, "Not deactivating as we are not ready"); } } @@ -302,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"); @@ -343,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<mbgl::gl::glProc>(eglGetProcAddress(name)); + }); if (!eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) { mbgl::Log::Error(mbgl::Event::OpenGL, @@ -578,102 +580,6 @@ EGLConfig NativeMapView::chooseConfig(const EGLConfig configs[], EGLint numConfi return configId; } -void loadExtensions() { - const GLubyte *str = glGetString(GL_EXTENSIONS); - if (str == nullptr) { - mbgl::Log::Error(mbgl::Event::OpenGL, "glGetString(GL_EXTENSIONS) returned error %d", - glGetError()); - return; - } - - std::string extensions(reinterpret_cast<const char *>(str)); - - if (extensions.find("GL_OES_vertex_array_object") != std::string::npos) { - mbgl::Log::Info(mbgl::Event::OpenGL, "Using GL_OES_vertex_array_object."); - gl::BindVertexArray = reinterpret_cast<gl::PFNGLBINDVERTEXARRAYPROC>( - eglGetProcAddress("glBindVertexArrayOES")); - gl::DeleteVertexArrays = reinterpret_cast<gl::PFNGLDELETEVERTEXARRAYSPROC>( - eglGetProcAddress("glDeleteVertexArraysOES")); - gl::GenVertexArrays = reinterpret_cast<gl::PFNGLGENVERTEXARRAYSPROC>( - eglGetProcAddress("glGenVertexArraysOES")); - gl::IsVertexArray = - reinterpret_cast<gl::PFNGLISVERTEXARRAYPROC>(eglGetProcAddress("glIsVertexArrayOES")); - assert(gl::BindVertexArray != nullptr); - assert(gl::DeleteVertexArrays != nullptr); - assert(gl::GenVertexArrays != nullptr); - assert(gl::IsVertexArray != nullptr); - } - - if (extensions.find("GL_OES_packed_depth_stencil") != std::string::npos) { - mbgl::Log::Info(mbgl::Event::OpenGL, "Using GL_OES_packed_depth_stencil."); - gl::isPackedDepthStencilSupported = true; - } - - if (extensions.find("GL_OES_depth24") != std::string::npos) { - gl::isDepth24Supported = true; - } - - if (extensions.find("GL_KHR_debug") != std::string::npos) { - mbgl::Log::Info(mbgl::Event::OpenGL, "Using GL_KHR_debug."); - gl::DebugMessageControl = reinterpret_cast<gl::PFNGLDEBUGMESSAGECONTROLPROC>( - eglGetProcAddress("glDebugMessageControl")); - gl::DebugMessageInsert = reinterpret_cast<gl::PFNGLDEBUGMESSAGEINSERTPROC>( - eglGetProcAddress("glDebugMessageInsert")); - gl::DebugMessageCallback = reinterpret_cast<gl::PFNGLDEBUGMESSAGECALLBACKPROC>( - eglGetProcAddress("glDebugMessageCallback")); - gl::GetDebugMessageLog = reinterpret_cast<gl::PFNGLGETDEBUGMESSAGELOGPROC>( - eglGetProcAddress("glGetDebugMessageLog")); - gl::GetPointerv = - reinterpret_cast<gl::PFNGLGETPOINTERVPROC>(eglGetProcAddress("glGetPointerv")); - gl::PushDebugGroup = - reinterpret_cast<gl::PFNGLPUSHDEBUGGROUPPROC>(eglGetProcAddress("glPushDebugGroup")); - gl::PopDebugGroup = - reinterpret_cast<gl::PFNGLPOPDEBUGGROUPPROC>(eglGetProcAddress("glPopDebugGroup")); - gl::ObjectLabel = - reinterpret_cast<gl::PFNGLOBJECTLABELPROC>(eglGetProcAddress("glObjectLabel")); - gl::GetObjectLabel = - reinterpret_cast<gl::PFNGLGETOBJECTLABELPROC>(eglGetProcAddress("glGetObjectLabel")); - gl::ObjectPtrLabel = - reinterpret_cast<gl::PFNGLOBJECTPTRLABELPROC>(eglGetProcAddress("glObjectPtrLabel")); - gl::GetObjectPtrLabel = reinterpret_cast<gl::PFNGLGETOBJECTPTRLABELPROC>( - eglGetProcAddress("glGetObjectPtrLabel")); - assert(gl::DebugMessageControl != nullptr); - assert(gl::DebugMessageInsert != nullptr); - assert(gl::DebugMessageCallback != nullptr); - assert(gl::GetDebugMessageLog != nullptr); - assert(gl::GetPointerv != nullptr); - assert(gl::PushDebugGroup != nullptr); - assert(gl::PopDebugGroup != nullptr); - assert(gl::ObjectLabel != nullptr); - assert(gl::GetObjectLabel != nullptr); - assert(gl::ObjectPtrLabel != nullptr); - assert(gl::GetObjectPtrLabel != nullptr); - } else { - if (extensions.find("GL_EXT_debug_marker") != std::string::npos) { - mbgl::Log::Info(mbgl::Event::OpenGL, "Using GL_EXT_debug_marker."); - gl::InsertEventMarkerEXT = reinterpret_cast<gl::PFNGLINSERTEVENTMARKEREXTPROC>( - eglGetProcAddress("glInsertEventMarkerEXT")); - gl::PushGroupMarkerEXT = reinterpret_cast<gl::PFNGLPUSHGROUPMARKEREXTPROC>( - eglGetProcAddress("glPushGroupMarkerEXT")); - gl::PopGroupMarkerEXT = reinterpret_cast<gl::PFNGLPOPGROUPMARKEREXTPROC>( - eglGetProcAddress("glPopGroupMarkerEXT")); - assert(gl::InsertEventMarkerEXT != nullptr); - assert(gl::PushGroupMarkerEXT != nullptr); - assert(gl::PopGroupMarkerEXT != nullptr); - } - - if (extensions.find("GL_EXT_debug_label") != std::string::npos) { - mbgl::Log::Info(mbgl::Event::OpenGL, "Using GL_EXT_debug_label."); - gl::LabelObjectEXT = reinterpret_cast<gl::PFNGLLABELOBJECTEXTPROC>( - eglGetProcAddress("glLabelObjectEXT")); - gl::GetObjectLabelEXT = reinterpret_cast<gl::PFNGLGETOBJECTLABELEXTPROC>( - eglGetProcAddress("glGetObjectLabelEXT")); - assert(gl::LabelObjectEXT != nullptr); - assert(gl::GetObjectLabelEXT != nullptr); - } - } -} - void NativeMapView::pause() { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::pause"); |