summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2020-03-18 11:33:33 +0200
committerKaj Grönholm <kaj.gronholm@qt.io>2020-04-16 10:10:15 +0200
commit498651519a84647a6414558c492d5e59d6927522 (patch)
treeec650a239fc3f3f070d9447859899cb02aad14b9
parent4cebb63cc080f53e2e52da68920b4f9bc95e609d (diff)
Add support for skipping rendering frames
Add skipFramesInterval property into Q3DSViewerSettings. This property can be used to limit the rendering framerate, decreasing the CPU/GPU usage. Task-number: QT3DS-4088 Change-Id: Icbf5cf208b663dbef1df6096994b94686571e357 Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r--src/api/studio3d/q3dscommandqueue.cpp5
-rw-r--r--src/api/studio3d/q3dscommandqueue_p.h2
-rw-r--r--src/api/studio3d/q3dsviewersettings.cpp54
-rw-r--r--src/api/studio3d/q3dsviewersettings.h4
-rw-r--r--src/api/studio3d/q3dsviewersettings_p.h2
-rw-r--r--src/api/studio3dqml/q3dsrenderer.cpp2
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp6
-rw-r--r--src/engine/Qt3DSRuntimeView.h1
-rw-r--r--src/runtime/Qt3DSApplication.cpp26
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.cpp11
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.h2
-rw-r--r--src/viewer/Qt3DSViewerApp.cpp6
-rw-r--r--src/viewer/Qt3DSViewerApp.h2
13 files changed, 121 insertions, 2 deletions
diff --git a/src/api/studio3d/q3dscommandqueue.cpp b/src/api/studio3d/q3dscommandqueue.cpp
index 300c0bf..a839e69 100644
--- a/src/api/studio3d/q3dscommandqueue.cpp
+++ b/src/api/studio3d/q3dscommandqueue.cpp
@@ -219,6 +219,8 @@ void CommandQueue::copyCommands(CommandQueue &fromQueue)
= m_stereoEyeSeparationChanged || fromQueue.m_stereoEyeSeparationChanged;
m_stereoProgressiveEnabledChanged
= m_stereoProgressiveEnabledChanged || fromQueue.m_stereoProgressiveEnabledChanged;
+ m_skipFramesIntervalChanged
+ = m_skipFramesIntervalChanged || fromQueue.m_skipFramesIntervalChanged;
m_shadeModeChanged = m_shadeModeChanged || fromQueue.m_shadeModeChanged;
m_showRenderStatsChanged = m_showRenderStatsChanged || fromQueue.m_showRenderStatsChanged;
m_matteColorChanged = m_matteColorChanged || fromQueue.m_matteColorChanged;
@@ -240,6 +242,8 @@ void CommandQueue::copyCommands(CommandQueue &fromQueue)
m_stereoEyeSeparation = fromQueue.m_stereoEyeSeparation;
if (fromQueue.m_stereoProgressiveEnabledChanged)
m_stereoProgressiveEnabled = fromQueue.m_stereoProgressiveEnabled;
+ if (fromQueue.m_skipFramesIntervalChanged)
+ m_skipFramesInterval = fromQueue.m_skipFramesInterval;
if (fromQueue.m_shadeModeChanged)
m_shadeMode = fromQueue.m_shadeMode;
if (fromQueue.m_showRenderStatsChanged)
@@ -343,6 +347,7 @@ void CommandQueue::clear(bool deleteCommandData)
m_stereoModeChanged = false;
m_stereoEyeSeparationChanged = false;
m_stereoProgressiveEnabledChanged = false;
+ m_skipFramesIntervalChanged = false;
m_shadeModeChanged = false;
m_showRenderStatsChanged = false;
m_matteColorChanged = false;
diff --git a/src/api/studio3d/q3dscommandqueue_p.h b/src/api/studio3d/q3dscommandqueue_p.h
index 6096439..9939cb0 100644
--- a/src/api/studio3d/q3dscommandqueue_p.h
+++ b/src/api/studio3d/q3dscommandqueue_p.h
@@ -144,6 +144,7 @@ public:
bool m_stereoModeChanged = false;
bool m_stereoEyeSeparationChanged = false;
bool m_stereoProgressiveEnabledChanged = false;
+ bool m_skipFramesIntervalChanged = false;
bool m_shadeModeChanged = false;
bool m_showRenderStatsChanged = false;
bool m_matteColorChanged = false;
@@ -159,6 +160,7 @@ public:
Q3DSViewerSettings::StereoMode m_stereoMode = Q3DSViewerSettings::StereoModeMono;
double m_stereoEyeSeparation = 0.4;
bool m_stereoProgressiveEnabled = false;
+ int m_skipFramesInterval = 0;
Q3DSViewerSettings::ShadeMode m_shadeMode = Q3DSViewerSettings::ShadeModeShaded;
bool m_showRenderStats = false;
QColor m_matteColor = QColor(Qt::black);
diff --git a/src/api/studio3d/q3dsviewersettings.cpp b/src/api/studio3d/q3dsviewersettings.cpp
index 9025bb8..cbb273a 100644
--- a/src/api/studio3d/q3dsviewersettings.cpp
+++ b/src/api/studio3d/q3dsviewersettings.cpp
@@ -371,6 +371,44 @@ void Q3DSViewerSettings::setStereoProgressiveEnabled(bool enabled)
}
/*!
+ \qmlproperty int ViewerSettings::skipFramesInterval
+
+ \since QtStudio3D.OpenGL 2.7
+
+ Sets interval for skipping frame rendering. The default value is 0
+ meaning all frames are rendered. Setting this to 1 renders every
+ other frame (30fps on 60Hz screen), 2 every third frame (20fps on
+ 60Hz screen) etc. This property allows slowing down 3D rendering
+ while keeping QtQuick UI rendering intact, decreasing the CPU/GPU
+ usage.
+ */
+/*!
+ \property Q3DSViewerSettings::skipFramesInterval
+
+ \since Qt 3D Studio 2.7
+
+ Sets interval for skipping frame rendering. The default value is 0
+ meaning all frames are rendered. Setting this to 1 renders every
+ other frame (30fps on 60Hz screen), 2 every third frame (20fps on
+ 60Hz screen) etc. This property allows slowing down 3D rendering
+ while keeping QtQuick UI rendering intact, decreasing the CPU/GPU
+ usage.
+ */
+
+int Q3DSViewerSettings::skipFramesInterval() const
+{
+ return d_ptr->m_skipFramesInterval;
+}
+
+void Q3DSViewerSettings::setSkipFramesInterval(int interval)
+{
+ if (d_ptr->m_skipFramesInterval != interval) {
+ d_ptr->setSkipFramesInterval(interval);
+ Q_EMIT skipFramesIntervalChanged(interval);
+ }
+}
+
+/*!
\qmlproperty bool ViewerSettings::matteEnabled
Specifies if the empty area around the presentation (applicable when
@@ -450,6 +488,7 @@ Q3DSViewerSettingsPrivate::Q3DSViewerSettingsPrivate(Q3DSViewerSettings *q)
, m_stereoMode(Q3DSViewerSettings::StereoModeMono)
, m_stereoEyeSeparation(0.4)
, m_stereoProgressiveEnabled(false)
+ , m_skipFramesInterval(0)
, m_savedSettings(nullptr)
{
}
@@ -470,6 +509,7 @@ void Q3DSViewerSettingsPrivate::setViewerApp(Q3DSViewer::Q3DSViewerApp *app)
setStereoMode(m_stereoMode);
setStereoEyeSeparation(m_stereoEyeSeparation);
setStereoProgressiveEnabled(m_stereoProgressiveEnabled);
+ setSkipFramesInterval(m_skipFramesInterval);
}
}
@@ -485,6 +525,7 @@ void Q3DSViewerSettingsPrivate::setCommandQueue(CommandQueue *queue)
setStereoMode(m_stereoMode);
setStereoEyeSeparation(m_stereoEyeSeparation);
setStereoProgressiveEnabled(m_stereoProgressiveEnabled);
+ setSkipFramesInterval(m_skipFramesInterval);
}
}
@@ -519,6 +560,8 @@ void Q3DSViewerSettingsPrivate::load(const QString &group, const QString &organi
m_savedSettings->value(QStringLiteral("stereoEyeSeparation")).toDouble());
q_ptr->setStereoProgressiveEnabled(
m_savedSettings->value(QStringLiteral("stereoProgressiveEnabled")).toBool());
+ q_ptr->setSkipFramesInterval(
+ m_savedSettings->value(QStringLiteral("skipFramesInterval")).toInt());
q_ptr->setMatteEnabled(m_savedSettings->value(QStringLiteral("matteEnabled")).toBool());
}
@@ -627,6 +670,17 @@ void Q3DSViewerSettingsPrivate::setStereoProgressiveEnabled(bool enabled)
}
}
+void Q3DSViewerSettingsPrivate::setSkipFramesInterval(int interval)
+{
+ m_skipFramesInterval = interval;
+ if (m_viewerApp) {
+ m_viewerApp->SetSkipFramesInterval(interval);
+ } else if (m_commandQueue) {
+ m_commandQueue->m_skipFramesInterval = interval;
+ m_commandQueue->m_skipFramesIntervalChanged = true;
+ }
+}
+
void Q3DSViewerSettingsPrivate::initSettingsStore(const QString &group, const QString &organization,
const QString &application)
{
diff --git a/src/api/studio3d/q3dsviewersettings.h b/src/api/studio3d/q3dsviewersettings.h
index f956649..80b36df 100644
--- a/src/api/studio3d/q3dsviewersettings.h
+++ b/src/api/studio3d/q3dsviewersettings.h
@@ -53,6 +53,7 @@ class Q_STUDIO3D_EXPORT Q3DSViewerSettings : public QObject
Q_PROPERTY(StereoMode stereoMode READ stereoMode WRITE setStereoMode NOTIFY stereoModeChanged REVISION 1)
Q_PROPERTY(double stereoEyeSeparation READ stereoEyeSeparation WRITE setStereoEyeSeparation NOTIFY stereoEyeSeparationChanged REVISION 1)
Q_PROPERTY(bool stereoProgressiveEnabled READ stereoProgressiveEnabled WRITE setStereoProgressiveEnabled NOTIFY stereoProgressiveEnabledChanged REVISION 2)
+ Q_PROPERTY(int skipFramesInterval READ skipFramesInterval WRITE setSkipFramesInterval NOTIFY skipFramesIntervalChanged REVISION 2)
public:
enum ShadeMode {
@@ -84,6 +85,7 @@ public:
StereoMode stereoMode() const;
double stereoEyeSeparation() const;
Q_REVISION(2) bool stereoProgressiveEnabled() const;
+ Q_REVISION(2) int skipFramesInterval() const;
Q_INVOKABLE void save(const QString &group, const QString &organization = QString(),
const QString &application = QString());
@@ -98,6 +100,7 @@ public Q_SLOTS:
void setStereoMode(StereoMode mode);
void setStereoEyeSeparation(double separation);
Q_REVISION(2) void setStereoProgressiveEnabled(bool enabled);
+ Q_REVISION(2) void setSkipFramesInterval(int interval);
Q_SIGNALS:
void matteEnabledChanged(bool enabled);
@@ -108,6 +111,7 @@ Q_SIGNALS:
void stereoModeChanged(StereoMode mode);
void stereoEyeSeparationChanged(double separation);
Q_REVISION(2) void stereoProgressiveEnabledChanged(bool enabled);
+ Q_REVISION(2) void skipFramesIntervalChanged(int interval);
private:
Q_DISABLE_COPY(Q3DSViewerSettings)
diff --git a/src/api/studio3d/q3dsviewersettings_p.h b/src/api/studio3d/q3dsviewersettings_p.h
index 44e1227..6a2dc75 100644
--- a/src/api/studio3d/q3dsviewersettings_p.h
+++ b/src/api/studio3d/q3dsviewersettings_p.h
@@ -70,6 +70,7 @@ public:
void setStereoMode(Q3DSViewerSettings::StereoMode mode);
void setStereoEyeSeparation(double separation);
void setStereoProgressiveEnabled(bool enabled);
+ void setSkipFramesInterval(int interval);
public:
Q3DSViewerSettings *q_ptr;
@@ -88,6 +89,7 @@ private:
Q3DSViewerSettings::StereoMode m_stereoMode;
double m_stereoEyeSeparation;
bool m_stereoProgressiveEnabled;
+ int m_skipFramesInterval;
QSettings *m_savedSettings;
};
diff --git a/src/api/studio3dqml/q3dsrenderer.cpp b/src/api/studio3dqml/q3dsrenderer.cpp
index f7bd25b..8f0081e 100644
--- a/src/api/studio3dqml/q3dsrenderer.cpp
+++ b/src/api/studio3dqml/q3dsrenderer.cpp
@@ -353,6 +353,8 @@ void Q3DSRenderer::processCommands()
m_settings->setStereoEyeSeparation(m_commands.m_stereoEyeSeparation);
if (m_commands.m_stereoProgressiveEnabledChanged)
m_settings->setStereoProgressiveEnabled(m_commands.m_stereoProgressiveEnabled);
+ if (m_commands.m_skipFramesIntervalChanged)
+ m_settings->setSkipFramesInterval(m_commands.m_skipFramesInterval);
if (m_commands.m_shadeModeChanged)
m_settings->setShadeMode(m_commands.m_shadeMode);
if (m_commands.m_matteColorChanged)
diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp
index 9fda560..78a1d17 100644
--- a/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp
+++ b/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp
@@ -172,6 +172,12 @@ struct SRenderer : public Q3DStudio::ITegraApplicationRenderEngine
return false;
}
+ void SetSkipFramesInterval(int interval) override
+ {
+ if (m_BindingCore && m_BindingCore->m_Context)
+ m_BindingCore->m_Context->SetSkipFramesInterval(interval);
+ }
+
void SetShadeMode(Q3DStudio::TegraRenderShadeModes::Enum inShade) override
{
if (m_BindingCore && m_BindingCore->m_Context) {
diff --git a/src/engine/Qt3DSRuntimeView.h b/src/engine/Qt3DSRuntimeView.h
index 8690b99..cb6da7f 100644
--- a/src/engine/Qt3DSRuntimeView.h
+++ b/src/engine/Qt3DSRuntimeView.h
@@ -149,6 +149,7 @@ public:
virtual double GetStereoEyeSeparation() const = 0;
virtual void SetStereoProgressiveEnabled(bool enabled) = 0;
virtual bool GetStereoProgressiveEnabled() const = 0;
+ virtual void SetSkipFramesInterval(int interval) = 0;
// TODO: To be removed, not used anywhere anymore
void CycleScaleMode()
diff --git a/src/runtime/Qt3DSApplication.cpp b/src/runtime/Qt3DSApplication.cpp
index f7f8b46..f12fef9 100644
--- a/src/runtime/Qt3DSApplication.cpp
+++ b/src/runtime/Qt3DSApplication.cpp
@@ -658,7 +658,7 @@ struct SApp : public IApplication
DataOutputMap m_dataOutputDefs;
bool m_initialFrame = true;
-
+ int m_skipFrameCount = 0;
SSlideResourceCounter m_resourceCounter;
QSet<QString> m_createSet;
@@ -1119,6 +1119,23 @@ struct SApp : public IApplication
void ResetDirtyCounter() { m_DirtyCountdown = 5; }
+ // Returns true when skipping the frame, false when rendering it
+ bool checkSkipFrame()
+ {
+ auto &rc = m_RuntimeFactory->GetQt3DSRenderContext();
+ int skipFrames = rc.GetSkipFramesInterval();
+ if (skipFrames == 0)
+ return false;
+
+ if (m_skipFrameCount <= 0) {
+ m_skipFrameCount = skipFrames;
+ return false;
+ }
+
+ m_skipFrameCount--;
+ return true;
+ }
+
// Update all the presentations and render them.
bool UpdateAndRender() override
{
@@ -1165,7 +1182,12 @@ struct SApp : public IApplication
bool renderNextFrame = false;
if (m_LastRenderWasDirty || dirty || m_initialFrame)
renderNextFrame = true;
- Render();
+
+ bool skip = checkSkipFrame();
+ // If we skip rendering this frame, mark next frame to be rendered
+ renderNextFrame |= skip;
+ if (!skip)
+ Render();
m_InputEnginePtr->ClearInputFrame();
diff --git a/src/runtimerender/Qt3DSRenderContextCore.cpp b/src/runtimerender/Qt3DSRenderContextCore.cpp
index dde70fd..d1d0fff 100644
--- a/src/runtimerender/Qt3DSRenderContextCore.cpp
+++ b/src/runtimerender/Qt3DSRenderContextCore.cpp
@@ -249,6 +249,7 @@ struct SRenderContext : public IQt3DSRenderContext
StereoViews::Enum m_StereoView;
double m_StereoEyeSeparation;
bool m_StereoProgressiveEnabled;
+ int m_SkipFramesInterval;
bool m_WireframeMode;
bool m_subPresentationRenderInLayer;
Option<QT3DSVec4> m_SceneColor;
@@ -291,6 +292,7 @@ struct SRenderContext : public IQt3DSRenderContext
, m_StereoView(StereoViews::Mono)
, m_StereoEyeSeparation(0.4)
, m_StereoProgressiveEnabled(false)
+ , m_SkipFramesInterval(0)
, m_WireframeMode(false)
, m_subPresentationRenderInLayer(false)
, m_matteEnabled(false)
@@ -486,6 +488,15 @@ struct SRenderContext : public IQt3DSRenderContext
|| m_StereoMode == StereoModes::TopBottom);
}
+ void SetSkipFramesInterval(int interval) override
+ {
+ m_SkipFramesInterval = interval;
+ }
+
+ int GetSkipFramesInterval() const override {
+ return m_SkipFramesInterval;
+ }
+
void SetWireframeMode(bool inEnable) override { m_WireframeMode = inEnable; }
bool GetWireframeMode() override { return m_WireframeMode; }
diff --git a/src/runtimerender/Qt3DSRenderContextCore.h b/src/runtimerender/Qt3DSRenderContextCore.h
index 8382fc6..64e91c0 100644
--- a/src/runtimerender/Qt3DSRenderContextCore.h
+++ b/src/runtimerender/Qt3DSRenderContextCore.h
@@ -205,6 +205,8 @@ namespace render {
virtual double GetStereoEyeSeparation() const = 0;
virtual void SetStereoProgressiveEnabled(bool enabled) = 0;
virtual bool GetStereoProgressiveEnabled() const = 0;
+ virtual void SetSkipFramesInterval(int interval) = 0;
+ virtual int GetSkipFramesInterval() const = 0;
virtual void SetWireframeMode(bool inEnable) = 0;
virtual bool GetWireframeMode() = 0;
diff --git a/src/viewer/Qt3DSViewerApp.cpp b/src/viewer/Qt3DSViewerApp.cpp
index 5d8393a..7d94f3a 100644
--- a/src/viewer/Qt3DSViewerApp.cpp
+++ b/src/viewer/Qt3DSViewerApp.cpp
@@ -886,6 +886,12 @@ bool Q3DSViewerApp::GetStereoProgressiveEnabled() const
return 0;
}
+void Q3DSViewerApp::SetSkipFramesInterval(int interval)
+{
+ if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine())
+ m_Impl.m_view->GetTegraRenderEngine()->SetSkipFramesInterval(interval);
+}
+
void Q3DSViewerApp::setMatteColor(const QColor &color)
{
if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine()) {
diff --git a/src/viewer/Qt3DSViewerApp.h b/src/viewer/Qt3DSViewerApp.h
index ab723cd..8aca9e1 100644
--- a/src/viewer/Qt3DSViewerApp.h
+++ b/src/viewer/Qt3DSViewerApp.h
@@ -328,6 +328,8 @@ public:
void SetStereoProgressiveEnabled(bool enabled);
bool GetStereoProgressiveEnabled() const;
+ void SetSkipFramesInterval(int interval);
+
void setMatteColor(const QColor &color);
void setShowOnScreenStats(bool s);