summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-07-06 11:13:46 +0200
committerPaul Lemire <paul.lemire@kdab.com>2020-07-07 12:13:54 +0200
commitdc1c573cb14d115a39220b7001d21ac26acc4736 (patch)
treea884a68e5bfaf264ab95f65242205a0818ea794a /src
parentdb4de3f44a9011ae644c7d2ea10ec2394ff7f6f0 (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.txt1
-rw-r--r--src/plugins/renderers/opengl/renderer/renderer.cpp28
-rw-r--r--src/plugins/renderers/opengl/renderer/renderer.pri2
-rw-r--r--src/plugins/renderers/opengl/renderer/renderer_p.h7
-rw-r--r--src/plugins/renderers/opengl/renderer/renderqueue.cpp137
-rw-r--r--src/plugins/renderers/rhi/CMakeLists.txt1
-rw-r--r--src/plugins/renderers/rhi/renderer/renderer.cpp29
-rw-r--r--src/plugins/renderers/rhi/renderer/renderer.pri2
-rw-r--r--src/plugins/renderers/rhi/renderer/renderer_p.h8
-rw-r--r--src/plugins/renderers/rhi/renderer/renderqueue.cpp138
-rw-r--r--src/plugins/renderers/rhi/renderer/renderqueue_p.h106
-rw-r--r--src/render/CMakeLists.txt1
-rw-r--r--src/render/jobs/jobs.pri3
-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