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:
parent
6cf44bf690
commit
1fbffb9dfb
@ -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 = {
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user