[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kde-workspace] kwin: rebase measuring to nano res + fix vsync padding
From:       Thomas_Lübking <thomas.luebking () gmail ! com>
Date:       2013-05-20 14:17:09
Message-ID: 20130520141709.489D4A6071 () git ! kde ! org
[Download RAW message or body]

Git commit c0388f4cce5a58e87267e96028b6a6650aaad6cb by Thomas Lübking.
Committed on 28/03/2013 at 21:53.
Pushed by luebking into branch 'master'.

rebase measuring to nano res + fix vsync padding

REVIEW: 109784

M  +15   -11   kwin/composite.cpp
M  +3    -2    kwin/composite.h
M  +4    -4    kwin/options.cpp
M  +11   -11   kwin/options.h
M  +1    -1    kwin/scene.h
M  +2    -2    kwin/scene_opengl.cpp
M  +3    -3    kwin/scene_opengl.h
M  +2    -2    kwin/scene_xrender.cpp
M  +1    -1    kwin/scene_xrender.h

http://commits.kde.org/kde-workspace/c0388f4cce5a58e87267e96028b6a6650aaad6cb

diff --git a/kwin/composite.cpp b/kwin/composite.cpp
index 2f18dba..4884a70 100644
--- a/kwin/composite.cpp
+++ b/kwin/composite.cpp
@@ -75,6 +75,9 @@ void CompositorSelectionOwner::looseOwnership()
 
 KWIN_SINGLETON_FACTORY_VARIABLE(Compositor, s_compositor)
 
+static inline qint64 milliToNano(int milli) { return milli * 1000 * 1000; }
+static inline qint64 nanoToMilli(int nano) { return nano / (1000*1000); }
+
 Compositor::Compositor(QObject* workspace)
     : QObject(workspace)
     , m_suspended(options->isUseCompositing() ? NoReasonSuspend : UserSuspend)
@@ -234,13 +237,13 @@ void Compositor::slotCompositingOptionsInitialized()
         return;
     }
     m_xrrRefreshRate = KWin::currentRefreshRate();
-    fpsInterval = (options->maxFpsInterval() << 10);
+    fpsInterval = options->maxFpsInterval();
     if (m_scene->syncsToVBlank()) {  // if we do vsync, set the fps to the next \
                multiple of the vblank rate
-        vBlankInterval = (1000 << 10) / m_xrrRefreshRate;
+        vBlankInterval = milliToNano(1000) / m_xrrRefreshRate;
         fpsInterval = qMax((fpsInterval / vBlankInterval) * vBlankInterval, \
vBlankInterval);  } else
-        vBlankInterval = 1 << 10; // no sync - DO NOT set "0", would cause \
                div-by-zero segfaults.
-    m_timeSinceLastVBlank = fpsInterval - 1; // means "start now" - we don't have \
even a slight idea when the first vsync will occur +        vBlankInterval = \
milliToNano(1); // no sync - DO NOT set "0", would cause div-by-zero segfaults. +    \
m_timeSinceLastVBlank = fpsInterval - (options->vBlankTime() + 1); // means "start \
now" - we don't have even a slight idea when the first vsync will occur  \
                scheduleRepaint();
     xcb_composite_redirect_subwindows(connection(), rootWindow(), \
                XCB_COMPOSITE_REDIRECT_MANUAL);
     new EffectsHandlerImpl(this, m_scene);   // sets also the 'effects' pointer
@@ -646,7 +649,7 @@ void Compositor::setCompositeTimer()
     if (!hasScene())  // should not really happen, but there may be e.g. some damage \
events still pending  return;
 
-    uint padding = m_timeSinceLastVBlank << 10;
+    uint waitTime = 1;
 
     if (m_scene->blocksForRetrace()) {
 
@@ -656,6 +659,7 @@ void Compositor::setCompositeTimer()
         // Now, my ooold 19" CRT can do such retrace so that 2ms are entirely \
sufficient,  // while another ooold 15" TFT requires about 6ms
 
+        qint64 padding = m_timeSinceLastVBlank;
         if (padding > fpsInterval) {
             // we're at low repaints or spent more time in painting than the user \
                wanted to wait for that frame
             padding = vBlankInterval - (padding%vBlankInterval); // -> align to next \
vblank @@ -665,19 +669,19 @@ void Compositor::setCompositeTimer()
         }
 
         if (padding < options->vBlankTime()) { // we'll likely miss this frame
-            m_nextFrameDelay = (padding + vBlankInterval) >> 10;
-            padding = (padding + vBlankInterval - options->vBlankTime()) >> 10; // \
so we add one +            m_nextFrameDelay = nanoToMilli(padding + vBlankInterval);
+            waitTime = nanoToMilli(padding + vBlankInterval - \
options->vBlankTime()); // so we add one  //             qDebug() << "WE LOST A \
FRAME";  } else {
-            m_nextFrameDelay = padding >> 10;
-            padding = (padding - options->vBlankTime()) >> 10;
+            m_nextFrameDelay = nanoToMilli(padding);
+            waitTime = nanoToMilli(padding - options->vBlankTime());
         }
     }
     else // w/o vsync we just jump to the next demanded tick
         // the "1" will ensure we don't block out the eventloop - the system's just \
                not faster
         // "0" would be sufficient, but the compositor isn't the WMs only task
-        m_nextFrameDelay = padding = (padding > fpsInterval) ? 1 : ((fpsInterval - \
                padding) >> 10);
-    compositeTimer.start(qMin(padding, 250u), this); // force 4fps minimum
+        m_nextFrameDelay = waitTime = (m_timeSinceLastVBlank > fpsInterval) ? 1 : \
nanoToMilli(fpsInterval - m_timeSinceLastVBlank); +    \
compositeTimer.start(qMin(waitTime, 250u), this); // force 4fps minimum  }
 
 bool Compositor::isActive()
diff --git a/kwin/composite.h b/kwin/composite.h
index 056f02c..c9ba1ef 100644
--- a/kwin/composite.h
+++ b/kwin/composite.h
@@ -296,7 +296,7 @@ private:
     QTimer m_releaseSelectionTimer;
     QList<xcb_atom_t> m_unusedSupportProperties;
     QTimer m_unusedSupportPropertyTimer;
-    uint vBlankInterval, fpsInterval;
+    qint64 vBlankInterval, fpsInterval;
     int m_xrrRefreshRate;
     QElapsedTimer nextPaintReference;
     QRegion repaints_region;
@@ -306,7 +306,8 @@ private:
     QTimer compositeResetTimer; // for compressing composite resets
     bool m_finishing; // finish() sets this variable while shutting down
     bool m_starting; // start() sets this variable while starting
-    int m_timeSinceLastVBlank, m_nextFrameDelay;
+    qint64 m_timeSinceLastVBlank;
+    int m_nextFrameDelay;
     Scene *m_scene;
 
     KWIN_SINGLETON_VARIABLE(Compositor, s_compositor)
diff --git a/kwin/options.cpp b/kwin/options.cpp
index 59fceb2..a2463ae 100644
--- a/kwin/options.cpp
+++ b/kwin/options.cpp
@@ -685,7 +685,7 @@ void Options::setXrenderSmoothScale(bool xrenderSmoothScale)
     emit xrenderSmoothScaleChanged();
 }
 
-void Options::setMaxFpsInterval(uint maxFpsInterval)
+void Options::setMaxFpsInterval(qint64 maxFpsInterval)
 {
     if (m_maxFpsInterval == maxFpsInterval) {
         return;
@@ -703,7 +703,7 @@ void Options::setRefreshRate(uint refreshRate)
     emit refreshRateChanged();
 }
 
-void Options::setVBlankTime(uint vBlankTime)
+void Options::setVBlankTime(qint64 vBlankTime)
 {
     if (m_vBlankTime == vBlankTime) {
         return;
@@ -839,9 +839,9 @@ unsigned long Options::loadConfig()
 
     // TODO: should they be moved into reloadCompositingSettings?
     config = KConfigGroup(_config, "Compositing");
-    setMaxFpsInterval(qRound(1000.0 / config.readEntry("MaxFPS", \
Options::defaultMaxFps()))); +    setMaxFpsInterval(1 * 1000 * 1000 * 1000 / \
                config.readEntry("MaxFPS", Options::defaultMaxFps()));
     setRefreshRate(config.readEntry("RefreshRate", Options::defaultRefreshRate()));
-    setVBlankTime(config.readEntry("VBlankTime", Options::defaultVBlankTime()));
+    setVBlankTime(config.readEntry("VBlankTime", Options::defaultVBlankTime()) * \
1000); // config in micro, value in nano resolution  
     return changed;
 }
diff --git a/kwin/options.h b/kwin/options.h
index 18dfa81..a2ddb90 100644
--- a/kwin/options.h
+++ b/kwin/options.h
@@ -168,9 +168,9 @@ class Options : public QObject, public KDecorationOptions
     Q_PROPERTY(int glSmoothScale READ glSmoothScale WRITE setGlSmoothScale NOTIFY \
                glSmoothScaleChanged)
     Q_PROPERTY(bool colorCorrected READ isColorCorrected WRITE setColorCorrected \
                NOTIFY colorCorrectedChanged)
     Q_PROPERTY(bool xrenderSmoothScale READ isXrenderSmoothScale WRITE \
                setXrenderSmoothScale NOTIFY xrenderSmoothScaleChanged)
-    Q_PROPERTY(uint maxFpsInterval READ maxFpsInterval WRITE setMaxFpsInterval \
NOTIFY maxFpsIntervalChanged) +    Q_PROPERTY(qint64 maxFpsInterval READ \
                maxFpsInterval WRITE setMaxFpsInterval NOTIFY maxFpsIntervalChanged)
     Q_PROPERTY(uint refreshRate READ refreshRate WRITE setRefreshRate NOTIFY \
                refreshRateChanged)
-    Q_PROPERTY(uint vBlankTime READ vBlankTime WRITE setVBlankTime NOTIFY \
vBlankTimeChanged) +    Q_PROPERTY(qint64 vBlankTime READ vBlankTime WRITE \
                setVBlankTime NOTIFY vBlankTimeChanged)
     Q_PROPERTY(bool glDirect READ isGlDirect WRITE setGlDirect NOTIFY \
                glDirectChanged)
     Q_PROPERTY(bool glStrictBinding READ isGlStrictBinding WRITE setGlStrictBinding \
NOTIFY glStrictBindingChanged)  /**
@@ -517,14 +517,14 @@ public:
         return m_xrenderSmoothScale;
     }
 
-    uint maxFpsInterval() const {
+    qint64 maxFpsInterval() const {
         return m_maxFpsInterval;
     }
     // Settings that should be auto-detected
     uint refreshRate() const {
         return m_refreshRate;
     }
-    uint vBlankTime() const {
+    qint64 vBlankTime() const {
         return m_vBlankTime;
     }
     bool isGlDirect() const {
@@ -600,9 +600,9 @@ public:
     void setUnredirectFullscreen(bool unredirectFullscreen);
     void setGlSmoothScale(int glSmoothScale);
     void setXrenderSmoothScale(bool xrenderSmoothScale);
-    void setMaxFpsInterval(uint maxFpsInterval);
+    void setMaxFpsInterval(qint64 maxFpsInterval);
     void setRefreshRate(uint refreshRate);
-    void setVBlankTime(uint vBlankTime);
+    void setVBlankTime(qint64 vBlankTime);
     void setGlDirect(bool glDirect);
     void setGlStrictBinding(bool glStrictBinding);
     void setGlStrictBindingFollowsDriver(bool glStrictBindingFollowsDriver);
@@ -689,8 +689,8 @@ public:
     static bool defaultXrenderSmoothScale() {
         return false;
     }
-    static uint defaultMaxFpsInterval() {
-        return qRound(1000.0/60.0);
+    static qint64 defaultMaxFpsInterval() {
+        return (1 * 1000 * 1000 * 1000) /60.0; // nanoseconds / Hz
     }
     static int defaultMaxFps() {
         return 60;
@@ -699,7 +699,7 @@ public:
         return 0;
     }
     static uint defaultVBlankTime() {
-        return 6144;
+        return 6000; // 6ms
     }
     static bool defaultGlDirect() {
         return true;
@@ -839,10 +839,10 @@ private:
     int m_glSmoothScale;
     bool m_colorCorrected;
     bool m_xrenderSmoothScale;
-    uint m_maxFpsInterval;
+    qint64 m_maxFpsInterval;
     // Settings that should be auto-detected
     uint m_refreshRate;
-    uint m_vBlankTime;
+    qint64 m_vBlankTime;
     bool m_glDirect;
     bool m_glStrictBinding;
     bool m_glStrictBindingFollowsDriver;
diff --git a/kwin/scene.h b/kwin/scene.h
index 2cfc565..254d6f9 100644
--- a/kwin/scene.h
+++ b/kwin/scene.h
@@ -60,7 +60,7 @@ public:
     // The entry point for the main part of the painting pass.
     // returns the time since the last vblank signal - if there's one
     // ie. "what of this frame is lost to painting"
-    virtual int paint(QRegion damage, ToplevelList windows) = 0;
+    virtual qint64 paint(QRegion damage, ToplevelList windows) = 0;
 
     // Notification function - KWin core informs about changes.
     // Used to mainly discard cached data.
diff --git a/kwin/scene_opengl.cpp b/kwin/scene_opengl.cpp
index 6b90576..8ea91aa 100644
--- a/kwin/scene_opengl.cpp
+++ b/kwin/scene_opengl.cpp
@@ -275,7 +275,7 @@ void SceneOpenGL::copyPixels(const QRegion &region)
 }
 #endif
 
-int SceneOpenGL::paint(QRegion damage, ToplevelList toplevels)
+qint64 SceneOpenGL::paint(QRegion damage, ToplevelList toplevels)
 {
     // actually paint the frame, flushed with the NEXT frame
     foreach (Toplevel * c, toplevels) {
@@ -753,7 +753,7 @@ SceneOpenGL1::~SceneOpenGL1()
 {
 }
 
-int SceneOpenGL1::paint(QRegion damage, ToplevelList windows)
+qint64 SceneOpenGL1::paint(QRegion damage, ToplevelList windows)
 {
     if (m_resetModelViewProjectionMatrix) {
         // reset model view projection matrix if required
diff --git a/kwin/scene_opengl.h b/kwin/scene_opengl.h
index d6a6580..439414b 100644
--- a/kwin/scene_opengl.h
+++ b/kwin/scene_opengl.h
@@ -46,7 +46,7 @@ public:
     virtual ~SceneOpenGL();
     virtual bool initFailed() const;
     virtual bool hasPendingFlush() const;
-    virtual int paint(QRegion damage, ToplevelList windows);
+    virtual qint64 paint(QRegion damage, ToplevelList windows);
     virtual void windowAdded(Toplevel*);
     virtual void windowDeleted(Deleted*);
     virtual void screenGeometryChanged(const QSize &size);
@@ -137,7 +137,7 @@ public:
     explicit SceneOpenGL1(OpenGLBackend *backend);
     virtual ~SceneOpenGL1();
     virtual void screenGeometryChanged(const QSize &size);
-    virtual int paint(QRegion damage, ToplevelList windows);
+    virtual qint64 paint(QRegion damage, ToplevelList windows);
     virtual CompositingType compositingType() const {
         return OpenGL1Compositing;
     }
@@ -428,7 +428,7 @@ public:
      * @see startRenderTimer
      **/
     qint64 renderTime() {
-        return m_renderTimer.elapsed();
+        return m_renderTimer.nsecsElapsed();
     }
     virtual void screenGeometryChanged(const QSize &size) = 0;
     virtual SceneOpenGL::TexturePrivate *createBackendTexture(SceneOpenGL::Texture \
                *texture) = 0;
diff --git a/kwin/scene_xrender.cpp b/kwin/scene_xrender.cpp
index 702854c..72086f0 100644
--- a/kwin/scene_xrender.cpp
+++ b/kwin/scene_xrender.cpp
@@ -175,7 +175,7 @@ void SceneXrender::createBuffer()
 }
 
 // the entry point for painting
-int SceneXrender::paint(QRegion damage, ToplevelList toplevels)
+qint64 SceneXrender::paint(QRegion damage, ToplevelList toplevels)
 {
     QElapsedTimer renderTimer;
     renderTimer.start();
@@ -195,7 +195,7 @@ int SceneXrender::paint(QRegion damage, ToplevelList toplevels)
     // do cleanup
     stacking_order.clear();
 
-    return renderTimer.elapsed();
+    return renderTimer.nsecsElapsed();
 }
 
 void SceneXrender::present(int mask, QRegion damage)
diff --git a/kwin/scene_xrender.h b/kwin/scene_xrender.h
index 96cd8e3..e31b136 100644
--- a/kwin/scene_xrender.h
+++ b/kwin/scene_xrender.h
@@ -42,7 +42,7 @@ public:
     virtual CompositingType compositingType() const {
         return XRenderCompositing;
     }
-    virtual int paint(QRegion damage, ToplevelList windows);
+    virtual qint64 paint(QRegion damage, ToplevelList windows);
     virtual void windowAdded(Toplevel*);
     virtual void windowDeleted(Deleted*);
     virtual void screenGeometryChanged(const QSize &size);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic