Qt: Attempt to fix DisplayGL crash

This commit is contained in:
Vicki Pfau 2020-07-31 01:33:47 -07:00
parent 8fabac962e
commit 6d40d174a8
2 changed files with 8 additions and 12 deletions

View File

@ -25,6 +25,7 @@ Other fixes:
- Qt: Fix file handle leak on opening an invalid ROM - Qt: Fix file handle leak on opening an invalid ROM
- Qt: Fix Italian RTC translation (fixes mgba.io/i/1798) - Qt: Fix Italian RTC translation (fixes mgba.io/i/1798)
- Qt: Add missing option for Wisdom Tree in overrides list - Qt: Add missing option for Wisdom Tree in overrides list
- Qt: Fix stability regression on AMD drivers (fixes mgba.io/i/1791)
- Util: Fix crash if PNG header fails to write - Util: Fix crash if PNG header fails to write
- Wii: Fix pixelated filtering on interframe blending (fixes mgba.io/i/1830) - Wii: Fix pixelated filtering on interframe blending (fixes mgba.io/i/1830)
Misc: Misc:

View File

@ -484,8 +484,6 @@ void PainterGL::performDraw() {
m_backend->resized(m_backend, m_size.width() * r, m_size.height() * r); m_backend->resized(m_backend, m_size.width() * r, m_size.height() * r);
if (m_buffer) { if (m_buffer) {
m_backend->postFrame(m_backend, m_buffer); m_backend->postFrame(m_backend, m_buffer);
m_free.append(m_buffer);
m_buffer = nullptr;
} }
m_backend->drawFrame(m_backend); m_backend->drawFrame(m_backend);
m_painter.endNativePainting(); m_painter.endNativePainting();
@ -495,7 +493,7 @@ void PainterGL::performDraw() {
} }
void PainterGL::enqueue(const uint32_t* backing) { void PainterGL::enqueue(const uint32_t* backing) {
m_mutex.lock(); QMutexLocker locker(&m_mutex);
uint32_t* buffer = nullptr; uint32_t* buffer = nullptr;
if (backing) { if (backing) {
if (m_free.isEmpty()) { if (m_free.isEmpty()) {
@ -503,17 +501,17 @@ void PainterGL::enqueue(const uint32_t* backing) {
} else { } else {
buffer = m_free.takeLast(); buffer = m_free.takeLast();
} }
QSize size = m_context->screenDimensions(); if (buffer) {
memcpy(buffer, backing, size.width() * size.height() * BYTES_PER_PIXEL); QSize size = m_context->screenDimensions();
memcpy(buffer, backing, size.width() * size.height() * BYTES_PER_PIXEL);
}
} }
m_queue.enqueue(buffer); m_queue.enqueue(buffer);
m_mutex.unlock();
} }
void PainterGL::dequeue() { void PainterGL::dequeue() {
m_mutex.lock(); QMutexLocker locker(&m_mutex);
if (m_queue.isEmpty()) { if (m_queue.isEmpty()) {
m_mutex.unlock();
return; return;
} }
uint32_t* buffer = m_queue.dequeue(); uint32_t* buffer = m_queue.dequeue();
@ -521,10 +519,7 @@ void PainterGL::dequeue() {
m_free.append(m_buffer); m_free.append(m_buffer);
m_buffer = nullptr; m_buffer = nullptr;
} }
if (buffer) { m_buffer = buffer;
m_buffer = buffer;
}
m_mutex.unlock();
} }
void PainterGL::dequeueAll() { void PainterGL::dequeueAll() {