From 043b37c51da160e21a973a0066b55b93655cb4da Mon Sep 17 00:00:00 2001 From: Vicki Pfau <vi@endrift.com> Date: Thu, 8 Apr 2021 18:41:53 -0700 Subject: [PATCH] Qt: Fix crash when switching from high-resolution OpenGL renderer to software --- CHANGES | 1 + src/platform/qt/DisplayGL.cpp | 7 ++++--- src/platform/qt/DisplayGL.h | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 775826662..753dc555e 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,7 @@ Other fixes: - GBA e-Reader: Fix bitmap short strip scanning - GBA Video: Fix mode 5 frame 1 caching (fixes mgba.io/i/2075) - GBA Video: Don't attempt to copy invalid registers when switching renderer + - Qt: Fix crash when switching from high-resolution OpenGL renderer to software Misc: - Core: Truncate preloading ROMs that slightly exceed max size (fixes mgba.io/i/2093) - GBA: Default-enable VBA bug compat for Ruby and Emerald ROM hacks diff --git a/src/platform/qt/DisplayGL.cpp b/src/platform/qt/DisplayGL.cpp index 2838992f9..c30cba9f5 100644 --- a/src/platform/qt/DisplayGL.cpp +++ b/src/platform/qt/DisplayGL.cpp @@ -368,6 +368,10 @@ void PainterGL::resizeContext() { m_interrupter.resume(); QSize size = m_context->screenDimensions(); + if (m_dims == size) { + return; + } + dequeueAll(); m_backend->setDimensions(m_backend, size.width(), size.height()); } @@ -560,9 +564,6 @@ void PainterGL::dequeueAll() { m_free.append(buffer); } } - if (buffer) { - m_backend->postFrame(m_backend, buffer); - } if (m_buffer) { m_free.append(m_buffer); m_buffer = nullptr; diff --git a/src/platform/qt/DisplayGL.h b/src/platform/qt/DisplayGL.h index a9ec10945..111f0cc88 100644 --- a/src/platform/qt/DisplayGL.h +++ b/src/platform/qt/DisplayGL.h @@ -142,7 +142,7 @@ private: QList<uint32_t*> m_free; QQueue<uint32_t*> m_queue; QAtomicInt m_lagging = 0; - uint32_t* m_buffer; + uint32_t* m_buffer = nullptr; QPainter m_painter; QMutex m_mutex; QWindow* m_surface; @@ -158,6 +158,7 @@ private: VideoShader m_shader{}; VideoBackend* m_backend = nullptr; QSize m_size; + QSize m_dims; MessagePainter* m_messagePainter = nullptr; QElapsedTimer m_delayTimer; std::shared_ptr<VideoProxy> m_videoProxy;