all repos — mgba @ 4fc42a02ca14be6a1d291ad596511e580fcee862

mGBA Game Boy Advance Emulator

Qt: Defer texture updates until frame is drawn (fixes #1590)
Vicki Pfau vi@endrift.com
Sat, 22 Feb 2020 02:05:44 +0000
commit

4fc42a02ca14be6a1d291ad596511e580fcee862

parent

c8d1695c54447d728e8beabddf6c11c9fd824a97

3 files changed, 18 insertions(+), 3 deletions(-)

jump to
M CHANGESCHANGES

@@ -4,6 +4,7 @@ - Core: Fix ELF loading regression (fixes mgba.io/i/1669)

- Core: Fix crash modifying hash table entry (fixes mgba.io/i/1673) Misc: - Qt: Disable Replace ROM option when no game loaded + - Qt: Defer texture updates until frame is drawn (fixes mgba.io/i/1590) 0.8.1: (2020-02-16) Emulation fixes:
M src/platform/qt/DisplayGL.cppsrc/platform/qt/DisplayGL.cpp

@@ -318,7 +318,7 @@ m_backend->filter = false;

m_backend->lockAspectRatio = false; m_backend->interframeBlending = false; - for (int i = 0; i < 2; ++i) { + for (int i = 0; i < 3; ++i) { m_free.append(new uint32_t[1024 * 2048]); } }

@@ -414,6 +414,7 @@ mGLES2ShaderAttach(reinterpret_cast<mGLES2Context*>(m_backend), static_cast<mGLES2Shader*>(m_shader.passes), m_shader.nPasses);

} #endif + m_buffer = nullptr; m_active = true; m_started = true; }

@@ -481,6 +482,11 @@ void PainterGL::performDraw() {

m_painter.beginNativePainting(); float r = m_surface->devicePixelRatio(); m_backend->resized(m_backend, m_size.width() * r, m_size.height() * r); + if (m_buffer) { + m_backend->postFrame(m_backend, m_buffer); + m_free.append(m_buffer); + m_buffer = nullptr; + } m_backend->drawFrame(m_backend); m_painter.endNativePainting(); if (m_showOSD && m_messagePainter) {

@@ -511,9 +517,12 @@ m_mutex.unlock();

return; } uint32_t* buffer = m_queue.dequeue(); + if (m_buffer) { + m_free.append(m_buffer); + m_buffer = nullptr; + } if (buffer) { - m_backend->postFrame(m_backend, buffer); - m_free.append(buffer); + m_buffer = buffer; } m_mutex.unlock(); }

@@ -529,6 +538,10 @@ }

} if (buffer) { m_backend->postFrame(m_backend, buffer); + } + if (m_buffer) { + m_free.append(m_buffer); + m_buffer = nullptr; } m_mutex.unlock(); }
M src/platform/qt/DisplayGL.hsrc/platform/qt/DisplayGL.h

@@ -121,6 +121,7 @@ void dequeueAll();

QList<uint32_t*> m_free; QQueue<uint32_t*> m_queue; + uint32_t* m_buffer; QPainter m_painter; QMutex m_mutex; QWindow* m_surface;