summaryrefslogtreecommitdiff
path: root/src/client/qwaylandbuffer_p.h
diff options
context:
space:
mode:
authorGiulio Camuffo <giuliocamuffo@gmail.com>2015-12-11 22:27:49 +0200
committerGiulio Camuffo <giulio.camuffo@kdab.com>2016-03-07 07:44:21 +0000
commit19260d9846861212881e374229798b3863d1a78d (patch)
tree60dba342d1770f3a7bbf00da28727675d25c6c4f /src/client/qwaylandbuffer_p.h
parentd316b798b33178203bc18bbec06b87a358a50167 (diff)
downloadqtwayland-19260d9846861212881e374229798b3863d1a78d.tar.gz
Fix SHM drawing logic
The old logic didn't care to listen for wl_buffer.release events so it always drew in the same buffer, potentially resulting in tearing if the compositor was scanning out the buffer at the same time. Instead properly cycle between a few buffers and don't reuse the same one until the release event was received. The old code also used to throttle the redraws, unless the buffer was changing, that is unless the window was getting resized. This is now lost, and no throttling is ever done. Doing it properly, by waiting for the frame callback before committing the new buffer shows very noticeable lags with many applications when resizing, because they paint many times per resize event, so they fall behind the cursor. A proper fix will be to implement the support for requestUpdate(), and using it in the applications. Change-Id: I02732c34769a5c75a6ad68c095bae916e4b274d3 Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
Diffstat (limited to 'src/client/qwaylandbuffer_p.h')
-rw-r--r--src/client/qwaylandbuffer_p.h18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/client/qwaylandbuffer_p.h b/src/client/qwaylandbuffer_p.h
index 6f8f7b26..7db6cfef 100644
--- a/src/client/qwaylandbuffer_p.h
+++ b/src/client/qwaylandbuffer_p.h
@@ -59,17 +59,25 @@ namespace QtWaylandClient {
class Q_WAYLAND_CLIENT_EXPORT QWaylandBuffer {
public:
- QWaylandBuffer()
- : mBuffer(0)
- {
- }
- virtual ~QWaylandBuffer() { }
+ QWaylandBuffer();
+ virtual ~QWaylandBuffer();
+ void init(wl_buffer *buf);
+
wl_buffer *buffer() {return mBuffer;}
virtual QSize size() const = 0;
virtual int scale() const { return 1; }
+ void setBusy() { mBusy = true; }
+ bool busy() const { return mBusy; }
+
protected:
struct wl_buffer *mBuffer;
+
+private:
+ bool mBusy;
+
+ static void release(void *data, wl_buffer *);
+ static const wl_buffer_listener listener;
};
}