summaryrefslogtreecommitdiffstats
path: root/src/render/framegraph
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/framegraph')
-rw-r--r--src/render/framegraph/buffercapture.cpp (renamed from src/render/framegraph/qsortcriterion.cpp)41
-rw-r--r--src/render/framegraph/buffercapture_p.h (renamed from src/render/framegraph/qsortcriterion.h)56
-rw-r--r--src/render/framegraph/framegraph.pri5
-rw-r--r--src/render/framegraph/framegraphnode_p.h1
-rw-r--r--src/render/framegraph/framegraphvisitor.cpp26
-rw-r--r--src/render/framegraph/framegraphvisitor_p.h14
-rw-r--r--src/render/framegraph/memorybarrier.cpp12
-rw-r--r--src/render/framegraph/memorybarrier_p.h4
-rw-r--r--src/render/framegraph/qbuffercapture.cpp73
-rw-r--r--src/render/framegraph/qbuffercapture.h69
-rw-r--r--src/render/framegraph/qbuffercapture_p.h74
-rw-r--r--src/render/framegraph/qmemorybarrier.cpp49
-rw-r--r--src/render/framegraph/qmemorybarrier.h45
-rw-r--r--src/render/framegraph/qmemorybarrier_p.h4
-rw-r--r--src/render/framegraph/qrendercapture.cpp81
-rw-r--r--src/render/framegraph/qrendercapture.h17
-rw-r--r--src/render/framegraph/qsortpolicy.cpp4
-rw-r--r--src/render/framegraph/qviewport.cpp34
-rw-r--r--src/render/framegraph/qviewport.h4
-rw-r--r--src/render/framegraph/qviewport_p.h2
-rw-r--r--src/render/framegraph/rendercapture.cpp2
-rw-r--r--src/render/framegraph/viewportnode.cpp16
-rw-r--r--src/render/framegraph/viewportnode_p.h4
23 files changed, 473 insertions, 164 deletions
diff --git a/src/render/framegraph/qsortcriterion.cpp b/src/render/framegraph/buffercapture.cpp
index f5252b1f7..4e89150df 100644
--- a/src/render/framegraph/qsortcriterion.cpp
+++ b/src/render/framegraph/buffercapture.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+** Copyright (C) 2017 Juan José Casafranca
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt3D module of the Qt Toolkit.
@@ -37,46 +37,25 @@
**
****************************************************************************/
-#include "qsortcriterion.h"
-#include "qsortcriterion_p.h"
-#include <Qt3DCore/qnodepropertychange.h>
+
+#include <Qt3DRender/private/qbuffercapture_p.h>
+#include <Qt3DRender/private/buffercapture_p.h>
+#include <Qt3DCore/qpropertyupdatedchange.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-QSortCriterionPrivate::QSortCriterionPrivate()
- : QNodePrivate()
- , m_sort(QSortCriterion::StateChangeCost)
-{
-}
-
-QSortCriterion::QSortCriterion(QNode *parent)
- : QNode(*new QSortCriterionPrivate, parent)
-{
-}
+namespace Render {
-QSortCriterion::SortType QSortCriterion::sort() const
+BufferCapture::BufferCapture()
+ : FrameGraphNode(FrameGraphNode::BufferCapture, QBackendNode::ReadWrite)
{
- Q_D(const QSortCriterion);
- return d->m_sort;
-}
-void QSortCriterion::setSort(QSortCriterion::SortType sort)
-{
- Q_D(QSortCriterion);
- if (d->m_sort != sort) {
- d->m_sort = sort;
- emit sortChanged(sort);
- }
}
-/*! \internal */
-QSortCriterion::QSortCriterion(QSortCriterionPrivate &dd, QNode *parent)
- : QNode(dd, parent)
-{
-}
+} //Render
-} // namespace Qt3DRender
+} //Qt3DRender
QT_END_NAMESPACE
diff --git a/src/render/framegraph/qsortcriterion.h b/src/render/framegraph/buffercapture_p.h
index 230f111f9..d638f35d5 100644
--- a/src/render/framegraph/qsortcriterion.h
+++ b/src/render/framegraph/buffercapture_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+** Copyright (C) 2017 Juan José Casafranca
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt3D module of the Qt Toolkit.
@@ -37,49 +37,39 @@
**
****************************************************************************/
-#ifndef QT3DRENDER_QSORTCRITERION_H
-#define QT3DRENDER_QSORTCRITERION_H
+#ifndef BUFFERCAPTURE_P_H
+#define BUFFERCAPTURE_P_H
-#include <Qt3DCore/qnode.h>
-#include <Qt3DRender/qt3drender_global.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 <Qt3DRender/private/qbuffercapture_p.h>
+#include <Qt3DRender/private/framegraphnode_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QSortCriterionPrivate;
+namespace Render {
-class QT3DRENDERSHARED_EXPORT QSortCriterion : public Qt3DCore::QNode
+class Q_AUTOTEST_EXPORT BufferCapture : public FrameGraphNode
{
- Q_OBJECT
- Q_PROPERTY(Qt3DRender::QSortCriterion::SortType sort READ sort WRITE setSort NOTIFY sortChanged)
public:
- explicit QSortCriterion(Qt3DCore::QNode *parent = Q_NULLPTR);
-
- enum SortType {
- StateChangeCost = (1 << 0),
- BackToFront = (1 << 1),
- Material = (1 << 2)
- };
- Q_ENUM(SortType) // LCOV_EXCL_LINE
-
- SortType sort() const;
-
-public Q_SLOTS:
- void setSort(SortType sort);
-
-Q_SIGNALS:
- void sortChanged(SortType sort);
-
-protected:
- QSortCriterion(QSortCriterionPrivate &dd, Qt3DCore::QNode *parent = Q_NULLPTR);
-
-private:
- Q_DECLARE_PRIVATE(QSortCriterion)
+ BufferCapture();
};
-} // namespace Qt3DRender
+} //Render
+
+} //Qt3DRender
QT_END_NAMESPACE
-#endif // QSORTCRITERION_H
+#endif // BUFFERCAPTURE_P_H
diff --git a/src/render/framegraph/framegraph.pri b/src/render/framegraph/framegraph.pri
index 77d7dbc71..5e9ce68bf 100644
--- a/src/render/framegraph/framegraph.pri
+++ b/src/render/framegraph/framegraph.pri
@@ -45,6 +45,9 @@ HEADERS += \
$$PWD/qrendercapture.h \
$$PWD/qrendercapture_p.h \
$$PWD/rendercapture_p.h \
+ $$PWD/qbuffercapture.h \
+ $$PWD/qbuffercapture_p.h \
+ $$PWD/buffercapture_p.h \
$$PWD/qframegraphnodecreatedchange.h \
$$PWD/qframegraphnodecreatedchange_p.h \
$$PWD/qmemorybarrier.h \
@@ -83,6 +86,8 @@ SOURCES += \
$$PWD/rendersurfaceselector.cpp \
$$PWD/qrendercapture.cpp \
$$PWD/rendercapture.cpp \
+ $$PWD/qbuffercapture.cpp \
+ $$PWD/buffercapture.cpp \
$$PWD/qframegraphnodecreatedchange.cpp \
$$PWD/qmemorybarrier.cpp \
$$PWD/memorybarrier.cpp
diff --git a/src/render/framegraph/framegraphnode_p.h b/src/render/framegraph/framegraphnode_p.h
index ccdc47f12..c7b399f89 100644
--- a/src/render/framegraph/framegraphnode_p.h
+++ b/src/render/framegraph/framegraphnode_p.h
@@ -98,6 +98,7 @@ public:
ComputeDispatch,
Surface,
RenderCapture,
+ BufferCapture,
MemoryBarrier
};
FrameGraphNodeType nodeType() const { return m_nodeType; }
diff --git a/src/render/framegraph/framegraphvisitor.cpp b/src/render/framegraph/framegraphvisitor.cpp
index d31e9cddd..cd8b08219 100644
--- a/src/render/framegraph/framegraphvisitor.cpp
+++ b/src/render/framegraph/framegraphvisitor.cpp
@@ -43,7 +43,6 @@
#include "framegraphnode_p.h"
#include <Qt3DRender/private/renderer_p.h>
#include <Qt3DRender/private/managers_p.h>
-#include <Qt3DRender/private/renderviewbuilder_p.h>
#include <QThreadPool>
QT_BEGIN_NAMESPACE
@@ -53,24 +52,16 @@ using namespace Qt3DCore;
namespace Qt3DRender {
namespace Render {
-FrameGraphVisitor::FrameGraphVisitor(Renderer *renderer,
- const FrameGraphManager *manager)
- : m_renderer(renderer)
- , m_manager(manager)
- , m_jobs(nullptr)
- , m_renderviewIndex(0)
-
+FrameGraphVisitor::FrameGraphVisitor(const FrameGraphManager *manager)
+ : m_manager(manager)
{
+ m_leaves.reserve(8);
}
-void FrameGraphVisitor::traverse(FrameGraphNode *root,
- QVector<Qt3DCore::QAspectJobPtr> *jobs)
+QVector<FrameGraphNode *> FrameGraphVisitor::traverse(FrameGraphNode *root)
{
- m_jobs = jobs;
- m_renderviewIndex = 0;
+ m_leaves.clear();
- Q_ASSERT(m_renderer);
- Q_ASSERT(m_jobs);
Q_ASSERT_X(root, Q_FUNC_INFO, "The FrameGraphRoot is null");
// Kick off the traversal
@@ -78,6 +69,7 @@ void FrameGraphVisitor::traverse(FrameGraphNode *root,
if (node == nullptr)
qCritical() << Q_FUNC_INFO << "FrameGraph is null";
visit(node);
+ return m_leaves;
}
void FrameGraphVisitor::visit(Render::FrameGraphNode *node)
@@ -97,10 +89,8 @@ void FrameGraphVisitor::visit(Render::FrameGraphNode *node)
// Leaf node - create a RenderView ready to be populated
// TODO: Pass in only framegraph config that has changed from previous
// index RenderViewJob.
- if (fgChildIds.empty()) {
- RenderViewBuilder builder(node, m_renderviewIndex++, m_renderer);
- m_jobs->append(builder.buildJobHierachy());
- }
+ if (fgChildIds.empty())
+ m_leaves.push_back(node);
}
} // namespace Render
diff --git a/src/render/framegraph/framegraphvisitor_p.h b/src/render/framegraph/framegraphvisitor_p.h
index af8f4caab..f4c0d7796 100644
--- a/src/render/framegraph/framegraphvisitor_p.h
+++ b/src/render/framegraph/framegraphvisitor_p.h
@@ -66,24 +66,18 @@ class FrameGraphNode;
class Renderer;
class FrameGraphManager;
-class FrameGraphVisitor
+class Q_AUTOTEST_EXPORT FrameGraphVisitor
{
public:
- explicit FrameGraphVisitor(Renderer *renderer,
- const FrameGraphManager *nodeManager);
+ explicit FrameGraphVisitor(const FrameGraphManager *nodeManager);
- void traverse(FrameGraphNode *root,
- QVector<Qt3DCore::QAspectJobPtr> *jobs);
-
- inline int leafNodeCount() Q_DECL_NOTHROW { return m_renderviewIndex; }
+ QVector<FrameGraphNode *> traverse(FrameGraphNode *root);
private:
void visit(Render::FrameGraphNode *node);
- Renderer *m_renderer;
const FrameGraphManager *m_manager;
- QVector<Qt3DCore::QAspectJobPtr> *m_jobs;
- int m_renderviewIndex;
+ QVector<FrameGraphNode *> m_leaves;
};
} // namespace Render
diff --git a/src/render/framegraph/memorybarrier.cpp b/src/render/framegraph/memorybarrier.cpp
index c82f6eae8..ee8f156e3 100644
--- a/src/render/framegraph/memorybarrier.cpp
+++ b/src/render/framegraph/memorybarrier.cpp
@@ -49,7 +49,7 @@ namespace Render {
MemoryBarrier::MemoryBarrier()
: FrameGraphNode(FrameGraphNode::MemoryBarrier)
- , m_barrierTypes(QMemoryBarrier::None)
+ , m_waitOperations(QMemoryBarrier::None)
{
}
@@ -57,17 +57,17 @@ MemoryBarrier::~MemoryBarrier()
{
}
-QMemoryBarrier::BarrierTypes MemoryBarrier::barrierTypes() const
+QMemoryBarrier::Operations MemoryBarrier::waitOperations() const
{
- return m_barrierTypes;
+ return m_waitOperations;
}
void MemoryBarrier::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
{
if (e->type() == Qt3DCore::PropertyUpdated) {
Qt3DCore::QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<Qt3DCore::QPropertyUpdatedChange>(e);
- if (propertyChange->propertyName() == QByteArrayLiteral("barrierTypes")) {
- m_barrierTypes = propertyChange->value().value<QMemoryBarrier::BarrierTypes>();
+ if (propertyChange->propertyName() == QByteArrayLiteral("waitOperations")) {
+ m_waitOperations = propertyChange->value().value<QMemoryBarrier::Operations>();
markDirty(AbstractRenderer::AllDirty);
}
}
@@ -79,7 +79,7 @@ void MemoryBarrier::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr
FrameGraphNode::initializeFromPeer(change);
const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QMemoryBarrierData>>(change);
const QMemoryBarrierData &data = typedChange->data;
- m_barrierTypes = data.barrierTypes;
+ m_waitOperations = data.waitOperations;
}
} // Render
diff --git a/src/render/framegraph/memorybarrier_p.h b/src/render/framegraph/memorybarrier_p.h
index 4c0242476..66a3ae823 100644
--- a/src/render/framegraph/memorybarrier_p.h
+++ b/src/render/framegraph/memorybarrier_p.h
@@ -66,12 +66,12 @@ public:
MemoryBarrier();
~MemoryBarrier();
- QMemoryBarrier::BarrierTypes barrierTypes() const;
+ QMemoryBarrier::Operations waitOperations() const;
void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE;
private:
void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL;
- QMemoryBarrier::BarrierTypes m_barrierTypes;
+ QMemoryBarrier::Operations m_waitOperations;
};
} // Render
diff --git a/src/render/framegraph/qbuffercapture.cpp b/src/render/framegraph/qbuffercapture.cpp
new file mode 100644
index 000000000..602ad5d6d
--- /dev/null
+++ b/src/render/framegraph/qbuffercapture.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Juan José Casafranca
+** 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 <Qt3DRender/qbuffercapture.h>
+#include <Qt3DRender/private/qbuffercapture_p.h>
+#include <Qt3DCore/QSceneChange>
+#include <Qt3DCore/QPropertyUpdatedChange>
+#include <Qt3DRender/QFrameGraphNodeCreatedChange>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DRender
+{
+//Documentation here
+
+/*!
+ * \internal
+ */
+QBufferCapturePrivate::QBufferCapturePrivate()
+ : QFrameGraphNodePrivate()
+{
+
+}
+
+QBufferCapture::QBufferCapture(Qt3DCore::QNode *parent)
+ : QFrameGraphNode(*new QBufferCapturePrivate, parent)
+{
+
+}
+
+QBufferCapture::~QBufferCapture()
+{
+}
+
+} //Qt3DRender
+
+QT_END_NAMESPACE
diff --git a/src/render/framegraph/qbuffercapture.h b/src/render/framegraph/qbuffercapture.h
new file mode 100644
index 000000000..d77266828
--- /dev/null
+++ b/src/render/framegraph/qbuffercapture.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Juan José Casafranca
+** 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_QBUFFERCAPTURE_H
+#define QT3DRENDER_QBUFFERCAPTURE_H
+
+#include <Qt3DRender/QFrameGraphNode>
+#include <Qt3DRender/QBuffer>
+#include <QByteArray>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DRender
+{
+
+class QBufferCapturePrivate;
+
+class QT3DRENDERSHARED_EXPORT QBufferCapture : public QFrameGraphNode
+{
+ Q_OBJECT
+public:
+ explicit QBufferCapture(Qt3DCore::QNode *parent = nullptr);
+ ~QBufferCapture();
+
+private:
+ Q_DECLARE_PRIVATE(QBufferCapture)
+};
+
+} //Qt3DRender
+
+QT_END_NAMESPACE
+
+#endif // QT3DRENDER_QBUFFERCAPTURE_H
diff --git a/src/render/framegraph/qbuffercapture_p.h b/src/render/framegraph/qbuffercapture_p.h
new file mode 100644
index 000000000..5e642aca3
--- /dev/null
+++ b/src/render/framegraph/qbuffercapture_p.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Juan José Casafranca
+** 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_QBUFFERCAPTURE_P_H
+#define QT3DRENDER_QBUFFERCAPTURE_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 <Qt3DRender/qbuffercapture.h>
+#include <Qt3DRender/private/qframegraphnode_p.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DRender
+{
+
+class QBufferCapturePrivate : public QFrameGraphNodePrivate
+{
+public:
+ QBufferCapturePrivate();
+
+ Q_DECLARE_PUBLIC(QBufferCapture)
+};
+
+} //Qt3DRender
+
+QT_END_NAMESPACE
+
+#endif // QT3DRENDER_QBUFFERCAPTURE_P_H
diff --git a/src/render/framegraph/qmemorybarrier.cpp b/src/render/framegraph/qmemorybarrier.cpp
index 9aa3ba560..4c1685ef7 100644
--- a/src/render/framegraph/qmemorybarrier.cpp
+++ b/src/render/framegraph/qmemorybarrier.cpp
@@ -97,30 +97,31 @@ namespace Qt3DRender {
*/
/*!
- \enum QMemoryBarrier::BarrierType
+ \enum QMemoryBarrier::Operation
This enum type describes types of buffer to be cleared.
\value None
- \value ElementArrayBarrier
- \value UniformBarrier
- \value TextureFetchBarrier
- \value ShaderImageAccessBarrier
- \value CommandBarrier
- \value PixelBufferBarrier
- \value TextureUpdateBarrier
- \value BufferUpdateBarrier
- \value FrameBufferBarrier
- \value TransformFeedbackBarrier
- \value AtomicCounterBarrier
- \value ShaderStorageBarrier
- \value QueryBufferBarrier
- \value AllBarrier
+ \value ElementArray
+ \value Uniform
+ \value TextureFetch
+ \value ShaderImageAccess
+ \value Command
+ \value PixelBuffer
+ \value TextureUpdate
+ \value BufferUpdate
+ \value FrameBuffer
+ \value TransformFeedback
+ \value AtomicCounter
+ \value ShaderStorage
+ \value QueryBuffer
+ \value VertexAttributeArray
+ \value All
*/
QMemoryBarrierPrivate::QMemoryBarrierPrivate()
: QFrameGraphNodePrivate()
- , m_barrierTypes(QMemoryBarrier::None)
+ , m_waitOperations(QMemoryBarrier::None)
{
}
@@ -133,20 +134,20 @@ QMemoryBarrier::~QMemoryBarrier()
{
}
-void QMemoryBarrier::setBarrierTypes(QMemoryBarrier::BarrierTypes barrierTypes)
+void QMemoryBarrier::setWaitOperations(QMemoryBarrier::Operations waitOperations)
{
Q_D(QMemoryBarrier);
- if (barrierTypes != d->m_barrierTypes) {
- d->m_barrierTypes = barrierTypes;
- emit barrierTypesChanged(barrierTypes);
- d->notifyPropertyChange("barrierTypes", QVariant::fromValue(barrierTypes));
+ if (waitOperations != d->m_waitOperations) {
+ d->m_waitOperations = waitOperations;
+ emit waitOperationsChanged(waitOperations);
+ d->notifyPropertyChange("waitOperations", QVariant::fromValue(waitOperations));
}
}
-QMemoryBarrier::BarrierTypes QMemoryBarrier::barrierTypes() const
+QMemoryBarrier::Operations QMemoryBarrier::waitOperations() const
{
Q_D(const QMemoryBarrier);
- return d->m_barrierTypes;
+ return d->m_waitOperations;
}
QMemoryBarrier::QMemoryBarrier(QMemoryBarrierPrivate &dd, Qt3DCore::QNode *parent)
@@ -159,7 +160,7 @@ Qt3DCore::QNodeCreatedChangeBasePtr QMemoryBarrier::createNodeCreationChange() c
auto creationChange = QFrameGraphNodeCreatedChangePtr<QMemoryBarrierData>::create(this);
QMemoryBarrierData &data = creationChange->data;
Q_D(const QMemoryBarrier);
- data.barrierTypes = d->m_barrierTypes;
+ data.waitOperations = d->m_waitOperations;
return creationChange;
}
diff --git a/src/render/framegraph/qmemorybarrier.h b/src/render/framegraph/qmemorybarrier.h
index 8b73c86bf..bb439a9a5 100644
--- a/src/render/framegraph/qmemorybarrier.h
+++ b/src/render/framegraph/qmemorybarrier.h
@@ -55,33 +55,34 @@ public:
explicit QMemoryBarrier(Qt3DCore::QNode *parent = nullptr);
~QMemoryBarrier();
- enum BarrierType {
+ enum Operation {
None = 0,
- VertexAttributeArrayBarrier = (1 << 0),
- ElementArrayBarrier = (1 << 1),
- UniformBarrier = (1 << 2),
- TextureFetchBarrier = (1 << 3),
- ShaderImageAccessBarrier = (1 << 4),
- CommandBarrier = (1 << 5),
- PixelBufferBarrier = (1 << 6),
- TextureUpdateBarrier = (1 << 7),
- BufferUpdateBarrier = (1 << 8),
- FrameBufferBarrier = (1 << 9),
- TransformFeedbackBarrier = (1 << 10),
- AtomicCounterBarrier = (1 << 11),
- ShaderStorageBarrier = (1 << 12),
- QueryBufferBarrier = (1 << 13),
- AllBarrier = 0xFFFFFFFF
+ VertexAttributeArray = (1 << 0),
+ ElementArray = (1 << 1),
+ Uniform = (1 << 2),
+ TextureFetch = (1 << 3),
+ ShaderImageAccess = (1 << 4),
+ Command = (1 << 5),
+ PixelBuffer = (1 << 6),
+ TextureUpdate = (1 << 7),
+ BufferUpdate = (1 << 8),
+ FrameBuffer = (1 << 9),
+ TransformFeedback = (1 << 10),
+ AtomicCounter = (1 << 11),
+ ShaderStorage = (1 << 12),
+ QueryBuffer = (1 << 13),
+ All = 0xFFFFFFFF
};
- Q_ENUM(BarrierType)
- Q_DECLARE_FLAGS(BarrierTypes, BarrierType)
+ Q_ENUM(Operation)
+ Q_DECLARE_FLAGS(Operations, Operation)
+
+ Operations waitOperations() const;
public Q_SLOTS:
- void setBarrierTypes(QMemoryBarrier::BarrierTypes barrierTypes);
- BarrierTypes barrierTypes() const;
+ void setWaitOperations(QMemoryBarrier::Operations operations);
Q_SIGNALS:
- void barrierTypesChanged(QMemoryBarrier::BarrierTypes barrierTypes);
+ void waitOperationsChanged(QMemoryBarrier::Operations barrierTypes);
protected:
explicit QMemoryBarrier(QMemoryBarrierPrivate &dd, Qt3DCore::QNode *parent = nullptr);
@@ -95,6 +96,6 @@ private:
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(Qt3DRender::QMemoryBarrier::BarrierTypes)
+Q_DECLARE_METATYPE(Qt3DRender::QMemoryBarrier::Operations)
#endif // QT3DRENDER_QMEMORYBARRIER_H
diff --git a/src/render/framegraph/qmemorybarrier_p.h b/src/render/framegraph/qmemorybarrier_p.h
index 09df0c89c..384dbee3d 100644
--- a/src/render/framegraph/qmemorybarrier_p.h
+++ b/src/render/framegraph/qmemorybarrier_p.h
@@ -63,12 +63,12 @@ public:
QMemoryBarrierPrivate();
Q_DECLARE_PUBLIC(QMemoryBarrier)
- QMemoryBarrier::BarrierTypes m_barrierTypes;
+ QMemoryBarrier::Operations m_waitOperations;
};
struct QMemoryBarrierData
{
- QMemoryBarrier::BarrierTypes barrierTypes;
+ QMemoryBarrier::Operations waitOperations;
};
} // namespace Qt3DRender
diff --git a/src/render/framegraph/qrendercapture.cpp b/src/render/framegraph/qrendercapture.cpp
index a4a5dabcb..f3e5d53ee 100644
--- a/src/render/framegraph/qrendercapture.cpp
+++ b/src/render/framegraph/qrendercapture.cpp
@@ -40,6 +40,8 @@
#include <Qt3DCore/QPropertyUpdatedChange>
#include <Qt3DRender/qframegraphnodecreatedchange.h>
+#include <QPointer>
+
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
@@ -108,19 +110,41 @@ namespace Qt3DRender {
*/
/*!
+ * \qmlmethod bool Qt3D.Render::RenderCaptureReply::saveImage(fileName)
+ *
+ * Saves the render capture result as an image to \a fileName.
+ * Returns true if the image was successfully saved; otherwise returns false.
+ *
+ * \since 5.9
+ */
+
+/*!
* \qmlmethod void Qt3D.Render::RenderCaptureReply::saveToFile(fileName)
+ * \deprecated
*
* Saves the render capture result as an image to \a fileName.
+ *
+ * Deprecated in 5.9. Use saveImage().
*/
/*!
* \qmlmethod RenderCaptureReply Qt3D.Render::RenderCapture::requestCapture(int captureId)
+ * \deprecated
*
* Used to request render capture. User can specify a \a captureId to identify
* the request. The requestId does not have to be unique. Only one render capture result
* is produced per requestCapture call even if the frame graph has multiple leaf nodes.
* The function returns a QRenderCaptureReply object, which receives the captured image
- * when it is done. The user is reponsible for deallocating the returned object.
+ * when it is done. The user is responsible for deallocating the returned object.
+ */
+
+/*!
+ * \qmlmethod RenderCaptureReply Qt3D.Render::RenderCapture::requestCapture()
+ *
+ * Used to request render capture. Only one render capture result is produced per
+ * requestCapture call even if the frame graph has multiple leaf nodes.
+ * The function returns a QRenderCaptureReply object, which receives the captured image
+ * when it is done. The user is responsible for deallocating the returned object.
*/
/*!
@@ -178,6 +202,25 @@ bool QRenderCaptureReply::isComplete() const
/*!
* Saves the render capture result as an image to \a fileName.
+ *
+ * Returns true if the image was successfully saved; otherwise returns false.
+ * \since 5.9
+ */
+bool QRenderCaptureReply::saveImage(const QString &fileName) const
+{
+ Q_D(const QRenderCaptureReply);
+ if (d->m_complete)
+ {
+ return d->m_image.save(fileName);
+ }
+ return false;
+}
+
+/*!
+ * \deprecated
+ * Saves the render capture result as an image to \a fileName.
+ *
+ * Deprecated in 5.9. Use saveImage().
*/
void QRenderCaptureReply::saveToFile(const QString &fileName) const
{
@@ -212,7 +255,7 @@ QRenderCaptureReply *QRenderCapturePrivate::takeReply(int captureId)
{
QRenderCaptureReply *reply = nullptr;
for (int i = 0; i < m_waitingReplies.size(); ++i) {
- if (m_waitingReplies[i]->captureId() == captureId) {
+ if (m_waitingReplies[i]->d_func()->m_captureId == captureId) {
reply = m_waitingReplies[i];
m_waitingReplies.remove(i);
break;
@@ -239,11 +282,12 @@ QRenderCapture::QRenderCapture(Qt3DCore::QNode *parent)
}
/*!
+ * \deprecated
* Used to request render capture. User can specify a \a captureId to identify
* the request. The requestId does not have to be unique. Only one render capture result
* is produced per requestCapture call even if the frame graph has multiple leaf nodes.
* The function returns a QRenderCaptureReply object, which receives the captured image
- * when it is done. The user is reponsible for deallocating the returned object.
+ * when it is done. The user is responsible for deallocating the returned object.
*/
QRenderCaptureReply *QRenderCapture::requestCapture(int captureId)
{
@@ -259,6 +303,28 @@ QRenderCaptureReply *QRenderCapture::requestCapture(int captureId)
}
/*!
+ * Used to request render capture. Only one render capture result is produced per
+ * requestCapture call even if the frame graph has multiple leaf nodes.
+ * The function returns a QRenderCaptureReply object, which receives the captured image
+ * when it is done. The user is responsible for deallocating the returned object.
+ */
+QRenderCaptureReply *QRenderCapture::requestCapture()
+{
+ Q_D(QRenderCapture);
+ static int captureId = 1;
+ QRenderCaptureReply *reply = d->createReply(captureId);
+
+ Qt3DCore::QPropertyUpdatedChangePtr change(new Qt3DCore::QPropertyUpdatedChange(id()));
+ change->setPropertyName(QByteArrayLiteral("renderCaptureRequest"));
+ change->setValue(QVariant::fromValue(captureId));
+ d->notifyObservers(change);
+
+ captureId++;
+
+ return reply;
+}
+
+/*!
* \internal
*/
void QRenderCapture::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change)
@@ -268,10 +334,15 @@ void QRenderCapture::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change)
if (propertyChange->type() == Qt3DCore::PropertyUpdated) {
if (propertyChange->propertyName() == QByteArrayLiteral("renderCaptureData")) {
RenderCaptureDataPtr data = propertyChange->value().value<RenderCaptureDataPtr>();
- QRenderCaptureReply *reply = d->takeReply(data.data()->captureId);
+ QPointer<QRenderCaptureReply> reply = d->takeReply(data.data()->captureId);
if (reply) {
d->setImage(reply, data.data()->image);
- emit reply->completeChanged(true);
+ emit reply->completed();
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+ if (reply)
+ emit reply->completeChanged(true);
+QT_WARNING_POP
}
}
}
diff --git a/src/render/framegraph/qrendercapture.h b/src/render/framegraph/qrendercapture.h
index f3be273f3..5b768b593 100644
--- a/src/render/framegraph/qrendercapture.h
+++ b/src/render/framegraph/qrendercapture.h
@@ -52,18 +52,23 @@ class QT3DRENDERSHARED_EXPORT QRenderCaptureReply : public QObject
Q_OBJECT
Q_PROPERTY(QImage image READ image CONSTANT)
Q_PROPERTY(int captureId READ captureId CONSTANT)
- Q_PROPERTY(bool complete READ isComplete NOTIFY completeChanged)
+ Q_PROPERTY(bool complete READ isComplete NOTIFY completed)
public:
QImage image() const;
- int captureId() const;
+ Q_DECL_DEPRECATED int captureId() const;
bool isComplete() const;
- Q_INVOKABLE void saveToFile(const QString &fileName) const;
+ Q_INVOKABLE bool saveImage(const QString &fileName) const;
+#if QT_DEPRECATED_SINCE(5, 9)
+ // ### Qt 6: remove this
+ Q_DECL_DEPRECATED_X("Use saveImage instead") Q_INVOKABLE void saveToFile(const QString &fileName) const;
+#endif
Q_SIGNALS:
- void completeChanged(bool isComplete);
+ Q_DECL_DEPRECATED_X("Use completed instead") void completeChanged(bool isComplete);
+ void completed();
private:
Q_DECLARE_PRIVATE(QRenderCaptureReply)
@@ -79,7 +84,9 @@ class QT3DRENDERSHARED_EXPORT QRenderCapture : public QFrameGraphNode
public:
explicit QRenderCapture(Qt3DCore::QNode *parent = nullptr);
- Q_INVOKABLE Qt3DRender::QRenderCaptureReply *requestCapture(int captureId);
+ Q_INVOKABLE Q_DECL_DEPRECATED_X("Use the overload with no parameter")
+ Qt3DRender::QRenderCaptureReply *requestCapture(int captureId);
+ Q_REVISION(9) Q_INVOKABLE Qt3DRender::QRenderCaptureReply *requestCapture();
protected:
void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) Q_DECL_OVERRIDE;
diff --git a/src/render/framegraph/qsortpolicy.cpp b/src/render/framegraph/qsortpolicy.cpp
index 2eb0dff19..b1e0f4956 100644
--- a/src/render/framegraph/qsortpolicy.cpp
+++ b/src/render/framegraph/qsortpolicy.cpp
@@ -65,7 +65,7 @@ QSortPolicyPrivate::QSortPolicyPrivate()
The sort types determine how drawable entities are sorted before drawing to
determine the drawing order. When QSortPolicy is present in the FrameGraph,
the sorting mechanism is determined by the SortTypes list. Multiple sort types
- can be used simultanously. If QSortPolicy is not present in the FrameGraph,
+ can be used simultaneously. If QSortPolicy is not present in the FrameGraph,
entities are drawn in the order they appear in the entity hierarchy.
*/
@@ -81,7 +81,7 @@ QSortPolicyPrivate::QSortPolicyPrivate()
The sort types determine how drawable entities are sorted before drawing to
determine the drawing order. When SortPolicy is present in the FrameGraph,
the sorting mechanism is determined by the SortTypes list. Multiple sort
- types can be used simultanously. If SortPolicy is not present in the FrameGraph,
+ types can be used simultaneously. If SortPolicy is not present in the FrameGraph,
entities are drawn in the order they appear in the entity hierarchy.
*/
diff --git a/src/render/framegraph/qviewport.cpp b/src/render/framegraph/qviewport.cpp
index a78e260a5..8c1ebe67c 100644
--- a/src/render/framegraph/qviewport.cpp
+++ b/src/render/framegraph/qviewport.cpp
@@ -50,6 +50,7 @@ namespace Qt3DRender {
QViewportPrivate::QViewportPrivate()
: QFrameGraphNodePrivate()
, m_normalizedRect(QRectF(0.0f, 0.0f, 1.0f, 1.0f))
+ , m_gamma(2.2f)
{
}
@@ -62,7 +63,8 @@ QViewportPrivate::QViewportPrivate()
\inherits Qt3DRender::QFrameGraphNode
Qt3DRender::QViewport of the scene specifies at which portion of the render surface Qt3D
- is rendering to. Area outside the viewport is left untouched.
+ is rendering to. Area outside the viewport is left untouched. It also controls global parameters
+ to the rendering in that viewport like gamma.
*/
/*!
@@ -74,7 +76,8 @@ QViewportPrivate::QViewportPrivate()
\brief A viewport on the Qt3D Scene
Viewport of the scene specifies at which portion of the render surface Qt3D is
- rendering to. Area outside the viewport is left untouched.
+ rendering to. Area outside the viewport is left untouched. It also controls global parameters
+ to the rendering in that viewport like gamma.
*/
/*!
@@ -86,6 +89,12 @@ QViewportPrivate::QViewportPrivate()
*/
/*!
+ \qmlproperty rect Viewport::gamma
+
+ Specifies the gamma factor for the viewport. The default is 2.2 which should give proper result on most screens.
+ */
+
+/*!
Constructs QViewport with given \a parent.
*/
QViewport::QViewport(QNode *parent)
@@ -111,6 +120,12 @@ QRectF QViewport::normalizedRect() const
return d->m_normalizedRect;
}
+float QViewport::gamma() const
+{
+ Q_D(const QViewport);
+ return d->m_gamma;
+}
+
/*!
\property QViewport::normalizedRect
@@ -127,12 +142,27 @@ void QViewport::setNormalizedRect(const QRectF &normalizedRect)
}
}
+/*!
+ \property QViewport::gamma
+
+ Specifies the gamma factor for the viewport. The default is 2.2 which should give proper result on most screens.
+ */
+void QViewport::setGamma(float gamma)
+{
+ Q_D(QViewport);
+ if (gamma != d->m_gamma) {
+ d->m_gamma = gamma;
+ emit gammaChanged(gamma);
+ }
+}
+
Qt3DCore::QNodeCreatedChangeBasePtr QViewport::createNodeCreationChange() const
{
auto creationChange = QFrameGraphNodeCreatedChangePtr<QViewportData>::create(this);
auto &data = creationChange->data;
Q_D(const QViewport);
data.normalizedRect = d->m_normalizedRect;
+ data.gamma = d->m_gamma;
return creationChange;
}
diff --git a/src/render/framegraph/qviewport.h b/src/render/framegraph/qviewport.h
index 5959ed791..66a3428c5 100644
--- a/src/render/framegraph/qviewport.h
+++ b/src/render/framegraph/qviewport.h
@@ -54,18 +54,22 @@ class QT3DRENDERSHARED_EXPORT QViewport : public QFrameGraphNode
{
Q_OBJECT
Q_PROPERTY(QRectF normalizedRect READ normalizedRect WRITE setNormalizedRect NOTIFY normalizedRectChanged)
+ Q_PROPERTY(float gamma READ gamma WRITE setGamma NOTIFY gammaChanged REVISION 9)
public:
explicit QViewport(Qt3DCore::QNode *parent = nullptr);
~QViewport();
QRectF normalizedRect() const;
+ float gamma() const;
public Q_SLOTS:
void setNormalizedRect(const QRectF& normalizedRect);
+ void setGamma(float gamma);
Q_SIGNALS:
void normalizedRectChanged(const QRectF& normalizedRect);
+ void gammaChanged(float gamma);
protected:
explicit QViewport(QViewportPrivate &dd, Qt3DCore::QNode *parent = nullptr);
diff --git a/src/render/framegraph/qviewport_p.h b/src/render/framegraph/qviewport_p.h
index 790cd3d06..4c82f38b3 100644
--- a/src/render/framegraph/qviewport_p.h
+++ b/src/render/framegraph/qviewport_p.h
@@ -67,11 +67,13 @@ public :
Q_DECLARE_PUBLIC(QViewport)
QRectF m_normalizedRect;
QColor m_clearColor;
+ float m_gamma;
};
struct QViewportData
{
QRectF normalizedRect;
+ float gamma;
};
} // namespace Qt3DRender
diff --git a/src/render/framegraph/rendercapture.cpp b/src/render/framegraph/rendercapture.cpp
index 6b6c48375..dea1cf565 100644
--- a/src/render/framegraph/rendercapture.cpp
+++ b/src/render/framegraph/rendercapture.cpp
@@ -92,7 +92,7 @@ void RenderCapture::sendRenderCaptures()
{
QMutexLocker lock(&m_mutex);
- for (const RenderCaptureDataPtr data : m_renderCaptureData) {
+ for (const RenderCaptureDataPtr &data : qAsConst(m_renderCaptureData)) {
auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId());
e->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll);
e->setPropertyName("renderCaptureData");
diff --git a/src/render/framegraph/viewportnode.cpp b/src/render/framegraph/viewportnode.cpp
index ccdb68918..b68f7b55b 100644
--- a/src/render/framegraph/viewportnode.cpp
+++ b/src/render/framegraph/viewportnode.cpp
@@ -55,6 +55,7 @@ ViewportNode::ViewportNode()
, m_yMin(0.0f)
, m_xMax(1.0f)
, m_yMax(1.0f)
+ , m_gamma(2.2f)
{
}
@@ -67,6 +68,7 @@ void ViewportNode::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr
m_xMax = data.normalizedRect.width();
m_yMin = data.normalizedRect.y();
m_yMax = data.normalizedRect.height();
+ m_gamma = data.gamma;
}
float ViewportNode::xMin() const
@@ -106,16 +108,28 @@ void ViewportNode::setYMax(float yMax)
m_yMax = yMax;
}
+float ViewportNode::gamma() const
+{
+ return m_gamma;
+}
+
+void ViewportNode::setGamma(float gamma)
+{
+ m_gamma = gamma;
+}
+
void ViewportNode::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
{
if (e->type() == PropertyUpdated) {
QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<QPropertyUpdatedChange>(e);
if (propertyChange->propertyName() == QByteArrayLiteral("normalizedRect")) {
- QRectF normalizedRect = propertyChange->value().value<QRectF>();
+ QRectF normalizedRect = propertyChange->value().toRectF();
setXMin(normalizedRect.x());
setYMin(normalizedRect.y());
setXMax(normalizedRect.width());
setYMax(normalizedRect.height());
+ } else if (propertyChange->propertyName() == QByteArrayLiteral("gamma")) {
+ setGamma(propertyChange->value().toFloat());
}
markDirty(AbstractRenderer::AllDirty);
}
diff --git a/src/render/framegraph/viewportnode_p.h b/src/render/framegraph/viewportnode_p.h
index 882aa4d86..85003ff36 100644
--- a/src/render/framegraph/viewportnode_p.h
+++ b/src/render/framegraph/viewportnode_p.h
@@ -81,6 +81,9 @@ public:
float yMax() const;
void setYMax(float yMax);
+ float gamma() const;
+ void setGamma(float gamma);
+
void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE;
private:
@@ -90,6 +93,7 @@ private:
float m_yMin;
float m_xMax;
float m_yMax;
+ float m_gamma;
};
QRectF computeViewport(const QRectF &childViewport, const ViewportNode *parentViewport);