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>
This commit is contained in:
David Edmundson 2017-10-18 20:41:50 +02:00
parent 6cf44bf690
commit 1fbffb9dfb
2 changed files with 4 additions and 4 deletions

View File

@ -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 = {

View File

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