Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

render to a single static context in HeadlessView #6278

Closed
wants to merge 2 commits into from

Conversation

mikemorris
Copy link
Contributor

Fixes #6212

This is a first draft. It would be worth investigating whether needsResize can be refactored into HeadlessView::resize, eliminating the need for HeadlessView::activate - if possible we could completely remove that method and HeadlessView::deactivate, which is just a no-op for now.

Is it necessary to deactivate and destroy the glContext anywhere now that it's static and shared across all instances of HeadlessView?

/cc @tmpsantos

@mention-bot
Copy link

@mikemorris, thanks for your PR! By analyzing this pull request, we identified @jfirebaugh and @tmpsantos to be potential reviewers.

@mikemorris
Copy link
Contributor Author

Does this make tidy warning mean I shouldn't be declaring what is now a default destructor?

Caught clang-tidy warning/error:
/Users/mikemorris/Projects/mapbox-gl-native/platform/default/headless_view.cpp:39:1: warning: use '= default' to define a trivial destructor [modernize-use-default]
HeadlessView::~HeadlessView() {}
^
                              = default;

@mikemorris
Copy link
Contributor Author

This looks like a bit more complex issue, directly related to this pull request. The Node.js and QT builds are actually passing, seeing this segfault on all the GLFW builds however.

[----------] 20 tests from Annotations
[ RUN      ] Annotations.SymbolAnnotation
[       OK ] Annotations.SymbolAnnotation (331 ms)
[ RUN      ] Annotations.LineAnnotation
[xcb] Extra reply data still left in queue
[xcb] This is most likely caused by a broken X extension library
[xcb] Aborting, sorry about that.
mbgl-test: ../../src/xcb_io.c:576: _XReply: Assertion `!xcb_xlib_extra_reply_data_left' failed.
Program received signal SIGABRT, Aborted.
0x00002aaaaca8f035 in raise () from /lib/x86_64-linux-gnu/libc.so.6
Thread 9 (Thread 0x2aaab3587700 (LWP 9623)):
#0  0x00002aaaacb48569 in syscall () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000018198aa in uv__epoll_wait (epfd=<optimized out>, events=<optimized out>, nevents=<optimized out>, timeout=<optimized out>) at src/unix/linux-syscalls.c:321
#2  0x0000000001817f92 in uv__io_poll (loop=0x2aaab4000bd0, timeout=-1) at src/unix/linux-core.c:243
#3  0x000000000180f1f3 in uv_run (loop=0x2aaab4000bd0, mode=UV_RUN_DEFAULT) at src/unix/core.c:341
#4  0x0000000001690bf9 in mbgl::util::RunLoop::run() () at ../../../platform/default/run_loop.cpp:155
#5  0x000000000144b7b9 in _ZN4mbgl4util6ThreadINS_6Worker4ImplEE3runISt5tupleIJEEJEEEvOT_St16integer_sequenceImJXspT0_EEE () at ../../../src/mbgl/util/thread.hpp:111
#6  0x0000000001443747 in _ZZN4mbgl4util6ThreadINS_6Worker4ImplEEC4IJEEERKNS0_13ThreadContextEDpOT_ENKUlvE_clEv () at ../../../src/mbgl/util/thread.hpp:95
#7  0x000000000145c81e in _ZNSt12_Bind_simpleIFZN4mbgl4util6ThreadINS0_6Worker4ImplEEC4IJEEERKNS1_13ThreadContextEDpOT_EUlvE_vEE9_M_invokeIJEEEvSt12_Index_tupleIJXspT_EEE () at /usr/include/c++/5/functional:1531
#8  0x0000000001458cd5 in _ZNSt12_Bind_simpleIFZN4mbgl4util6ThreadINS0_6Worker4ImplEEC4IJEEERKNS1_13ThreadContextEDpOT_EUlvE_vEEclEv () at /usr/include/c++/5/functional:1520
#9  0x0000000001457cda in _ZNSt6thread5_ImplISt12_Bind_simpleIFZN4mbgl4util6ThreadINS2_6Worker4ImplEEC4IJEEERKNS3_13ThreadContextEDpOT_EUlvE_vEEE6_M_runEv () at /usr/include/c++/5/thread:115
#10 0x00002aaaac5c02a0 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#11 0x00002aaaaacd7e9a in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#12 0x00002aaaacb4c36d in clone () from /lib/x86_64-linux-gnu/libc.so.6
#13 0x0000000000000000 in ?? ()
Thread 8 (Thread 0x2aaab3788700 (LWP 9622)):
#0  0x00002aaaacb48569 in syscall () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000018198aa in uv__epoll_wait (epfd=<optimized out>, events=<optimized out>, nevents=<optimized out>, timeout=<optimized out>) at src/unix/linux-syscalls.c:321
#2  0x0000000001817f92 in uv__io_poll (loop=0x2aaab8000bd0, timeout=-1) at src/unix/linux-core.c:243
#3  0x000000000180f1f3 in uv_run (loop=0x2aaab8000bd0, mode=UV_RUN_DEFAULT) at src/unix/core.c:341
#4  0x0000000001690bf9 in mbgl::util::RunLoop::run() () at ../../../platform/default/run_loop.cpp:155
#5  0x000000000144b7b9 in _ZN4mbgl4util6ThreadINS_6Worker4ImplEE3runISt5tupleIJEEJEEEvOT_St16integer_sequenceImJXspT0_EEE () at ../../../src/mbgl/util/thread.hpp:111
#6  0x0000000001443747 in _ZZN4mbgl4util6ThreadINS_6Worker4ImplEEC4IJEEERKNS0_13ThreadContextEDpOT_ENKUlvE_clEv () at ../../../src/mbgl/util/thread.hpp:95
#7  0x000000000145c81e in _ZNSt12_Bind_simpleIFZN4mbgl4util6ThreadINS0_6Worker4ImplEEC4IJEEERKNS1_13ThreadContextEDpOT_EUlvE_vEE9_M_invokeIJEEEvSt12_Index_tupleIJXspT_EEE () at /usr/include/c++/5/functional:1531
#8  0x0000000001458cd5 in _ZNSt12_Bind_simpleIFZN4mbgl4util6ThreadINS0_6Worker4ImplEEC4IJEEERKNS1_13ThreadContextEDpOT_EUlvE_vEEclEv () at /usr/include/c++/5/functional:1520
#9  0x0000000001457cda in _ZNSt6thread5_ImplISt12_Bind_simpleIFZN4mbgl4util6ThreadINS2_6Worker4ImplEEC4IJEEERKNS3_13ThreadContextEDpOT_EUlvE_vEEE6_M_runEv () at /usr/include/c++/5/thread:115
#10 0x00002aaaac5c02a0 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#11 0x00002aaaaacd7e9a in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#12 0x00002aaaacb4c36d in clone () from /lib/x86_64-linux-gnu/libc.so.6
#13 0x0000000000000000 in ?? ()
Thread 7 (Thread 0x2aaab3989700 (LWP 9621)):
#0  0x00002aaaacb48569 in syscall () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000018198aa in uv__epoll_wait (epfd=<optimized out>, events=<optimized out>, nevents=<optimized out>, timeout=<optimized out>) at src/unix/linux-syscalls.c:321
#2  0x0000000001817f92 in uv__io_poll (loop=0x2aaabc000bd0, timeout=-1) at src/unix/linux-core.c:243
#3  0x000000000180f1f3 in uv_run (loop=0x2aaabc000bd0, mode=UV_RUN_DEFAULT) at src/unix/core.c:341
#4  0x0000000001690bf9 in mbgl::util::RunLoop::run() () at ../../../platform/default/run_loop.cpp:155
#5  0x000000000144b7b9 in _ZN4mbgl4util6ThreadINS_6Worker4ImplEE3runISt5tupleIJEEJEEEvOT_St16integer_sequenceImJXspT0_EEE () at ../../../src/mbgl/util/thread.hpp:111
#6  0x0000000001443747 in _ZZN4mbgl4util6ThreadINS_6Worker4ImplEEC4IJEEERKNS0_13ThreadContextEDpOT_ENKUlvE_clEv () at ../../../src/mbgl/util/thread.hpp:95
#7  0x000000000145c81e in _ZNSt12_Bind_simpleIFZN4mbgl4util6ThreadINS0_6Worker4ImplEEC4IJEEERKNS1_13ThreadContextEDpOT_EUlvE_vEE9_M_invokeIJEEEvSt12_Index_tupleIJXspT_EEE () at /usr/include/c++/5/functional:1531
#8  0x0000000001458cd5 in _ZNSt12_Bind_simpleIFZN4mbgl4util6ThreadINS0_6Worker4ImplEEC4IJEEERKNS1_13ThreadContextEDpOT_EUlvE_vEEclEv () at /usr/include/c++/5/functional:1520
#9  0x0000000001457cda in _ZNSt6thread5_ImplISt12_Bind_simpleIFZN4mbgl4util6ThreadINS2_6Worker4ImplEEC4IJEEERKNS3_13ThreadContextEDpOT_EUlvE_vEEE6_M_runEv () at /usr/include/c++/5/thread:115
#10 0x00002aaaac5c02a0 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#11 0x00002aaaaacd7e9a in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#12 0x00002aaaacb4c36d in clone () from /lib/x86_64-linux-gnu/libc.so.6
#13 0x0000000000000000 in ?? ()
Thread 6 (Thread 0x2aaab3b8a700 (LWP 9620)):
#0  0x00002aaaacb48569 in syscall () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000018198aa in uv__epoll_wait (epfd=<optimized out>, events=<optimized out>, nevents=<optimized out>, timeout=<optimized out>) at src/unix/linux-syscalls.c:321
#2  0x0000000001817f92 in uv__io_poll (loop=0x2aaac0000bd0, timeout=-1) at src/unix/linux-core.c:243
#3  0x000000000180f1f3 in uv_run (loop=0x2aaac0000bd0, mode=UV_RUN_DEFAULT) at src/unix/core.c:341
#4  0x0000000001690bf9 in mbgl::util::RunLoop::run() () at ../../../platform/default/run_loop.cpp:155
#5  0x000000000144b7b9 in _ZN4mbgl4util6ThreadINS_6Worker4ImplEE3runISt5tupleIJEEJEEEvOT_St16integer_sequenceImJXspT0_EEE () at ../../../src/mbgl/util/thread.hpp:111
#6  0x0000000001443747 in _ZZN4mbgl4util6ThreadINS_6Worker4ImplEEC4IJEEERKNS0_13ThreadContextEDpOT_ENKUlvE_clEv () at ../../../src/mbgl/util/thread.hpp:95
#7  0x000000000145c81e in _ZNSt12_Bind_simpleIFZN4mbgl4util6ThreadINS0_6Worker4ImplEEC4IJEEERKNS1_13ThreadContextEDpOT_EUlvE_vEE9_M_invokeIJEEEvSt12_Index_tupleIJXspT_EEE () at /usr/include/c++/5/functional:1531
#8  0x0000000001458cd5 in _ZNSt12_Bind_simpleIFZN4mbgl4util6ThreadINS0_6Worker4ImplEEC4IJEEERKNS1_13ThreadContextEDpOT_EUlvE_vEEclEv () at /usr/include/c++/5/functional:1520
#9  0x0000000001457cda in _ZNSt6thread5_ImplISt12_Bind_simpleIFZN4mbgl4util6ThreadINS2_6Worker4ImplEEC4IJEEERKNS3_13ThreadContextEDpOT_EUlvE_vEEE6_M_runEv () at /usr/include/c++/5/thread:115
#10 0x00002aaaac5c02a0 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#11 0x00002aaaaacd7e9a in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#12 0x00002aaaacb4c36d in clone () from /lib/x86_64-linux-gnu/libc.so.6
#13 0x0000000000000000 in ?? ()
Thread 1 (Thread 0x2aaaaaaf2e40 (LWP 9601)):
#0  0x00002aaaaca8f035 in raise () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00002aaaaca9279b in abort () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00002aaaaca87e1e in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#3  0x00002aaaaca87ec2 in __assert_fail () from /lib/x86_64-linux-gnu/libc.so.6
#4  0x00002aaaac0302bc in _XReply () from /usr/lib/x86_64-linux-gnu/libX11.so.6
#5  0x00002aaaac02b99d in XSync () from /usr/lib/x86_64-linux-gnu/libX11.so.6
#6  0x00002aaaab8b2a7a in xmesa_get_window_size () from /home/travis/build/mapbox/mapbox-gl-native/mason_packages/linux-x86_64/mesa/11.2.2/lib/libGL.so.1
#7  0x00002aaaab8b47e4 in xmesa_check_and_update_buffer_size () from /home/travis/build/mapbox/mapbox-gl-native/mason_packages/linux-x86_64/mesa/11.2.2/lib/libGL.so.1
#8  0x00002aaaab8b891a in xmesa_viewport () from /home/travis/build/mapbox/mapbox-gl-native/mason_packages/linux-x86_64/mesa/11.2.2/lib/libGL.so.1
#9  0x00002aaaaba9e87c in _mesa_Viewport () from /home/travis/build/mapbox/mapbox-gl-native/mason_packages/linux-x86_64/mesa/11.2.2/lib/libGL.so.1
#10 0x0000000001506681 in mbgl::HeadlessView::resizeFramebuffer()::{lambda()#14}::operator()() const () at ../../../platform/default/headless_view_glx.cpp:92
#11 0x0000000001506d75 in mbgl::HeadlessView::resizeFramebuffer() () at ../../../platform/default/headless_view_glx.cpp:92
#12 0x000000000150540e in mbgl::HeadlessView::activate() () at ../../../platform/default/headless_view.cpp:85
#13 0x00000000011a7d01 in mbgl::Map::Impl::update() () at ../../../src/mbgl/map/map.cpp:242
#14 0x00000000011a5de3 in _ZZN4mbgl3Map4ImplC4ERNS_4ViewERNS_10FileSourceENS_7MapModeENS_13GLContextModeENS_13ConstrainModeENS_12ViewportModeEENKUlvE0_clEv () at ../../../src/mbgl/map/map.cpp:101
#15 0x00000000011afde8 in _ZNSt17_Function_handlerIFvvEZN4mbgl3Map4ImplC4ERNS1_4ViewERNS1_10FileSourceENS1_7MapModeENS1_13GLContextModeENS1_13ConstrainModeENS1_12ViewportModeEEUlvE0_E9_M_invokeERKSt9_Any_data () at /usr/include/c++/5/functional:1871
#16 0x0000000000d769f6 in std::function<void ()>::operator()() const () at /usr/include/c++/5/functional:2267
#17 0x000000000168f1b3 in mbgl::util::AsyncTask::Impl::asyncCallback(uv_async_s*) () at ../../../platform/default/async_task.cpp:49
#18 0x000000000180e79d in uv__async_event (loop=0x2972a40, w=<optimized out>, nevents=<optimized out>) at src/unix/async.c:92
#19 0x000000000180e8f9 in uv__async_io (loop=0x2972a40, w=0x2972c08, events=<optimized out>) at src/unix/async.c:132
#20 0x000000000181811e in uv__io_poll (loop=0x2972a40, timeout=0) at src/unix/linux-core.c:345
#21 0x000000000180f1f3 in uv_run (loop=0x2972a40, mode=UV_RUN_NOWAIT) at src/unix/core.c:341
#22 0x0000000001690cd1 in mbgl::util::RunLoop::runOnce() () at ../../../platform/default/run_loop.cpp:161
#23 0x0000000000d8e719 in mbgl::test::render(mbgl::Map&) () at ../../../test/src/mbgl/test/util.cpp:107
#24 0x0000000000c96b3d in (anonymous namespace)::AnnotationTest::checkRendering(char const*) () at ../../../test/api/annotations.cpp:32
#25 0x0000000000c97cf3 in Annotations_LineAnnotation_Test::TestBody() () at ../../../test/api/annotations.cpp:61
#26 0x0000000001673f78 in void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) ()
#27 0x000000000165d115 in testing::Test::Run() ()
#28 0x000000000165dd58 in testing::TestInfo::Run() ()
#29 0x000000000165e407 in testing::TestCase::Run() ()
#30 0x00000000016658e1 in testing::internal::UnitTestImpl::RunAllTests() ()
#31 0x00000000016761d3 in bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) ()
#32 0x00000000016655b3 in testing::UnitTest::Run() ()
#33 0x0000000000d8c5d6 in RUN_ALL_TESTS() () at ../../../mason_packages/linux-x86_64/gtest/1.7.0/include/gtest/gtest.h:20058
#34 0x0000000000d8c40b in mbgl::runTests(int, char**) () at ../../../test/src/mbgl/test/test.cpp:14
#35 0x0000000000d7ef0b in main ()

GLXFBConfig *fbConfigs = nullptr;
GLXContext glContext = nullptr;
GLXPbuffer glxPbuffer = 0;
static Display *xDisplay;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Capturing from our chat, these static are probable why it is crashing on GLFW.

@jfirebaugh
Copy link
Contributor

Closing; sharing contexts between maps should be handled by sharing a single Backend instance between Maps, not by having static members in HeadlessBackend.

@jfirebaugh jfirebaugh closed this Feb 17, 2017
@jfirebaugh jfirebaugh deleted the single-context branch February 17, 2017 21:35
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants