[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 ®ion)
}
#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