summaryrefslogtreecommitdiff
path: root/android
diff options
context:
space:
mode:
Diffstat (limited to 'android')
-rw-r--r--android/cpp/native_map_view.cpp124
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");