summaryrefslogtreecommitdiffstats
path: root/src/client/qwaylandbuffer.cpp
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.cpp
parentd316b798b33178203bc18bbec06b87a358a50167 (diff)
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.cpp')
-rw-r--r--src/client/qwaylandbuffer.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/client/qwaylandbuffer.cpp b/src/client/qwaylandbuffer.cpp
new file mode 100644
index 000000000..c6aace2c7
--- /dev/null
+++ b/src/client/qwaylandbuffer.cpp
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Copyright (C) 2015 Giulio Camuffo.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandbuffer_p.h"
+
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtWaylandClient {
+
+QWaylandBuffer::QWaylandBuffer()
+ : mBuffer(0)
+ , mBusy(false)
+{
+}
+
+QWaylandBuffer::~QWaylandBuffer()
+{
+ if (mBuffer)
+ wl_buffer_destroy(mBuffer);
+}
+
+void QWaylandBuffer::init(wl_buffer *buf)
+{
+ mBuffer = buf;
+ wl_buffer_add_listener(buf, &listener, this);
+}
+
+void QWaylandBuffer::release(void *data, wl_buffer *)
+{
+ static_cast<QWaylandBuffer *>(data)->mBusy = false;
+}
+
+const wl_buffer_listener QWaylandBuffer::listener = {
+ QWaylandBuffer::release
+};
+
+}
+
+QT_END_NAMESPACE