X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fgl_video_view.cc;h=f24a78f1cbee42cc5217aa38f12cd88a064e8cb0;hb=1d2a51bdc8315fa7283be329669860e435a1513f;hp=08b62dee4cf73f7b8afe1d89ac16bd9d97b48d35;hpb=b057363e69b77119137c0c8b07402828096e03aa;p=dcpomatic.git diff --git a/src/wx/gl_video_view.cc b/src/wx/gl_video_view.cc index 08b62dee4..f24a78f1c 100644 --- a/src/wx/gl_video_view.cc +++ b/src/wx/gl_video_view.cc @@ -27,7 +27,7 @@ #include "lib/cross.h" #include "lib/player_video.h" #include "lib/butler.h" -#include +#include #include #ifdef DCPOMATIC_OSX @@ -49,7 +49,7 @@ #endif using std::cout; -using boost::shared_ptr; +using std::shared_ptr; using boost::optional; #if BOOST_VERSION >= 106100 using namespace boost::placeholders; @@ -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) { @@ -145,7 +161,9 @@ GLVideoView::draw (Position inter_position, dcp::Size inter_size) wxSize canvas_size; { boost::mutex::scoped_lock lm (_canvas_mutex); - canvas_size = _canvas->GetSize (); + if (_canvas) { + canvas_size = _canvas->GetSize (); + } } if (canvas_size.GetWidth() < 64 || canvas_size.GetHeight() < 0) { @@ -325,7 +343,7 @@ GLVideoView::set_image_and_draw () { shared_ptr pv = player_video().first; if (pv) { - set_image (pv->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VIDEO_RANGE_FULL, false, true)); + set_image (pv->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, false, true)); draw (pv->inter_position(), pv->inter_size()); _viewer->image_changed (pv); } @@ -338,10 +356,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")) { @@ -405,14 +434,16 @@ catch (boost::thread_interrupted& e) store_current (); } -bool + +VideoView::NextFrameResult GLVideoView::display_next_frame (bool non_blocking) { - bool const r = get_next_frame (non_blocking); + NextFrameResult const r = get_next_frame (non_blocking); request_one_shot (); return r; } + void GLVideoView::request_one_shot () {