diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-07-06 11:13:46 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-07-07 12:13:54 +0200 |
commit | dc1c573cb14d115a39220b7001d21ac26acc4736 (patch) | |
tree | a884a68e5bfaf264ab95f65242205a0818ea794a /src | |
parent | db4de3f44a9011ae644c7d2ea10ec2394ff7f6f0 (diff) |
Refactor RenderQueue so that it can be shared between renderers
It is now template based, header only
Change-Id: I130ad84adce0638329f9d9fd7cfbf1608a7627f4
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/renderers/opengl/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderer.cpp | 28 | ||||
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderer.pri | 2 | ||||
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderer_p.h | 7 | ||||
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderqueue.cpp | 137 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderer.cpp | 29 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderer.pri | 2 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderer_p.h | 8 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderqueue.cpp | 138 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderqueue_p.h | 106 | ||||
-rw-r--r-- | src/render/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/render/jobs/jobs.pri | 3 | ||||
-rw-r--r-- | src/render/jobs/renderqueue_p.h (renamed from src/plugins/renderers/opengl/renderer/renderqueue_p.h) | 101 |
14 files changed, 114 insertions, 450 deletions
diff --git a/src/plugins/renderers/opengl/CMakeLists.txt b/src/plugins/renderers/opengl/CMakeLists.txt index 24700bb92..90374481b 100644 --- a/src/plugins/renderers/opengl/CMakeLists.txt +++ b/src/plugins/renderers/opengl/CMakeLists.txt @@ -30,7 +30,6 @@ set(openGLRendererSources graphicshelpers/graphicscontext.cpp graphicshelpers/gr renderer/rendercommand.cpp renderer/rendercommand_p.h renderer/renderer.cpp renderer/renderer_p.h renderer/renderercache_p.h - renderer/renderqueue.cpp renderer/renderqueue_p.h renderer/renderview.cpp renderer/renderview_p.h renderer/renderviewbuilder.cpp renderer/renderviewbuilder_p.h renderer/shaderparameterpack.cpp renderer/shaderparameterpack_p.h diff --git a/src/plugins/renderers/opengl/renderer/renderer.cpp b/src/plugins/renderers/opengl/renderer/renderer.cpp index 770578fc2..0ef7eac29 100644 --- a/src/plugins/renderers/opengl/renderer/renderer.cpp +++ b/src/plugins/renderers/opengl/renderer/renderer.cpp @@ -96,11 +96,11 @@ #include <Qt3DRender/private/setfence_p.h> #include <Qt3DRender/private/qsetfence_p.h> #include <Qt3DRender/private/waitfence_p.h> +#include <Qt3DRender/private/renderqueue_p.h> #include <glbuffer_p.h> #include <graphicscontext_p.h> #include <rendercommand_p.h> -#include <renderqueue_p.h> #include <renderview_p.h> #include <gltexture_p.h> #include <openglvertexarrayobject_p.h> @@ -239,7 +239,6 @@ Renderer::Renderer() , m_renderSceneRoot(nullptr) , m_defaultRenderStateSet(nullptr) , m_submissionContext(nullptr) - , m_renderQueue(new RenderQueue()) , m_vsyncFrameAdvanceService(new VSyncFrameAdvanceService(false)) , m_waitForInitializationToBeCompleted(0) , m_hasBeenInitializedMutex() @@ -288,7 +287,6 @@ Renderer::~Renderer() { Q_ASSERT(m_running.fetchAndStoreOrdered(0) == 0); - delete m_renderQueue; delete m_defaultRenderStateSet; delete m_glResourceManagers; @@ -538,9 +536,9 @@ void Renderer::shutdown() // We delete any renderqueue that we may not have had time to render // before the surface was destroyed - QMutexLocker lockRenderQueue(m_renderQueue->mutex()); - qDeleteAll(m_renderQueue->nextFrameQueue()); - m_renderQueue->reset(); + QMutexLocker lockRenderQueue(m_renderQueue.mutex()); + qDeleteAll(m_renderQueue.nextFrameQueue()); + m_renderQueue.reset(); lockRenderQueue.unlock(); releaseGraphicsResources(); @@ -696,8 +694,8 @@ void Renderer::render(bool swapBuffers) return; m_shouldSwapBuffers = swapBuffers; - const std::vector<Render::OpenGL::RenderView *> &renderViews = m_renderQueue->nextFrameQueue(); - const bool queueIsEmpty = m_renderQueue->targetRenderViewCount() == 0; + const std::vector<Render::OpenGL::RenderView *> &renderViews = m_renderQueue.nextFrameQueue(); + const bool queueIsEmpty = m_renderQueue.targetRenderViewCount() == 0; // RenderQueue is complete (but that means it may be of size 0) if (!queueIsEmpty) { @@ -770,7 +768,7 @@ void Renderer::render(bool swapBuffers) } // Reset RenderQueue and destroy the renderViews - m_renderQueue->reset(); + m_renderQueue.reset(); qDeleteAll(renderViews); // Allow next frame to be built once we are done doing all rendering @@ -782,14 +780,14 @@ void Renderer::render(bool swapBuffers) // we allow the render thread to proceed void Renderer::enqueueRenderView(RenderView *renderView, int submitOrder) { - QMutexLocker locker(m_renderQueue->mutex()); // Prevent out of order execution + QMutexLocker locker(m_renderQueue.mutex()); // Prevent out of order execution // We cannot use a lock free primitive here because: // - QVector is not thread safe // - Even if the insert is made correctly, the isFrameComplete call // could be invalid since depending on the order of execution // the counter could be complete but the renderview not yet added to the // buffer depending on whichever order the cpu decides to process this - const bool isQueueComplete = m_renderQueue->queueRenderView(renderView, submitOrder); + const bool isQueueComplete = m_renderQueue.queueRenderView(renderView, submitOrder); locker.unlock(); // We're done protecting the queue at this point if (isQueueComplete) { if (m_running.loadRelaxed()) @@ -824,7 +822,7 @@ bool Renderer::waitUntilReadyToSubmit() // be released when the frame queue is complete and there's // something to render // The case of shutdown should have been handled just before - Q_ASSERT(m_renderQueue->isFrameQueueComplete()); + Q_ASSERT(m_renderQueue.isFrameQueueComplete()); return true; } @@ -1710,7 +1708,7 @@ void Renderer::skipNextFrame() Q_ASSERT(m_settings->renderPolicy() != QRenderSettings::Always); // make submitRenderViews() actually run - m_renderQueue->setNoRender(); + m_renderQueue.setNoRender(); m_submitRenderViewsSemaphore.release(1); } @@ -1821,7 +1819,7 @@ std::vector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() // Sync rendering is synchronous, queue should always be reset // when this is called - Q_ASSERT(m_renderQueue->wasReset()); + Q_ASSERT(m_renderQueue.wasReset()); // Traverse the current framegraph. For each leaf node create a // RenderView and set its configuration then create a job to // populate the RenderView with a set of RenderCommands that get @@ -1877,7 +1875,7 @@ std::vector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() } // Set target number of RenderViews - m_renderQueue->setTargetRenderViewCount(fgBranchCount); + m_renderQueue.setTargetRenderViewCount(fgBranchCount); if (isRunning() && m_submissionContext->isInitialized()) { if (dirtyBitsForFrame & AbstractRenderer::TechniquesDirty ) diff --git a/src/plugins/renderers/opengl/renderer/renderer.pri b/src/plugins/renderers/opengl/renderer/renderer.pri index 1a0240e77..867e93fd3 100644 --- a/src/plugins/renderers/opengl/renderer/renderer.pri +++ b/src/plugins/renderers/opengl/renderer/renderer.pri @@ -5,7 +5,6 @@ SOURCES += \ $$PWD/openglvertexarrayobject.cpp \ $$PWD/rendercommand.cpp \ $$PWD/renderer.cpp \ - $$PWD/renderqueue.cpp \ $$PWD/renderview.cpp \ $$PWD/renderviewbuilder.cpp \ $$PWD/shaderparameterpack.cpp \ @@ -19,7 +18,6 @@ HEADERS += \ $$PWD/renderercache_p.h \ $$PWD/rendercommand_p.h \ $$PWD/renderer_p.h \ - $$PWD/renderqueue_p.h \ $$PWD/renderview_p.h \ $$PWD/renderviewbuilder_p.h \ $$PWD/shaderparameterpack_p.h \ diff --git a/src/plugins/renderers/opengl/renderer/renderer_p.h b/src/plugins/renderers/opengl/renderer/renderer_p.h index d95173707..571ffaa8f 100644 --- a/src/plugins/renderers/opengl/renderer/renderer_p.h +++ b/src/plugins/renderers/opengl/renderer/renderer_p.h @@ -68,6 +68,7 @@ #include <Qt3DRender/private/texture_p.h> #include <Qt3DRender/private/filterentitybycomponentjob_p.h> #include <Qt3DRender/private/filtercompatibletechniquejob_p.h> +#include <Qt3DRender/private/renderqueue_p.h> #include <shaderparameterpack_p.h> #include <renderviewinitializerjob_p.h> #include <renderercache_p.h> @@ -158,8 +159,6 @@ namespace OpenGL { class CommandThread; class SubmissionContext; class RenderCommand; -class RenderQueue; -class RenderView; class GLShader; class GLResourceManagers; @@ -198,7 +197,7 @@ public: Entity *sceneRoot() const override { return m_renderSceneRoot; } FrameGraphNode *frameGraphRoot() const override; - RenderQueue *renderQueue() const { return m_renderQueue; } + RenderQueue<RenderView> *renderQueue() { return &m_renderQueue; } void markDirty(BackendNodeDirtySet changes, BackendNode *node) override; BackendNodeDirtySet dirtyBits() override; @@ -321,7 +320,7 @@ private: QScopedPointer<SubmissionContext> m_submissionContext; QSurfaceFormat m_format; - RenderQueue *m_renderQueue; + RenderQueue<RenderView> m_renderQueue; QScopedPointer<VSyncFrameAdvanceService> m_vsyncFrameAdvanceService; QSemaphore m_submitRenderViewsSemaphore; diff --git a/src/plugins/renderers/opengl/renderer/renderqueue.cpp b/src/plugins/renderers/opengl/renderer/renderqueue.cpp deleted file mode 100644 index fe0513b3b..000000000 --- a/src/plugins/renderers/opengl/renderer/renderqueue.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 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 "renderqueue_p.h" -#include <renderview_p.h> -#include <QThread> - -QT_BEGIN_NAMESPACE - -namespace Qt3DRender { - -namespace Render { - -namespace OpenGL { - -RenderQueue::RenderQueue() - : m_noRender(false) - , m_wasReset(true) - , m_targetRenderViewCount(0) - , m_currentRenderViewCount(0) - , m_currentWorkQueue(1) -{ -} - -int RenderQueue::currentRenderViewCount() const -{ - return m_currentRenderViewCount; -} - -/* - * In case the framegraph changed or when the current number of render queue - * needs to be reset. - */ -void RenderQueue::reset() -{ - m_currentRenderViewCount = 0; - m_targetRenderViewCount = 0; - m_currentWorkQueue.clear(); - m_noRender = false; - m_wasReset = true; -} - -void RenderQueue::setNoRender() -{ - Q_ASSERT(m_targetRenderViewCount == 0); - m_noRender = true; -} - -/* - * Queue up a RenderView for the frame being built. - * Thread safe as this is called from the renderer which is locked. - * Returns true if the renderView is complete - */ -bool RenderQueue::queueRenderView(RenderView *renderView, uint submissionOrderIndex) -{ - Q_ASSERT(!m_noRender); - m_currentWorkQueue[submissionOrderIndex] = renderView; - ++m_currentRenderViewCount; - Q_ASSERT(m_currentRenderViewCount <= m_targetRenderViewCount); - return isFrameQueueComplete(); -} - -/* - * Called by the Rendering Thread to retrieve the a frame queue to render. - * A call to reset is required after rendering of the frame. Otherwise under some - * conditions the current but then invalidated frame queue could be reused. - */ -const std::vector<RenderView *> &RenderQueue::nextFrameQueue() const -{ - return m_currentWorkQueue; -} - -/* - * Sets the number \a targetRenderViewCount of RenderView objects that make up a frame. - */ -void RenderQueue::setTargetRenderViewCount(int targetRenderViewCount) -{ - Q_ASSERT(!m_noRender); - m_targetRenderViewCount = targetRenderViewCount; - m_currentWorkQueue.resize(targetRenderViewCount); - m_wasReset = false; -} - -/* - * Returns true if all the RenderView objects making up the current frame have been queued. - * Returns false otherwise. - * \note a frameQueue or size 0 is considered incomplete. - */ -bool RenderQueue::isFrameQueueComplete() const -{ - return (m_noRender - || (m_targetRenderViewCount > 0 && m_targetRenderViewCount == m_currentRenderViewCount)); -} - -} // namespace OpenGL - -} // namespace Render - -} // namespace Qt3DRender - -QT_END_NAMESPACE diff --git a/src/plugins/renderers/rhi/CMakeLists.txt b/src/plugins/renderers/rhi/CMakeLists.txt index 7e9a4ff6d..add0977be 100644 --- a/src/plugins/renderers/rhi/CMakeLists.txt +++ b/src/plugins/renderers/rhi/CMakeLists.txt @@ -21,7 +21,6 @@ qt_internal_add_plugin(RhiRendererPlugin renderer/rendercommand.cpp renderer/rendercommand_p.h renderer/renderer.cpp renderer/renderer_p.h renderer/renderercache_p.h - renderer/renderqueue.cpp renderer/renderqueue_p.h renderer/renderview.cpp renderer/renderview_p.h renderer/renderviewbuilder.cpp renderer/renderviewbuilder_p.h renderer/rhigraphicspipeline.cpp renderer/rhigraphicspipeline_p.h diff --git a/src/plugins/renderers/rhi/renderer/renderer.cpp b/src/plugins/renderers/rhi/renderer/renderer.cpp index f05164671..887654341 100644 --- a/src/plugins/renderers/rhi/renderer/renderer.cpp +++ b/src/plugins/renderers/rhi/renderer/renderer.cpp @@ -98,7 +98,6 @@ #include <rhigraphicspipeline_p.h> #include <rendercommand_p.h> -#include <renderqueue_p.h> #include <renderview_p.h> #include <texture_p.h> #include <renderviewbuilder_p.h> @@ -240,7 +239,6 @@ Renderer::Renderer() m_renderSceneRoot(nullptr), m_defaultRenderStateSet(nullptr), m_submissionContext(nullptr), - m_renderQueue(new RenderQueue()), m_vsyncFrameAdvanceService(new VSyncFrameAdvanceService(false)), m_waitForInitializationToBeCompleted(0), m_hasBeenInitializedMutex(), @@ -290,7 +288,6 @@ Renderer::~Renderer() { Q_ASSERT(m_running.fetchAndStoreOrdered(0) == 0); - delete m_renderQueue; delete m_defaultRenderStateSet; delete m_RHIResourceManagers; @@ -503,9 +500,9 @@ void Renderer::shutdown() // We delete any renderqueue that we may not have had time to render // before the surface was destroyed - QMutexLocker lockRenderQueue(m_renderQueue->mutex()); - qDeleteAll(m_renderQueue->nextFrameQueue()); - m_renderQueue->reset(); + QMutexLocker lockRenderQueue(m_renderQueue.mutex()); + qDeleteAll(m_renderQueue.nextFrameQueue()); + m_renderQueue.reset(); lockRenderQueue.unlock(); releaseGraphicsResources(); @@ -654,8 +651,8 @@ void Renderer::render(bool swapBuffers) return; m_shouldSwapBuffers = swapBuffers; - const std::vector<Render::Rhi::RenderView *> &renderViews = m_renderQueue->nextFrameQueue(); - const bool queueIsEmpty = m_renderQueue->targetRenderViewCount() == 0; + const std::vector<Render::Rhi::RenderView *> &renderViews = m_renderQueue.nextFrameQueue(); + const bool queueIsEmpty = m_renderQueue.targetRenderViewCount() == 0; bool mustCleanResources = false; @@ -758,7 +755,7 @@ void Renderer::render(bool swapBuffers) } // Reset RenderQueue and destroy the renderViews - m_renderQueue->reset(); + m_renderQueue.reset(); qDeleteAll(renderViews); // We allow the RenderTickClock service to proceed to the next frame @@ -772,14 +769,14 @@ void Renderer::render(bool swapBuffers) // we allow the render thread to proceed void Renderer::enqueueRenderView(RenderView *renderView, int submitOrder) { - QMutexLocker locker(m_renderQueue->mutex()); // Prevent out of order execution + QMutexLocker locker(m_renderQueue.mutex()); // Prevent out of order execution // We cannot use a lock free primitive here because: // - std::vector is not thread safe // - Even if the insert is made correctly, the isFrameComplete call // could be invalid since depending on the order of execution // the counter could be complete but the renderview not yet added to the // buffer depending on whichever order the cpu decides to process this - const bool isQueueComplete = m_renderQueue->queueRenderView(renderView, submitOrder); + const bool isQueueComplete = m_renderQueue.queueRenderView(renderView, submitOrder); locker.unlock(); // We're done protecting the queue at this point if (isQueueComplete) { m_submitRenderViewsSemaphore.release(1); @@ -800,7 +797,7 @@ bool Renderer::waitUntilReadyToSubmit() // be released when the frame queue is complete and there's // something to render // The case of shutdown should have been handled just before - Q_ASSERT(m_renderQueue->isFrameQueueComplete()); + Q_ASSERT(m_renderQueue.isFrameQueueComplete()); return true; } @@ -2023,7 +2020,7 @@ void Renderer::skipNextFrame() Q_ASSERT(m_settings->renderPolicy() != QRenderSettings::Always); // make submitRenderViews() actually run - m_renderQueue->setNoRender(); + m_renderQueue.setNoRender(); m_submitRenderViewsSemaphore.release(1); } @@ -2127,8 +2124,8 @@ std::vector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() if (lightsDirty) renderBinJobs.push_back(m_lightGathererJob); - QMutexLocker lock(m_renderQueue->mutex()); - if (m_renderQueue->wasReset()) { // Have we rendered yet? (Scene3D case) + QMutexLocker lock(m_renderQueue.mutex()); + if (m_renderQueue.wasReset()) { // Have we rendered yet? (Scene3D case) // Traverse the current framegraph. For each leaf node create a // RenderView and set its configuration then create a job to // populate the RenderView with a set of RenderCommands that get @@ -2173,7 +2170,7 @@ std::vector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() } // Set target number of RenderViews - m_renderQueue->setTargetRenderViewCount(fgBranchCount); + m_renderQueue.setTargetRenderViewCount(fgBranchCount); } else { // FilterLayerEntityJob is part of the RenderViewBuilder jobs and must be run later // if none of those jobs are started this frame diff --git a/src/plugins/renderers/rhi/renderer/renderer.pri b/src/plugins/renderers/rhi/renderer/renderer.pri index 4ec8cca9b..567226066 100644 --- a/src/plugins/renderers/rhi/renderer/renderer.pri +++ b/src/plugins/renderers/rhi/renderer/renderer.pri @@ -3,7 +3,6 @@ INCLUDEPATH += $$PWD SOURCES += \ $$PWD/rendercommand.cpp \ $$PWD/renderer.cpp \ - $$PWD/renderqueue.cpp \ $$PWD/renderview.cpp \ $$PWD/renderviewbuilder.cpp \ $$PWD/rhigraphicspipeline.cpp \ @@ -16,7 +15,6 @@ HEADERS += \ $$PWD/renderercache_p.h \ $$PWD/rendercommand_p.h \ $$PWD/renderer_p.h \ - $$PWD/renderqueue_p.h \ $$PWD/renderview_p.h \ $$PWD/renderviewbuilder_p.h \ $$PWD/rhigraphicspipeline_p.h \ diff --git a/src/plugins/renderers/rhi/renderer/renderer_p.h b/src/plugins/renderers/rhi/renderer/renderer_p.h index 1912ee470..2c462395e 100644 --- a/src/plugins/renderers/rhi/renderer/renderer_p.h +++ b/src/plugins/renderers/rhi/renderer/renderer_p.h @@ -69,6 +69,7 @@ #include <Qt3DRender/private/attachmentpack_p.h> #include <Qt3DRender/private/filterentitybycomponentjob_p.h> #include <Qt3DRender/private/filtercompatibletechniquejob_p.h> +#include <Qt3DRender/private/renderqueue_p.h> #include <QtGui/private/qrhi_p.h> @@ -78,6 +79,7 @@ #include <logging_p.h> #include <rhihandle_types_p.h> #include <renderercache_p.h> +#include <renderview_p.h> #include <QHash> #include <QMatrix4x4> @@ -153,8 +155,6 @@ namespace Rhi { class CommandThread; class SubmissionContext; class RenderCommand; -class RenderQueue; -class RenderView; struct RHIRenderTarget; class RHIShader; class RHIResourceManagers; @@ -194,7 +194,7 @@ public: Entity *sceneRoot() const override { return m_renderSceneRoot; } FrameGraphNode *frameGraphRoot() const override; - RenderQueue *renderQueue() const { return m_renderQueue; } + RenderQueue<RenderView> *renderQueue() { return &m_renderQueue; } void markDirty(BackendNodeDirtySet changes, BackendNode *node) override; BackendNodeDirtySet dirtyBits() override; @@ -323,7 +323,7 @@ private: QScopedPointer<SubmissionContext> m_submissionContext; - RenderQueue *m_renderQueue; + RenderQueue<RenderView> m_renderQueue; QScopedPointer<VSyncFrameAdvanceService> m_vsyncFrameAdvanceService; QSemaphore m_submitRenderViewsSemaphore; diff --git a/src/plugins/renderers/rhi/renderer/renderqueue.cpp b/src/plugins/renderers/rhi/renderer/renderqueue.cpp deleted file mode 100644 index 463e4cad8..000000000 --- a/src/plugins/renderers/rhi/renderer/renderqueue.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 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 "renderqueue_p.h" -#include <renderview_p.h> -#include <QThread> - -QT_BEGIN_NAMESPACE - -namespace Qt3DRender { - -namespace Render { - -namespace Rhi { - -RenderQueue::RenderQueue() - : m_noRender(false), - m_wasReset(true), - m_targetRenderViewCount(0), - m_currentRenderViewCount(0), - m_currentWorkQueue(1) -{ -} - -int RenderQueue::currentRenderViewCount() const -{ - return m_currentRenderViewCount; -} - -/* - * In case the framegraph changed or when the current number of render queue - * needs to be reset. - */ -void RenderQueue::reset() -{ - m_currentRenderViewCount = 0; - m_targetRenderViewCount = 0; - m_currentWorkQueue.clear(); - m_noRender = false; - m_wasReset = true; -} - -void RenderQueue::setNoRender() -{ - Q_ASSERT(m_targetRenderViewCount == 0); - m_noRender = true; -} - -/* - * Queue up a RenderView for the frame being built. - * Thread safe as this is called from the renderer which is locked. - * Returns true if the renderView is complete - */ -bool RenderQueue::queueRenderView(RenderView *renderView, uint submissionOrderIndex) -{ - Q_ASSERT(!m_noRender); - m_currentWorkQueue[submissionOrderIndex] = renderView; - ++m_currentRenderViewCount; - Q_ASSERT(m_currentRenderViewCount <= m_targetRenderViewCount); - return isFrameQueueComplete(); -} - -/* - * Called by the Rendering Thread to retrieve the a frame queue to render. - * A call to reset is required after rendering of the frame. Otherwise under some - * conditions the current but then invalidated frame queue could be reused. - */ -const std::vector<RenderView *> &RenderQueue::nextFrameQueue() -{ - return m_currentWorkQueue; -} - -/* - * Sets the number \a targetRenderViewCount of RenderView objects that make up a frame. - */ -void RenderQueue::setTargetRenderViewCount(int targetRenderViewCount) -{ - Q_ASSERT(!m_noRender); - m_targetRenderViewCount = targetRenderViewCount; - m_currentWorkQueue.resize(targetRenderViewCount); - m_wasReset = false; -} - -/* - * Returns true if all the RenderView objects making up the current frame have been queued. - * Returns false otherwise. - * \note a frameQueue or size 0 is considered incomplete. - */ -bool RenderQueue::isFrameQueueComplete() const -{ - return (m_noRender - || (m_targetRenderViewCount > 0 - && m_targetRenderViewCount == m_currentRenderViewCount)); -} - -} // namespace Rhi - -} // namespace Render - -} // namespace Qt3DRender - -QT_END_NAMESPACE diff --git a/src/plugins/renderers/rhi/renderer/renderqueue_p.h b/src/plugins/renderers/rhi/renderer/renderqueue_p.h deleted file mode 100644 index 515c1ce3e..000000000 --- a/src/plugins/renderers/rhi/renderer/renderqueue_p.h +++ /dev/null @@ -1,106 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 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_RHI_RENDERQUEUE_H -#define QT3DRENDER_RENDER_RHI_RENDERQUEUE_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 <vector> -#include <QtGlobal> -#include <QMutex> - -QT_BEGIN_NAMESPACE - -namespace Qt3DRender { - -namespace Render { - -namespace Rhi { - -class RenderView; - -class Q_AUTOTEST_EXPORT RenderQueue -{ -public: - RenderQueue(); - - void setTargetRenderViewCount(int targetRenderViewCount); - int targetRenderViewCount() const { return m_targetRenderViewCount; } - int currentRenderViewCount() const; - bool isFrameQueueComplete() const; - - bool queueRenderView(RenderView *renderView, uint submissionOrderIndex); - const std::vector<RenderView *> &nextFrameQueue(); - void reset(); - - void setNoRender(); - inline bool isNoRender() const { return m_noRender; } - - inline bool wasReset() const { return m_wasReset; } - - inline QMutex *mutex() { return &m_mutex; } - -private: - bool m_noRender; - bool m_wasReset; - int m_targetRenderViewCount; - int m_currentRenderViewCount; - std::vector<RenderView *> m_currentWorkQueue; - QMutex m_mutex; -}; - -} // namespace Rhi - -} // namespace Render - -} // namespace Qt3DRender - -QT_END_NAMESPACE - -#endif // QT3DRENDER_RENDER_RHI_RENDERQUEUE_H diff --git a/src/render/CMakeLists.txt b/src/render/CMakeLists.txt index e343b361c..0e185de71 100644 --- a/src/render/CMakeLists.txt +++ b/src/render/CMakeLists.txt @@ -165,6 +165,7 @@ qt_add_module(3DRender jobs/materialparametergathererjob.cpp jobs/materialparametergathererjob_p.h jobs/renderviewjobutils.cpp jobs/renderviewjobutils_p.h jobs/uniformblockbuilder.cpp jobs/uniformblockbuilder_p.h + jobs/renderqueue_p.h lights/environmentlight.cpp lights/environmentlight_p.h lights/light.cpp lights/light_p.h lights/lightsource.cpp lights/lightsource_p.h diff --git a/src/render/jobs/jobs.pri b/src/render/jobs/jobs.pri index e8ab5f319..1b0b1bf76 100644 --- a/src/render/jobs/jobs.pri +++ b/src/render/jobs/jobs.pri @@ -30,7 +30,8 @@ HEADERS += \ $$PWD/filtercompatibletechniquejob_p.h \ $$PWD/jobs/materialparametergathererjob_p.h \ $$PWD/renderviewjobutils_p.h \ - $$PWD/uniformblockbuilder_p.h + $$PWD/uniformblockbuilder_p.h \ + $$PWD/renderqueue_p.h SOURCES += \ $$PWD/updateworldtransformjob.cpp \ diff --git a/src/plugins/renderers/opengl/renderer/renderqueue_p.h b/src/render/jobs/renderqueue_p.h index 7f42b25cd..c3bb18391 100644 --- a/src/plugins/renderers/opengl/renderer/renderqueue_p.h +++ b/src/render/jobs/renderqueue_p.h @@ -37,8 +37,8 @@ ** ****************************************************************************/ -#ifndef QT3DRENDER_RENDER_OPENGL_RENDERQUEUE_H -#define QT3DRENDER_RENDER_OPENGL_RENDERQUEUE_H +#ifndef QT3DRENDER_RENDER_RENDERQUEUE_H +#define QT3DRENDER_RENDER_RENDERQUEUE_H // // W A R N I N G @@ -52,7 +52,6 @@ // #include <vector> -#include <QtGlobal> #include <QMutex> QT_BEGIN_NAMESPACE @@ -61,25 +60,83 @@ namespace Qt3DRender { namespace Render { -namespace OpenGL { - -class RenderView; - -class Q_AUTOTEST_EXPORT RenderQueue +template<class RenderView> +class RenderQueue { public: - RenderQueue(); - - void setTargetRenderViewCount(int targetRenderViewCount); - int targetRenderViewCount() const { return m_targetRenderViewCount; } - int currentRenderViewCount() const; - bool isFrameQueueComplete() const; - - bool queueRenderView(RenderView *renderView, uint submissionOrderIndex); - const std::vector<RenderView *> &nextFrameQueue() const; - void reset(); - - void setNoRender(); + RenderQueue() + : m_noRender(false) + , m_wasReset(true) + , m_targetRenderViewCount(0) + , m_currentRenderViewCount(0) + , m_currentWorkQueue(1) + {} + + /* + Sets the number \a targetRenderViewCount of RenderView objects that make + up a frame. + */ + void setTargetRenderViewCount(int targetRenderViewCount) + { + Q_ASSERT(!m_noRender); + m_targetRenderViewCount = targetRenderViewCount; + m_currentWorkQueue.resize(targetRenderViewCount); + m_wasReset = false; + } + + inline int targetRenderViewCount() const { return m_targetRenderViewCount; } + inline int currentRenderViewCount() const { return m_currentRenderViewCount; } + + /* + Returns true if all the RenderView objects making up the current frame + have been queued. Returns false otherwise. + \note a frameQueue or size 0 is considered incomplete. + */ + inline bool isFrameQueueComplete() const + { + return (m_noRender + || (m_targetRenderViewCount > 0 && m_targetRenderViewCount == m_currentRenderViewCount)); + } + + /* + Queue up a RenderView for the frame being built. + Thread safe as this is called from the renderer which is locked. + Returns true if the renderView is complete + */ + bool queueRenderView(RenderView *renderView, uint submissionOrderIndex) + { + Q_ASSERT(!m_noRender); + m_currentWorkQueue[submissionOrderIndex] = renderView; + ++m_currentRenderViewCount; + Q_ASSERT(m_currentRenderViewCount <= m_targetRenderViewCount); + return isFrameQueueComplete(); + } + + /* + Called by the Rendering Thread to retrieve the a frame queue to render. + A call to reset is required after rendering of the frame. Otherwise under some + conditions the current but then invalidated frame queue could be reused. + */ + inline const std::vector<RenderView *> &nextFrameQueue() const { return m_currentWorkQueue; } + + /* + In case the framegraph changed or when the current number of render queue + needs to be reset. + */ + void reset() + { + m_currentRenderViewCount = 0; + m_targetRenderViewCount = 0; + m_currentWorkQueue.clear(); + m_noRender = false; + m_wasReset = true; + } + + void setNoRender() + { + Q_ASSERT(m_targetRenderViewCount == 0); + m_noRender = true; + } inline bool isNoRender() const { return m_noRender; } inline bool wasReset() const { return m_wasReset; } @@ -95,12 +152,10 @@ private: QMutex m_mutex; }; -} // namespace OpenGL - } // namespace Render } // namespace Qt3DRender QT_END_NAMESPACE -#endif // QT3DRENDER_RENDER_OPENGL_RENDERQUEUE_H +#endif // QT3DRENDER_RENDER_RENDERQUEUE_H |