Lighthouse: Wayland: Move the frame throttling into the platform window
authorJørgen Lind <jorgen.lind@nokia.com>
Wed, 23 Mar 2011 08:04:40 +0000 (09:04 +0100)
committerJørgen Lind <jorgen.lind@nokia.com>
Wed, 23 Mar 2011 16:00:22 +0000 (17:00 +0100)
This is only for the shm case

src/plugins/platforms/wayland/qwaylandshmsurface.cpp
src/plugins/platforms/wayland/qwaylandshmwindow.cpp
src/plugins/platforms/wayland/qwaylandshmwindow.h

index 54da9a1..cc6b2a1 100644 (file)
@@ -95,7 +95,6 @@ QWaylandShmWindowSurface::QWaylandShmWindowSurface(QWidget *window)
     : QWindowSurface(window)
     , mBuffer(0)
     , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display())
-    , mWaitingForFrameSync(false)
 {
 }
 
@@ -110,30 +109,20 @@ QPaintDevice *QWaylandShmWindowSurface::paintDevice()
 
 void QWaylandShmWindowSurface::beginPaint(const QRegion &)
 {
-    while (mWaitingForFrameSync) {
+    QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow());
+    Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm);
+    while (waylandWindow->waitingForFrameSync()) {
         mDisplay->iterate();
     }
 }
 
-void QWaylandShmWindowSurface::frameCallback(void *data, uint32_t time)
-{
-    QWaylandShmWindowSurface *self = static_cast<QWaylandShmWindowSurface*>(data);
-    self->mWaitingForFrameSync = false;
-}
-
 void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
 {
     Q_UNUSED(widget);
     Q_UNUSED(offset);
     QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow());
     Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm);
-
-    QVector<QRect> rects = region.rects();
-    for (int i = 0; i < rects.size(); i++) {
-        waylandWindow->damage(rects.at(i));
-    }
-    mWaitingForFrameSync = true;
-    mDisplay->frameCallback(QWaylandShmWindowSurface::frameCallback, this);
+    waylandWindow->damage(region);
 }
 
 void QWaylandShmWindowSurface::resize(const QSize &size)
index cafd2d0..d7c44a4 100644 (file)
@@ -46,6 +46,7 @@
 QWaylandShmWindow::QWaylandShmWindow(QWidget *widget)
     : QWaylandWindow(widget)
     , mBuffer(0)
+    , mWaitingForFrameSync(false)
 {
     newSurfaceCreated();
 }
@@ -75,10 +76,16 @@ void QWaylandShmWindow::attach(QWaylandBuffer *buffer)
 }
 
 
-void QWaylandShmWindow::damage(const QRect &rect)
+void QWaylandShmWindow::damage(const QRegion &region)
 {
-    wl_surface_damage(mSurface,
-                      rect.x(), rect.y(), rect.width(), rect.height());
+    QVector<QRect> rects = region.rects();
+    for (int i = 0; i < rects.size(); i++) {
+        const QRect rect = rects.at(i);
+        wl_surface_damage(mSurface,
+                          rect.x(), rect.y(), rect.width(), rect.height());
+    }
+    mWaitingForFrameSync = true;
+    mDisplay->frameCallback(QWaylandShmWindow::frameCallback, this);
 }
 
 void QWaylandShmWindow::newSurfaceCreated()
@@ -87,3 +94,9 @@ void QWaylandShmWindow::newSurfaceCreated()
         wl_surface_attach(mSurface,mBuffer->buffer(),0,0);
     }
 }
+
+void QWaylandShmWindow::frameCallback(void *data, uint32_t time)
+{
+    QWaylandShmWindow *self = static_cast<QWaylandShmWindow*>(data);
+    self->mWaitingForFrameSync = false;
+}
index 14a29d2..669533c 100644 (file)
@@ -53,11 +53,14 @@ public:
     WindowType windowType() const;
     QPlatformGLContext *glContext() const;
     void attach(QWaylandBuffer *buffer);
-    void damage(const QRect &rect);
+    void damage(const QRegion &region);
+    bool waitingForFrameSync() const { return mWaitingForFrameSync; }
 protected:
     void newSurfaceCreated();
 private:
+    static void frameCallback(void *data, uint32_t time);
     QWaylandBuffer *mBuffer;
+    bool mWaitingForFrameSync;
 };
 
 #endif // QWAYLANDSHMWINDOW_H