ShmPool returns QWeakPointer<Buffer> instead of Buffer*

Requires effad12d8b1169d9ffe851fc3f0143eeb8deb10d in kwayland.
This commit is contained in:
Martin Gräßlin 2014-09-22 09:59:58 +02:00
parent 08540b45eb
commit b8837b66f3
4 changed files with 22 additions and 16 deletions

View file

@ -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";
}

View file

@ -121,7 +121,7 @@ private Q_SLOTS:
private:
bool m_needsFullRepaint;
QImage m_backBuffer;
KWayland::Client::Buffer *m_buffer;
QWeakPointer<KWayland::Client::Buffer> m_buffer;
};
#endif

View file

@ -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]);

View file

@ -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;
}