Add View::make_inactive() to remove context from rendering thread

View::make_inactive() is called just before termination of the
rendering thread. The implementation must clear the thread's GL
context.

This ensures there is no context still bound to a thread during
GL shutdown. This is needed as GL will not actually delete a
context until it is not active on any thread.

Fixes mapbox/mapbox-gl-native#340

Conflicts:
	common/glfw_view.hpp
	include/llmr/map/view.hpp
	test/headless.cpp
This commit is contained in:
Leith Bade
2014-06-24 00:25:20 +10:00
committed by Mike Morris
parent c836bc2b01
commit c004c03696
6 changed files with 25 additions and 0 deletions

View File

@@ -192,6 +192,10 @@ void GLFWView::make_active() {
glfwMakeContextCurrent(window);
}
void GLFWView::make_inactive() {
glfwMakeContextCurrent(nullptr);
}
void GLFWView::swap() {
glfwPostEmptyEvent();

View File

@@ -17,6 +17,7 @@ public:
void initialize(mbgl::Map *map);
void swap();
void make_active();
void make_inactive();
void notify_map_change(mbgl::MapChange change, mbgl::timestamp delay = 0);
static void key(GLFWwindow *window, int key, int scancode, int action, int mods);

View File

@@ -179,6 +179,19 @@ void HeadlessView::make_active() {
#endif
}
void HeadlessView::make_inactive() {
#if MBGL_USE_CGL
CGLError error = CGLSetCurrentContext(nullptr);
if (error) {
fprintf(stderr, "Removing OpenGL context failed\n");
}
#endif
#if MBGL_USE_GLX
// no-op
#endif
}
void HeadlessView::swap() {}
unsigned int HeadlessView::root_fbo() {

View File

@@ -23,6 +23,7 @@ public:
void notify_map_change(MapChange change, timestamp delay = 0);
void make_active();
void make_inactive();
void swap();
unsigned int root_fbo();

View File

@@ -35,6 +35,10 @@ public:
// renderer setup since the render thread doesn't switch the contexts.
virtual void make_active() = 0;
// Called from the render thread. Makes the GL context inactive in the current
// thread. This is called once just before the rendering thread terminates.
virtual void make_inactive() = 0;
// Returns the base framebuffer object, if any, and 0 if using the system
// provided framebuffer.
virtual unsigned int root_fbo() {

View File

@@ -114,6 +114,8 @@ void Map::run() {
prepare();
render();
}
view.make_inactive();
}
void Map::rerender() {