summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/compositor/compositor_api/qwaylandview.cpp22
-rw-r--r--src/compositor/compositor_api/qwaylandview.h5
-rw-r--r--src/compositor/compositor_api/qwaylandview_p.h2
3 files changed, 29 insertions, 0 deletions
diff --git a/src/compositor/compositor_api/qwaylandview.cpp b/src/compositor/compositor_api/qwaylandview.cpp
index 636937abb..8707b22d3 100644
--- a/src/compositor/compositor_api/qwaylandview.cpp
+++ b/src/compositor/compositor_api/qwaylandview.cpp
@@ -162,6 +162,13 @@ bool QWaylandView::advance()
if (d->bufferLock)
return false;
+ if (d->surface && d->surface->throttlingView() == this) {
+ Q_FOREACH (QWaylandView *view, d->surface->views()) {
+ if (view != this && view->discardFrontBuffers() && view->d_func()->currentBuffer == d->currentBuffer)
+ view->discardCurrentBuffer();
+ }
+ }
+
QMutexLocker locker(&d->bufferMutex);
d->forceAdvanceSucceed = false;
d->currentBuffer = d->nextBuffer;
@@ -203,6 +210,21 @@ void QWaylandView::setBufferLock(bool locked)
d->bufferLock = locked;
}
+bool QWaylandView::discardFrontBuffers() const
+{
+ Q_D(const QWaylandView);
+ return d->discardFrontBuffers;
+}
+
+void QWaylandView::setDiscardFrontBuffers(bool discard)
+{
+ Q_D(QWaylandView);
+ if (d->discardFrontBuffers == discard)
+ return;
+ d->discardFrontBuffers = discard;
+ emit discardFrontBuffersChanged();
+}
+
struct wl_resource *QWaylandView::surfaceResource() const
{
Q_D(const QWaylandView);
diff --git a/src/compositor/compositor_api/qwaylandview.h b/src/compositor/compositor_api/qwaylandview.h
index 7eba0c809..5a820fb50 100644
--- a/src/compositor/compositor_api/qwaylandview.h
+++ b/src/compositor/compositor_api/qwaylandview.h
@@ -57,6 +57,7 @@ class Q_COMPOSITOR_EXPORT QWaylandView : public QObject
Q_PROPERTY(QWaylandSurface *surface READ surface WRITE setSurface NOTIFY surfaceChanged)
Q_PROPERTY(QWaylandOutput *output READ output WRITE setOutput NOTIFY outputChanged)
Q_PROPERTY(bool bufferLock READ isBufferLocked WRITE setBufferLock NOTIFY bufferLockChanged)
+ Q_PROPERTY(bool discardFrontBuffers READ discardFrontBuffers WRITE setDiscardFrontBuffers NOTIFY discardFrontBuffersChanged)
public:
QWaylandView(QObject *renderObject = 0, QObject *parent = 0);
virtual ~QWaylandView();
@@ -78,6 +79,9 @@ public:
bool isBufferLocked() const;
void setBufferLock(bool locked);
+ bool discardFrontBuffers() const;
+ void setDiscardFrontBuffers(bool discard);
+
struct wl_resource *surfaceResource() const;
Q_SIGNALS:
@@ -85,6 +89,7 @@ Q_SIGNALS:
void surfaceDestroyed();
void outputChanged();
void bufferLockChanged();
+ void discardFrontBuffersChanged();
};
QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandview_p.h b/src/compositor/compositor_api/qwaylandview_p.h
index a4a75a6cb..1b5fc53e8 100644
--- a/src/compositor/compositor_api/qwaylandview_p.h
+++ b/src/compositor/compositor_api/qwaylandview_p.h
@@ -61,6 +61,7 @@ public:
, bufferLock(false)
, broadcastRequestedPositionChanged(false)
, forceAdvanceSucceed(false)
+ , discardFrontBuffers(false)
{ }
void markSurfaceAsDestroyed(QWaylandSurface *surface);
@@ -77,6 +78,7 @@ public:
bool bufferLock;
bool broadcastRequestedPositionChanged;
bool forceAdvanceSucceed;
+ bool discardFrontBuffers;
};
QT_END_NAMESPACE