summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Edmundson <davidedmundson@kde.org>2017-10-18 20:41:50 +0200
committerDavid Edmundson <davidedmundson@kde.org>2017-10-23 08:13:55 +0000
commit5f38652cd52c03e9df8600f5f41e044820c3062c (patch)
treef9e96378df5abb4ca57f0dc6a01c47a9177324f6
parente77a47915c8838abc4750241c116694d397f3919 (diff)
Ref count buffer usage
The QPlatformBackingStore can get flushed multiple times between paints. Flush sets the front buffer, but it does not create a new backbuffer. We can't do so without doing an expensive pre-emptive copy. This means we send the same front buffer multiple times. This is somewhat questionable with regards to the Wayland specification, but seems to work. If we do send a buffer multiple times we can't consider it free until the last attached buffer is released; otherwise we end up painting into a buffer whilst the server is still using it, leading to flickering. Change-Id: I8235eed6a85f0d52b37544e7bcb623b16a9dd832 Reviewed-by: Marco Martin <mart@kde.org> Reviewed-by: Johan Helsing <johan.helsing@qt.io>
-rw-r--r--src/client/qwaylandbuffer.cpp2
-rw-r--r--src/client/qwaylandbuffer_p.h6
2 files changed, 4 insertions, 4 deletions
diff --git a/src/client/qwaylandbuffer.cpp b/src/client/qwaylandbuffer.cpp
index a0fcc532f..076a0d57d 100644
--- a/src/client/qwaylandbuffer.cpp
+++ b/src/client/qwaylandbuffer.cpp
@@ -66,7 +66,7 @@ void QWaylandBuffer::init(wl_buffer *buf)
void QWaylandBuffer::release(void *data, wl_buffer *)
{
- static_cast<QWaylandBuffer *>(data)->mBusy = false;
+ static_cast<QWaylandBuffer *>(data)->mBusy--;
}
const wl_buffer_listener QWaylandBuffer::listener = {
diff --git a/src/client/qwaylandbuffer_p.h b/src/client/qwaylandbuffer_p.h
index 9e8cba2e4..b3513d151 100644
--- a/src/client/qwaylandbuffer_p.h
+++ b/src/client/qwaylandbuffer_p.h
@@ -73,14 +73,14 @@ public:
virtual QSize size() const = 0;
virtual int scale() const { return 1; }
- void setBusy() { mBusy = true; }
- bool busy() const { return mBusy; }
+ void setBusy() { mBusy++; }
+ bool busy() const { return mBusy > 0; }
protected:
struct wl_buffer *mBuffer;
private:
- bool mBusy;
+ int mBusy;
static void release(void *data, wl_buffer *);
static const wl_buffer_listener listener;