diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-09-27 14:31:21 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-10-21 13:35:38 +0200 |
commit | 7eb01e9532f080bef539808c0eb5e7c65cf34048 (patch) | |
tree | 5aadb0e7fcfb80a671641beb972345c4762f763a /src/render/renderers/opengl/jobs | |
parent | 7d8fd90a1d5e59b21b29da3e7fd0e593e3d94620 (diff) |
Split RenderCommand generation and uniform update
In most cases, we can generate the RenderCommands once and reuse them in
subsequent frames only updating the uniforms. We still have to copy the
RenderCommands as the renderer renders while we start preparing the next frame.
This is still faster than regenerating them entirely.
Regenerating the entire commands will happen only when FrameGraph or Scene
structure changes. That should rarely be happening on a per frame basis.
Next step could be to look at how to only update commands for Entity with Parameters
that have changed.
Change-Id: I202870850a46fcd3946f81bffddb7027d192f374
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/renderers/opengl/jobs')
-rw-r--r-- | src/render/renderers/opengl/jobs/jobs.pri | 6 | ||||
-rw-r--r-- | src/render/renderers/opengl/jobs/renderviewcommandbuilderjob.cpp | 78 | ||||
-rw-r--r-- | src/render/renderers/opengl/jobs/renderviewcommandbuilderjob_p.h | 89 | ||||
-rw-r--r-- | src/render/renderers/opengl/jobs/renderviewcommandupdaterjob.cpp (renamed from src/render/renderers/opengl/jobs/renderviewbuilderjob.cpp) | 50 | ||||
-rw-r--r-- | src/render/renderers/opengl/jobs/renderviewcommandupdaterjob_p.h (renamed from src/render/renderers/opengl/jobs/renderviewbuilderjob_p.h) | 27 |
5 files changed, 198 insertions, 52 deletions
diff --git a/src/render/renderers/opengl/jobs/jobs.pri b/src/render/renderers/opengl/jobs/jobs.pri index 021cd3242..d80b8bfd9 100644 --- a/src/render/renderers/opengl/jobs/jobs.pri +++ b/src/render/renderers/opengl/jobs/jobs.pri @@ -3,13 +3,15 @@ INCLUDEPATH += $$PWD SOURCES += \ $$PWD/filtercompatibletechniquejob.cpp \ $$PWD/materialparametergathererjob.cpp \ - $$PWD/renderviewbuilderjob.cpp \ + $$PWD/renderviewcommandbuilderjob.cpp \ + $$PWD/renderviewcommandupdaterjob.cpp \ $$PWD/renderviewinitializerjob.cpp \ $$PWD/renderviewjobutils.cpp HEADERS += \ $$PWD/filtercompatibletechniquejob_p.h \ $$PWD/materialparametergathererjob_p.h \ - $$PWD/renderviewbuilderjob_p.h \ + $$PWD/renderviewcommandbuilderjob_p.h \ + $$PWD/renderviewcommandupdaterjob_p.h \ $$PWD/renderviewinitializerjob_p.h \ $$PWD/renderviewjobutils_p.h diff --git a/src/render/renderers/opengl/jobs/renderviewcommandbuilderjob.cpp b/src/render/renderers/opengl/jobs/renderviewcommandbuilderjob.cpp new file mode 100644 index 000000000..658458568 --- /dev/null +++ b/src/render/renderers/opengl/jobs/renderviewcommandbuilderjob.cpp @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "renderviewcommandbuilderjob_p.h" +#include <Qt3DRender/private/job_common_p.h> +#include <Qt3DRender/private/renderview_p.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DRender { + +namespace Render { + +namespace { +int renderViewInstanceCounter = 0; +} // anonymous + +RenderViewCommandBuilderJob::RenderViewCommandBuilderJob() + : Qt3DCore::QAspectJob() + , m_renderView(nullptr) +{ + SET_JOB_RUN_STAT_TYPE(this, JobTypes::RenderViewCommandBuilder, renderViewInstanceCounter++); +} + +void RenderViewCommandBuilderJob::run() +{ + if (!m_renderView->noDraw()) { + const bool isDraw = !m_renderView->isCompute(); + if (isDraw) + m_commandData = std::move(m_renderView->buildDrawRenderCommands( + m_entities)); + else + m_commandData = std::move(m_renderView->buildComputeRenderCommands( + m_entities)); + } +} + +} // Render + +} // Qt3DRender + +QT_END_NAMESPACE diff --git a/src/render/renderers/opengl/jobs/renderviewcommandbuilderjob_p.h b/src/render/renderers/opengl/jobs/renderviewcommandbuilderjob_p.h new file mode 100644 index 000000000..725f83b62 --- /dev/null +++ b/src/render/renderers/opengl/jobs/renderviewcommandbuilderjob_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QT3DRENDER_RENDER_RENDERVIEWCOMMANDBUILDERJOB_P_H +#define QT3DRENDER_RENDER_RENDERVIEWCOMMANDBUILDERJOB_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <Qt3DCore/qaspectjob.h> +#include <Qt3DRender/private/handle_types_p.h> +#include <Qt3DRender/private/rendercommand_p.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DRender { + +namespace Render { + +class Q_AUTOTEST_EXPORT RenderViewCommandBuilderJob : public Qt3DCore::QAspectJob +{ +public: + RenderViewCommandBuilderJob(); + + inline void setRenderView(RenderView *rv) Q_DECL_NOTHROW { m_renderView = rv; } + inline void setEntities(const QVector<Entity *> &entities) { m_entities = entities; } + inline QVector<EntityRenderCommandData> &commandData() { return m_commandData; } + + void run() final; + +private: + RenderView *m_renderView; + QVector<Entity *> m_entities; + QVector<EntityRenderCommandData> m_commandData; +}; + +typedef QSharedPointer<RenderViewCommandBuilderJob> RenderViewCommandBuilderJobPtr; + +} // Render + +} // Qt3DRender + +QT_END_NAMESPACE + +#endif // QT3DRENDER_RENDER_RENDERVIEWCOMMANDBUILDERJOB_P_H diff --git a/src/render/renderers/opengl/jobs/renderviewbuilderjob.cpp b/src/render/renderers/opengl/jobs/renderviewcommandupdaterjob.cpp index 42f00d9f2..d58b288e6 100644 --- a/src/render/renderers/opengl/jobs/renderviewbuilderjob.cpp +++ b/src/render/renderers/opengl/jobs/renderviewcommandupdaterjob.cpp @@ -37,7 +37,7 @@ ** ****************************************************************************/ -#include "renderviewbuilderjob_p.h" +#include "renderviewcommandupdaterjob_p.h" #include <Qt3DRender/private/job_common_p.h> #include <Qt3DRender/private/renderer_p.h> #include <Qt3DRender/private/renderview_p.h> @@ -52,52 +52,30 @@ namespace { int renderViewInstanceCounter = 0; } // anonymous -RenderViewBuilderJob::RenderViewBuilderJob() +RenderViewCommandUpdaterJob::RenderViewCommandUpdaterJob() : Qt3DCore::QAspectJob() , m_renderView(nullptr) , m_renderer(nullptr) - , m_index(0) { - SET_JOB_RUN_STAT_TYPE(this, JobTypes::RenderViewBuilder, renderViewInstanceCounter++) + SET_JOB_RUN_STAT_TYPE(this, JobTypes::RenderCommandUpdater, renderViewInstanceCounter++); } -void RenderViewBuilderJob::run() +void RenderViewCommandUpdaterJob::run() { // Build RenderCommand should perform the culling as we have no way to determine // if a child has a mesh in the view frustum while its parent isn't contained in it. if (!m_renderView->noDraw()) { -#if defined(QT3D_RENDER_VIEW_JOB_TIMINGS) - gatherLightsTime = timer.nsecsElapsed(); - timer.restart(); -#endif - if (!m_renderView->isCompute()) - m_commands = m_renderView->buildDrawRenderCommands(m_renderables); - else - m_commands = m_renderView->buildComputeRenderCommands(m_renderables); -#if defined(QT3D_RENDER_VIEW_JOB_TIMINGS) - buildCommandsTime = timer.nsecsElapsed(); - timer.restart(); -#endif - } - -#if defined(QT3D_RENDER_VIEW_JOB_TIMINGS) - qint64 creationTime = timer.nsecsElapsed(); - timer.restart(); -#endif - -#if defined(QT3D_RENDER_VIEW_JOB_TIMINGS) - qint64 sortTime = timer.nsecsElapsed(); -#endif - -#if defined(QT3D_RENDER_VIEW_JOB_TIMINGS) - qDebug() << m_index - << "state:" << gatherStateTime / 1.0e6 - << "lights:" << gatherLightsTime / 1.0e6 - << "build commands:" << buildCommandsTime / 1.0e6 - << "sort:" << sortTime / 1.0e6; -#endif - + // Update Render Commands (Uniform Change, Depth Change) + m_renderView->updateRenderCommand(m_renderables); + // Copy commands out of cached -> ensures we can submit them for rendering + // while cache is rebuilt or modified for next frame + QVector<RenderCommand> commands; + commands.reserve(m_renderables.size()); + for (const EntityRenderCommandData *data : m_renderables) + commands.push_back(data->command); + m_commands = commands; + } } } // Render diff --git a/src/render/renderers/opengl/jobs/renderviewbuilderjob_p.h b/src/render/renderers/opengl/jobs/renderviewcommandupdaterjob_p.h index c38f788b0..3fff5f1a0 100644 --- a/src/render/renderers/opengl/jobs/renderviewbuilderjob_p.h +++ b/src/render/renderers/opengl/jobs/renderviewcommandupdaterjob_p.h @@ -1,4 +1,4 @@ -/**************************************************************************** +/**************************************************************************** ** ** Copyright (C) 2016 Paul Lemire ** Contact: https://www.qt.io/licensing/ @@ -37,8 +37,8 @@ ** ****************************************************************************/ -#ifndef QT3DRENDER_RENDER_RENDERVIEWBUILDERJOB_P_H -#define QT3DRENDER_RENDER_RENDERVIEWBUILDERJOB_P_H +#ifndef QT3DRENDER_RENDER_RENDERVIEWCOMMANDUPDATEJOB_P_H +#define QT3DRENDER_RENDER_RENDERVIEWCOMMANDUPDATEJOB_P_H // // W A R N I N G @@ -53,6 +53,7 @@ #include <Qt3DCore/qaspectjob.h> #include <Qt3DRender/private/handle_types_p.h> +#include <Qt3DRender/private/rendercommand_p.h> QT_BEGIN_NAMESPACE @@ -62,30 +63,28 @@ namespace Render { class RenderView; class Renderer; -class RenderCommand; -class Q_AUTOTEST_EXPORT RenderViewBuilderJob : public Qt3DCore::QAspectJob +class Q_AUTOTEST_EXPORT RenderViewCommandUpdaterJob : public Qt3DCore::QAspectJob { public: - RenderViewBuilderJob(); + RenderViewCommandUpdaterJob(); inline void setRenderView(RenderView *rv) Q_DECL_NOTHROW { m_renderView = rv; } inline void setRenderer(Renderer *renderer) Q_DECL_NOTHROW { m_renderer = renderer; } - inline void setIndex(int index) Q_DECL_NOTHROW { m_index = index; } - inline void setRenderables(const QVector<Entity *> &renderables) Q_DECL_NOTHROW { m_renderables = renderables; } - QVector<RenderCommand *> &commands() Q_DECL_NOTHROW { return m_commands; } + inline void setRenderables(const QVector<EntityRenderCommandData *> &renderables) Q_DECL_NOTHROW { m_renderables = renderables; } + + QVector<RenderCommand> &commands() Q_DECL_NOTHROW { return m_commands; } void run() final; private: RenderView *m_renderView; Renderer *m_renderer; - int m_index; - QVector<Entity *> m_renderables; - QVector<RenderCommand *> m_commands; + QVector<EntityRenderCommandData *> m_renderables; + QVector<RenderCommand> m_commands; }; -typedef QSharedPointer<RenderViewBuilderJob> RenderViewBuilderJobPtr; +typedef QSharedPointer<RenderViewCommandUpdaterJob> RenderViewCommandUpdaterJobPtr; } // Render @@ -93,4 +92,4 @@ typedef QSharedPointer<RenderViewBuilderJob> RenderViewBuilderJobPtr; QT_END_NAMESPACE -#endif // QT3DRENDER_RENDER_RENDERVIEWBUILDERJOB_P_H +#endif // QT3DRENDER_RENDER_RENDERVIEWCOMMANDUPDATEJOB_P_H |