From b8837b66f345ee7030c1b01a70efb115d6b1b1df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Mon, 22 Sep 2014 09:59:58 +0200 Subject: [PATCH] ShmPool returns QWeakPointer instead of Buffer* Requires effad12d8b1169d9ffe851fc3f0143eeb8deb10d in kwayland. --- scene_qpainter.cpp | 32 +++++++++++++++++++------------- scene_qpainter.h | 2 +- tests/waylandclienttest.cpp | 2 +- wayland_backend.cpp | 2 +- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/scene_qpainter.cpp b/scene_qpainter.cpp index c458e24aa5..69a2bd6c64 100644 --- a/scene_qpainter.cpp +++ b/scene_qpainter.cpp @@ -82,7 +82,7 @@ WaylandQPainterBackend::WaylandQPainterBackend() : QPainterBackend() , m_needsFullRepaint(true) , m_backBuffer(QImage(QSize(), QImage::Format_RGB32)) - , m_buffer(NULL) + , m_buffer() { connect(Wayland::WaylandBackend::self()->shmPool(), SIGNAL(poolResized()), SLOT(remapBuffer())); connect(Wayland::WaylandBackend::self(), &Wayland::WaylandBackend::shellSurfaceSizeChanged, @@ -94,7 +94,7 @@ WaylandQPainterBackend::WaylandQPainterBackend() WaylandQPainterBackend::~WaylandQPainterBackend() { if (m_buffer) { - m_buffer->setUsed(false); + m_buffer.toStrongRef()->setUsed(false); } } @@ -112,7 +112,7 @@ void WaylandQPainterBackend::present(int mask, const QRegion &damage) Compositor::self()->aboutToSwapBuffers(); m_needsFullRepaint = false; auto s = Wayland::WaylandBackend::self()->surface(); - s->attachBuffer(m_buffer->buffer()); + s->attachBuffer(m_buffer); s->damage(damage); s->commit(); } @@ -123,8 +123,8 @@ void WaylandQPainterBackend::screenGeometryChanged(const QSize &size) if (!m_buffer) { return; } - m_buffer->setUsed(false); - m_buffer = NULL; + m_buffer.toStrongRef()->setUsed(false); + m_buffer.clear(); } QImage *WaylandQPainterBackend::buffer() @@ -135,16 +135,17 @@ QImage *WaylandQPainterBackend::buffer() void WaylandQPainterBackend::prepareRenderingFrame() { if (m_buffer) { - if (m_buffer->isReleased()) { + auto b = m_buffer.toStrongRef(); + if (b->isReleased()) { // we can re-use this buffer - m_buffer->setReleased(false); + b->setReleased(false); return; } else { // buffer is still in use, get a new one - m_buffer->setUsed(false); + b->setUsed(false); } } - m_buffer = NULL; + m_buffer.clear(); const QSize size(Wayland::WaylandBackend::self()->shellSurfaceSize()); m_buffer = Wayland::WaylandBackend::self()->shmPool()->getBuffer(size, size.width() * 4); if (!m_buffer) { @@ -152,8 +153,9 @@ void WaylandQPainterBackend::prepareRenderingFrame() m_backBuffer = QImage(); return; } - m_buffer->setUsed(true); - m_backBuffer = QImage(m_buffer->address(), size.width(), size.height(), QImage::Format_RGB32); + auto b = m_buffer.toStrongRef(); + b->setUsed(true); + m_backBuffer = QImage(b->address(), size.width(), size.height(), QImage::Format_RGB32); m_backBuffer.fill(Qt::transparent); m_needsFullRepaint = true; qDebug() << "Created a new back buffer"; @@ -161,11 +163,15 @@ void WaylandQPainterBackend::prepareRenderingFrame() void WaylandQPainterBackend::remapBuffer() { - if (!m_buffer || !m_buffer->isUsed()) { + if (!m_buffer) { + return; + } + auto b = m_buffer.toStrongRef(); + if (!b->isUsed()){ return; } const QSize size = m_backBuffer.size(); - m_backBuffer = QImage(m_buffer->address(), size.width(), size.height(), QImage::Format_RGB32); + m_backBuffer = QImage(b->address(), size.width(), size.height(), QImage::Format_RGB32); qDebug() << "Remapped our back buffer"; } diff --git a/scene_qpainter.h b/scene_qpainter.h index ff7f8d579a..0871cbeadb 100644 --- a/scene_qpainter.h +++ b/scene_qpainter.h @@ -121,7 +121,7 @@ private Q_SLOTS: private: bool m_needsFullRepaint; QImage m_backBuffer; - KWayland::Client::Buffer *m_buffer; + QWeakPointer m_buffer; }; #endif diff --git a/tests/waylandclienttest.cpp b/tests/waylandclienttest.cpp index e58662a27c..ce4ee479a5 100644 --- a/tests/waylandclienttest.cpp +++ b/tests/waylandclienttest.cpp @@ -211,7 +211,7 @@ void WaylandClientTest::render() if (!m_shm || !m_surface || !m_surface->isValid() || !m_currentSize.isValid()) { return; } - Buffer *buffer = m_shm->getBuffer(m_currentSize, m_currentSize.width() * 4); + auto buffer = m_shm->getBuffer(m_currentSize, m_currentSize.width() * 4).toStrongRef(); buffer->setUsed(true); QImage image(buffer->address(), m_currentSize.width(), m_currentSize.height(), QImage::Format_ARGB32_Premultiplied); image.fill(s_colors[s_colorIndex]); diff --git a/wayland_backend.cpp b/wayland_backend.cpp index 4b0a615752..bfba07a67a 100644 --- a/wayland_backend.cpp +++ b/wayland_backend.cpp @@ -130,7 +130,7 @@ void X11CursorTracker::cursorChanged(uint32_t serial) void X11CursorTracker::installCursor(const CursorData& cursor) { const QImage &cursorImage = cursor.cursor(); - auto buffer = m_backend->shmPool()->createBuffer(cursorImage); + auto buffer = m_backend->shmPool()->createBuffer(cursorImage).toStrongRef(); if (!buffer) { return; }