summaryrefslogtreecommitdiffstats
path: root/src/render/frontend
diff options
context:
space:
mode:
authorMike Krus <mike.krus@kdab.com>2020-06-19 17:45:57 +0100
committerMike Krus <mike.krus@kdab.com>2020-06-19 20:20:50 +0100
commit2b749055c763005c42616b83d2b9050cde5fdf32 (patch)
treea02a1dbba9482594f31e96cac83cb603a8bcf69b /src/render/frontend
parenteebbdb87b255545c83038aa4ff422e7ef34c3f6e (diff)
Remove the OpenGL Render Thread
We're trading a bit of performance at submission (since we could start preparing the next frame while submitting the current one) for convenience and ease of maintenance. Besides, this allows to remove a thread and in cases Qt3D was used with Scene3D, which is likely the majority of cases, the RenderThread was not used anyway. To control whether the QRenderAspect should submit on its own or not, a new Submission type enum with values Automatic/Manual was added. This allows the QRenderAspect to automatically perform command submission when Qt3D is used on its own. For other cases when Qt3D is integrated into a 3rd party engine or with Scene3D, the Manual mode is used to let the QRenderAspect render only when it is told to do so. Change-Id: Idc270b5a07bcb9ea9e61674a69c6b8cf6ccd8182 Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render/frontend')
-rw-r--r--src/render/frontend/qrenderaspect.cpp44
-rw-r--r--src/render/frontend/qrenderaspect.h8
-rw-r--r--src/render/frontend/qrenderaspect_p.h6
3 files changed, 37 insertions, 21 deletions
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index 6d2f8757a..d22edafa7 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -287,13 +287,12 @@ namespace Qt3DRender {
Renderer and QRenderPlugin.
*/
/*! \internal */
-QRenderAspectPrivate::QRenderAspectPrivate(QRenderAspect::RenderType type)
+QRenderAspectPrivate::QRenderAspectPrivate(QRenderAspect::SubmissionType submissionType)
: QAbstractAspectPrivate()
, m_nodeManagers(nullptr)
, m_renderer(nullptr)
, m_initialized(false)
- , m_renderAfterJobs(false)
- , m_renderType(type)
+ , m_renderAfterJobs(submissionType == QRenderAspect::Automatic || qEnvironmentVariableIsSet("QT3D_FORCE_SYNCHRONOUS_RENDER"))
, m_offscreenHelper(nullptr)
, m_updateTreeEnabledJob(Render::UpdateTreeEnabledJobPtr::create())
, m_worldTransformJob(Render::UpdateWorldTransformJobPtr::create())
@@ -307,13 +306,10 @@ QRenderAspectPrivate::QRenderAspectPrivate(QRenderAspect::RenderType type)
, m_pickBoundingVolumeJob(Render::PickBoundingVolumeJobPtr::create())
, m_rayCastingJob(Render::RayCastingJobPtr::create())
, m_pickEventFilter(new Render::PickEventFilter())
+ , m_submissionType(submissionType)
{
m_instances.append(this);
loadSceneParsers();
- if (m_renderType == QRenderAspect::Threaded && !QOpenGLContext::supportsThreadedOpenGL()) {
- m_renderType = QRenderAspect::Synchronous;
- m_renderAfterJobs = true;
- }
m_updateWorldBoundingVolumeJob->addDependency(m_worldTransformJob);
m_updateWorldBoundingVolumeJob->addDependency(m_calculateBoundingVolumeJob);
@@ -586,21 +582,41 @@ void QRenderAspectPrivate::registerBackendType(const QMetaObject &obj,
}
/*!
+ * \enum QRenderAspect::SubmissionType
+ *
+ * \value Automatic
+ * The QRenderAspect takes care of submitting rendering commands to the
+ * GPU.
+ * \value Manual
+ * The user will take care of telling the QRenderAspect when is the
+ * appropriate time to submit the rendering commands to the GPU.
+ */
+
+/*!
* The constructor creates a new QRenderAspect::QRenderAspect instance with the
- * specified \a parent.
+ * specified \a parent. This constructor will set the submission type to
+ * Automatic.
* \param parent
*/
QRenderAspect::QRenderAspect(QObject *parent)
- : QRenderAspect(Threaded, parent) {}
+ : QRenderAspect(QRenderAspect::Automatic, parent)
+{
+}
/*!
* The constructor creates a new QRenderAspect::QRenderAspect instance with the
- * specified \a type and \a parent.
- * \param type
+ * specified \a parent. The \a submissionType specifies whether the
+ * RenderAspect is in charge of performing the rendering submission or if the
+ * user will take care of it.
* \param parent
*/
-QRenderAspect::QRenderAspect(QRenderAspect::RenderType type, QObject *parent)
- : QRenderAspect(*new QRenderAspectPrivate(type), parent) {}
+QRenderAspect::QRenderAspect(QRenderAspect::SubmissionType submissionType,
+ QObject *parent)
+ : Qt3DCore::QAbstractAspect(*new QRenderAspectPrivate(submissionType),
+ parent)
+{
+
+}
/*! \internal */
QRenderAspect::QRenderAspect(QRenderAspectPrivate &dd, QObject *parent)
@@ -930,7 +946,7 @@ Render::AbstractRenderer *QRenderAspectPrivate::loadRendererPlugin()
for (const QString &key : keys) {
if (key != targetKey)
continue;
- Render::AbstractRenderer *renderer = Render::QRendererPluginFactory::create(key, m_renderType);
+ Render::AbstractRenderer *renderer = Render::QRendererPluginFactory::create(key);
if (renderer)
return renderer;
}
diff --git a/src/render/frontend/qrenderaspect.h b/src/render/frontend/qrenderaspect.h
index 0a090997c..f16f6f07f 100644
--- a/src/render/frontend/qrenderaspect.h
+++ b/src/render/frontend/qrenderaspect.h
@@ -69,13 +69,13 @@ class Q_3DRENDERSHARED_EXPORT QRenderAspect : public Qt3DCore::QAbstractAspect
{
Q_OBJECT
public:
- enum RenderType {
- Synchronous,
- Threaded
+ enum SubmissionType {
+ Automatic = 0,
+ Manual
};
explicit QRenderAspect(QObject *parent = nullptr);
- explicit QRenderAspect(RenderType type, QObject *parent = nullptr);
+ explicit QRenderAspect(SubmissionType submissionType, QObject *parent = nullptr);
~QRenderAspect();
protected:
diff --git a/src/render/frontend/qrenderaspect_p.h b/src/render/frontend/qrenderaspect_p.h
index d18ccfc24..f3c96455a 100644
--- a/src/render/frontend/qrenderaspect_p.h
+++ b/src/render/frontend/qrenderaspect_p.h
@@ -95,7 +95,7 @@ typedef QSharedPointer<UpdateLevelOfDetailJob> UpdateLevelOfDetailJobPtr;
class Q_3DRENDERSHARED_PRIVATE_EXPORT QRenderAspectPrivate : public Qt3DCore::QAbstractAspectPrivate
{
public:
- QRenderAspectPrivate(QRenderAspect::RenderType type);
+ QRenderAspectPrivate(QRenderAspect::SubmissionType submissionType);
~QRenderAspectPrivate();
Q_DECLARE_PUBLIC(QRenderAspect)
@@ -126,11 +126,10 @@ public:
Render::AbstractRenderer *m_renderer;
bool m_initialized;
- bool m_renderAfterJobs;
+ const bool m_renderAfterJobs;
QList<QSceneImporter *> m_sceneImporter;
QVector<QString> m_loadedPlugins;
QVector<Render::QRenderPlugin *> m_renderPlugins;
- QRenderAspect::RenderType m_renderType;
Render::OffscreenSurfaceHelper *m_offscreenHelper;
QScreen *m_screen = nullptr;
@@ -147,6 +146,7 @@ public:
Render::RayCastingJobPtr m_rayCastingJob;
QScopedPointer<Render::PickEventFilter> m_pickEventFilter;
+ QRenderAspect::SubmissionType m_submissionType;
static QMutex m_pluginLock;
static QVector<QString> m_pluginConfig;