diff options
author | Kaj Grönholm <kaj.gronholm@qt.io> | 2020-03-18 11:33:33 +0200 |
---|---|---|
committer | Kaj Grönholm <kaj.gronholm@qt.io> | 2020-04-16 10:10:15 +0200 |
commit | 498651519a84647a6414558c492d5e59d6927522 (patch) | |
tree | ec650a239fc3f3f070d9447859899cb02aad14b9 | |
parent | 4cebb63cc080f53e2e52da68920b4f9bc95e609d (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.cpp | 5 | ||||
-rw-r--r-- | src/api/studio3d/q3dscommandqueue_p.h | 2 | ||||
-rw-r--r-- | src/api/studio3d/q3dsviewersettings.cpp | 54 | ||||
-rw-r--r-- | src/api/studio3d/q3dsviewersettings.h | 4 | ||||
-rw-r--r-- | src/api/studio3d/q3dsviewersettings_p.h | 2 | ||||
-rw-r--r-- | src/api/studio3dqml/q3dsrenderer.cpp | 2 | ||||
-rw-r--r-- | src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp | 6 | ||||
-rw-r--r-- | src/engine/Qt3DSRuntimeView.h | 1 | ||||
-rw-r--r-- | src/runtime/Qt3DSApplication.cpp | 26 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderContextCore.cpp | 11 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderContextCore.h | 2 | ||||
-rw-r--r-- | src/viewer/Qt3DSViewerApp.cpp | 6 | ||||
-rw-r--r-- | src/viewer/Qt3DSViewerApp.h | 2 |
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); |