From f480bfbd2436727f5b4acf34af43184c4029a5e3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=B8rgen=20Lind?= Date: Wed, 23 Mar 2011 09:04:40 +0100 Subject: [PATCH] Lighthouse: Wayland: Move the frame throttling into the platform window This is only for the shm case --- src/plugins/platforms/wayland/qwaylandshmsurface.cpp | 19 ++++--------------- src/plugins/platforms/wayland/qwaylandshmwindow.cpp | 19 ++++++++++++++++--- src/plugins/platforms/wayland/qwaylandshmwindow.h | 5 ++++- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp index 54da9a1..cc6b2a1 100644 --- a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp @@ -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(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(data); - self->mWaitingForFrameSync = false; -} - void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) { Q_UNUSED(widget); Q_UNUSED(offset); QWaylandShmWindow *waylandWindow = static_cast(window()->platformWindow()); Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm); - - QVector 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) diff --git a/src/plugins/platforms/wayland/qwaylandshmwindow.cpp b/src/plugins/platforms/wayland/qwaylandshmwindow.cpp index cafd2d0..d7c44a4 100644 --- a/src/plugins/platforms/wayland/qwaylandshmwindow.cpp +++ b/src/plugins/platforms/wayland/qwaylandshmwindow.cpp @@ -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 ®ion) { - wl_surface_damage(mSurface, - rect.x(), rect.y(), rect.width(), rect.height()); + QVector 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(data); + self->mWaitingForFrameSync = false; +} diff --git a/src/plugins/platforms/wayland/qwaylandshmwindow.h b/src/plugins/platforms/wayland/qwaylandshmwindow.h index 14a29d2..669533c 100644 --- a/src/plugins/platforms/wayland/qwaylandshmwindow.h +++ b/src/plugins/platforms/wayland/qwaylandshmwindow.h @@ -53,11 +53,14 @@ public: WindowType windowType() const; QPlatformGLContext *glContext() const; void attach(QWaylandBuffer *buffer); - void damage(const QRect &rect); + void damage(const QRegion ®ion); + bool waitingForFrameSync() const { return mWaitingForFrameSync; } protected: void newSurfaceCreated(); private: + static void frameCallback(void *data, uint32_t time); QWaylandBuffer *mBuffer; + bool mWaitingForFrameSync; }; #endif // QWAYLANDSHMWINDOW_H -- 2.7.4