From 059771199390113c5c1cf385ef586f7dd6320b3c Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 7 Dec 2020 01:37:57 -0600 Subject: hack around QGLWidget::initializeGL not working on macOS --- src/waveform/renderers/glslwaveformrenderersignal.cpp | 6 ++---- src/waveform/renderers/glvsynctestrenderer.cpp | 1 + .../renderers/glwaveformrendererfilteredsignal.cpp | 1 + src/waveform/renderers/glwaveformrendererrgb.cpp | 2 ++ src/waveform/renderers/glwaveformrenderersimplesignal.cpp | 2 ++ src/waveform/renderers/waveformrendererabstract.h | 15 +++++++++++++++ 6 files changed, 23 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/waveform/renderers/glslwaveformrenderersignal.cpp b/src/waveform/renderers/glslwaveformrenderersignal.cpp index bdab25207a..10e0ed82c1 100644 --- a/src/waveform/renderers/glslwaveformrenderersignal.cpp +++ b/src/waveform/renderers/glslwaveformrenderersignal.cpp @@ -254,10 +254,6 @@ void GLSLWaveformRendererSignal::slotWaveformUpdated() { } void GLSLWaveformRendererSignal::draw(QPainter* painter, QPaintEvent* /*event*/) { - if (!m_framebuffer || !m_framebuffer->isValid() || !m_shadersValid) { - return; - } - TrackPointer trackInfo = m_waveformRenderer->getTrackInfo(); if (!trackInfo) { return; @@ -278,6 +274,8 @@ void GLSLWaveformRendererSignal::draw(QPainter* painter, QPaintEvent* /*event*/) return; } + maybeInitializeGL(); + // save the GL state set for QPainter painter->beginNativePainting(); diff --git a/src/waveform/renderers/glvsynctestrenderer.cpp b/src/waveform/renderers/glvsynctestrenderer.cpp index cad6a2205d..6cbc85b454 100644 --- a/src/waveform/renderers/glvsynctestrenderer.cpp +++ b/src/waveform/renderers/glvsynctestrenderer.cpp @@ -26,6 +26,7 @@ inline void setPoint(QPointF& point, qreal x, qreal y) { } void GLVSyncTestRenderer::draw(QPainter* painter, QPaintEvent* /*event*/) { + maybeInitializeGL(); PerformanceTimer timer; //mixxx::Duration t5, t6, t7, t8, t9, t10, t11, t12, t13; diff --git a/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp b/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp index 9043ee5262..0ad618c0bd 100644 --- a/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp +++ b/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp @@ -23,6 +23,7 @@ void GLWaveformRendererFilteredSignal::onSetup(const QDomNode& /*node*/) { } void GLWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*event*/) { + maybeInitializeGL(); TrackPointer pTrack = m_waveformRenderer->getTrackInfo(); if (!pTrack) { diff --git a/src/waveform/renderers/glwaveformrendererrgb.cpp b/src/waveform/renderers/glwaveformrendererrgb.cpp index 50ac786781..708a139a43 100644 --- a/src/waveform/renderers/glwaveformrendererrgb.cpp +++ b/src/waveform/renderers/glwaveformrendererrgb.cpp @@ -25,6 +25,8 @@ void GLWaveformRendererRGB::onSetup(const QDomNode& /* node */) { } void GLWaveformRendererRGB::draw(QPainter* painter, QPaintEvent* /*event*/) { + maybeInitializeGL(); + TrackPointer pTrack = m_waveformRenderer->getTrackInfo(); if (!pTrack) { return; diff --git a/src/waveform/renderers/glwaveformrenderersimplesignal.cpp b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp index 56d9f5448e..041353ff7c 100644 --- a/src/waveform/renderers/glwaveformrenderersimplesignal.cpp +++ b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp @@ -25,6 +25,8 @@ inline void setPoint(QPointF& point, qreal x, qreal y) { } void GLWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*event*/) { + maybeInitializeGL(); + TrackPointer pTrack = m_waveformRenderer->getTrackInfo(); if (!pTrack) { return; diff --git a/src/waveform/renderers/waveformrendererabstract.h b/src/waveform/renderers/waveformrendererabstract.h index 6a1bba6f6d..9b7bcd692e 100644 --- a/src/waveform/renderers/waveformrendererabstract.h +++ b/src/waveform/renderers/waveformrendererabstract.h @@ -2,6 +2,7 @@ #define WAVEFORMRENDERERABSTRACT_H #include +#include #include #include #include @@ -58,6 +59,20 @@ class GLWaveformRenderer : protected QOpenGLFunctions_2_1 { virtual void onInitializeGL() { initializeOpenGLFunctions(); } + + protected: + // Somehow QGLWidget does not call QGLWidget::initializeGL on macOS, so hack around that + // by calling this in `draw` when the QGLContext has been made current. + // TODO: remove this when upgrading to QOpenGLWidget + void maybeInitializeGL() { + if (QGLContext::currentContext() != m_pLastContext) { + onInitializeGL(); + m_pLastContext = QGLContext::currentContext(); + } + } + + private: + const QGLContext* m_pLastContext; }; #endif // WAVEFORMRENDERERABSTRACT_H -- cgit v1.2.3