From c31eb6d664ad26940d56f1d9da1778dd9729a187 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 16 Jan 2021 00:55:29 +0100 Subject: [PATCH] Fix OpenGL crashes on macOS (#1899). --- src/wx/gl_video_view.cc | 33 ++++++++++++++++++++++++++++++--- src/wx/gl_video_view.h | 1 + 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/wx/gl_video_view.cc b/src/wx/gl_video_view.cc index 969264c27..5d40050de 100644 --- a/src/wx/gl_video_view.cc +++ b/src/wx/gl_video_view.cc @@ -68,6 +68,7 @@ check_gl_error (char const * last) GLVideoView::GLVideoView (FilmViewer* viewer, wxWindow *parent) : VideoView (viewer) + , _context (nullptr) , _have_storage (false) , _vsync_enabled (false) , _playing (false) @@ -117,6 +118,11 @@ GLVideoView::update () if (!_canvas->IsShownOnScreen()) { return; } + +#ifdef DCPOMATIC_OSX + /* macOS gives errors if we don't do this (and therefore [NSOpenGLContext setView:]) from the main thread */ + ensure_context (); +#endif } if (!_thread.joinable()) { @@ -126,6 +132,16 @@ GLVideoView::update () request_one_shot (); } + +void +GLVideoView::ensure_context () +{ + if (!_context) { + _context = new wxGLContext (_canvas); + _canvas->SetCurrent (*_context); + } +} + void GLVideoView::draw (Position inter_position, dcp::Size inter_size) { @@ -338,10 +354,21 @@ try { { boost::mutex::scoped_lock lm (_canvas_mutex); - _context = new wxGLContext (_canvas); - _canvas->SetCurrent (*_context); - } +#if defined(DCPOMATIC_OSX) + /* Without this we see errors like + * ../src/osx/cocoa/glcanvas.mm(194): assert ""context"" failed in SwapBuffers(): should have current context [in thread 700006970000] + */ + WXGLSetCurrentContext (_context->GetWXGLContext()); +#else + /* We must call this here on Linux otherwise we get no image (for reasons + * that aren't clear). However, doing ensure_context() from this thread + * on macOS gives + * "[NSOpenGLContext setView:] must be called from the main thread". + */ + ensure_context (); +#endif + } #if defined(DCPOMATIC_LINUX) && defined(DCPOMATIC_HAVE_GLX_SWAP_INTERVAL_EXT) if (_canvas->IsExtensionSupported("GLX_EXT_swap_control")) { diff --git a/src/wx/gl_video_view.h b/src/wx/gl_video_view.h index d8ee65da6..1e6886f26 100644 --- a/src/wx/gl_video_view.h +++ b/src/wx/gl_video_view.h @@ -61,6 +61,7 @@ private: void thread_playing (); void request_one_shot (); void check_for_butler_errors (); + void ensure_context (); /* Mutex for use of _canvas; it's only contended when our ::thread is started up so this may be overkill. -- 2.30.2