summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2016-08-12 13:02:04 +0300
committerAntti Määttä <antti.maatta@qt.io>2016-08-29 08:02:26 +0000
commitab8ecac7f2045bea6ac396583c6c484d522a068b (patch)
tree0170db0c57e9260de0d4af7a2db3dee0aa82ec6b
parent733dfe608ef70c82dbed43ba85e318e11254a30f (diff)
Enable QRenderCapture usage in the backend
Add relevant changes to backend so that the render capture can be used. Change-Id: I0d4eaf0b1830c4a7c11a2ef1ec41167a429bfd1e Reviewed-by: Sean Harmer <sean.harmer@kdab.com> Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
-rw-r--r--src/quick3d/imports/render/qt3dquick3drenderplugin.cpp3
-rw-r--r--src/render/backend/renderer.cpp12
-rw-r--r--src/render/backend/renderer_p.h2
-rw-r--r--src/render/backend/renderview.cpp2
-rw-r--r--src/render/backend/renderview_p.h5
-rw-r--r--src/render/frontend/qrenderaspect.cpp5
-rw-r--r--src/render/jobs/renderviewjobutils.cpp10
7 files changed, 37 insertions, 2 deletions
diff --git a/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp b/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp
index 463491ab3..3eb89efe7 100644
--- a/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp
+++ b/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp
@@ -100,6 +100,7 @@
#include <Qt3DRender/qcamera.h>
#include <Qt3DRender/qrendersettings.h>
#include <Qt3DRender/qpickingsettings.h>
+#include <Qt3DRender/qrendercapture.h>
#include <Qt3DQuickRender/private/quick3dlayerfilter_p.h>
#include <Qt3DQuickRender/private/quick3dtechnique_p.h>
#include <Qt3DQuickRender/private/quick3dmaterial_p.h>
@@ -223,6 +224,8 @@ void Qt3DQuick3DRenderPlugin::registerTypes(const char *uri)
qmlRegisterType<Qt3DRender::QNoDraw>(uri, 2, 0, "NoDraw");
qmlRegisterType<Qt3DRender::QFrustumCulling>(uri, 2, 0, "FrustumCulling");
qmlRegisterType<Qt3DRender::QDispatchCompute>(uri, 2, 0, "DispatchCompute");
+ qmlRegisterType<Qt3DRender::QRenderCapture>(uri, 2, 0, "RenderCapture");
+ qmlRegisterUncreatableType<Qt3DRender::QRenderCaptureReply>(uri, 2, 0, "RenderCaptureReply", QStringLiteral("RenderCaptureReply is only instantiated by RenderCapture"));
// RenderTarget
qmlRegisterType<Qt3DRender::QRenderTargetOutput>(uri, 2, 0, "RenderTargetOutput");
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp
index 530363c0b..ca60b8e33 100644
--- a/src/render/backend/renderer.cpp
+++ b/src/render/backend/renderer.cpp
@@ -79,6 +79,7 @@
#include <Qt3DRender/private/openglvertexarrayobject_p.h>
#include <Qt3DRender/private/platformsurfacefilter_p.h>
#include <Qt3DRender/private/loadbufferjob_p.h>
+#include <Qt3DRender/private/rendercapture_p.h>
#include <Qt3DRender/qcameralens.h>
#include <Qt3DCore/private/qeventfilterservice_p.h>
@@ -158,6 +159,7 @@ Renderer::Renderer(QRenderAspect::RenderType type)
, m_expandBoundingVolumeJob(Render::ExpandBoundingVolumeJobPtr::create())
, m_calculateBoundingVolumeJob(Render::CalculateBoundingVolumeJobPtr::create())
, m_updateWorldBoundingVolumeJob(Render::UpdateWorldBoundingVolumeJobPtr::create())
+ , m_sendRenderCaptureJob(Render::SendRenderCaptureJobPtr::create(this))
#ifdef QT3D_JOBS_RUN_STATS
, m_commandExecuter(new Qt3DRender::Debug::CommandExecuter(this))
#endif
@@ -224,6 +226,7 @@ void Renderer::setNodeManagers(NodeManagers *managers)
m_calculateBoundingVolumeJob->setManagers(m_nodesManager);
m_pickBoundingVolumeJob->setManagers(m_nodesManager);
m_updateWorldBoundingVolumeJob->setManager(m_nodesManager->renderNodesManager());
+ m_sendRenderCaptureJob->setManagers(m_nodesManager);
}
NodeManagers *Renderer::nodeManagers() const
@@ -902,6 +905,14 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const QVector<Ren
// executeCommands takes care of restoring the stateset to the value
// of gc->currentContext() at the moment it was called (either
// renderViewStateSet or m_defaultRenderStateSet)
+ if (!renderView->renderCaptureNodeId().isNull()) {
+ QSize size = m_graphicsContext->renderTargetSize(renderView->surfaceSize() * renderView->devicePixelRatio());
+ QImage image = m_graphicsContext->readFramebuffer(size);
+ Render::RenderCapture *renderCapture =
+ static_cast<Render::RenderCapture*>(m_nodesManager->frameGraphManager()->lookupNode(renderView->renderCaptureNodeId()));
+ renderCapture->addRenderCapture(image);
+ addRenderCaptureSendRequest(renderView->renderCaptureNodeId());
+ }
frameElapsed = timer.elapsed() - frameElapsed;
qCDebug(Rendering) << Q_FUNC_INFO << "Submitted Renderview " << i + 1 << "/" << renderViewsCount << "in " << frameElapsed << "ms";
@@ -990,6 +1001,7 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs()
renderBinJobs.push_back(m_calculateBoundingVolumeJob);
renderBinJobs.push_back(m_worldTransformJob);
renderBinJobs.push_back(m_cleanupJob);
+ renderBinJobs.push_back(m_sendRenderCaptureJob);
renderBinJobs.append(bufferJobs);
// Traverse the current framegraph. For each leaf node create a
diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h
index f0b56d271..da3d4e1e9 100644
--- a/src/render/backend/renderer_p.h
+++ b/src/render/backend/renderer_p.h
@@ -69,6 +69,7 @@
#include <Qt3DRender/private/framecleanupjob_p.h>
#include <Qt3DRender/private/updateworldboundingvolumejob_p.h>
#include <Qt3DRender/private/platformsurfacefilter_p.h>
+#include <Qt3DRender/private/sendrendercapturejob_p.h>
#include <QHash>
#include <QMatrix4x4>
@@ -286,6 +287,7 @@ private:
ExpandBoundingVolumeJobPtr m_expandBoundingVolumeJob;
CalculateBoundingVolumeJobPtr m_calculateBoundingVolumeJob;
UpdateWorldBoundingVolumeJobPtr m_updateWorldBoundingVolumeJob;
+ SendRenderCaptureJobPtr m_sendRenderCaptureJob;
QVector<Qt3DCore::QNodeId> m_pendingRenderCaptureSendRequests;
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 9226f8fac..552e66f6d 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -65,7 +65,7 @@
#include <Qt3DRender/private/viewportnode_p.h>
#include <Qt3DRender/private/buffermanager_p.h>
#include <Qt3DRender/private/geometryrenderermanager_p.h>
-
+#include <Qt3DRender/private/rendercapture_p.h>
#include <Qt3DRender/private/stringtoint_p.h>
#include <Qt3DCore/qentity.h>
#include <QtGui/qsurface.h>
diff --git a/src/render/backend/renderview_p.h b/src/render/backend/renderview_p.h
index 7be9903f6..f974741aa 100644
--- a/src/render/backend/renderview_p.h
+++ b/src/render/backend/renderview_p.h
@@ -214,6 +214,9 @@ public:
void updateMatrices();
+ inline void setRenderCaptureNodeId(const Qt3DCore::QNodeId nodeId) Q_DECL_NOTHROW { m_renderCaptureNodeId = nodeId; }
+ inline const Qt3DCore::QNodeId renderCaptureNodeId() const Q_DECL_NOTHROW { return m_renderCaptureNodeId; }
+
// Helps making the size of RenderView smaller
// Contains all the data needed for the actual building of the RenderView
// But that aren't used later by the Renderer
@@ -244,6 +247,8 @@ private:
mutable QThreadStorage<UniformBlockValueBuilder*> m_localData;
+ Qt3DCore::QNodeId m_renderCaptureNodeId;
+
Renderer *m_renderer;
NodeManagers *m_manager;
QSize m_surfaceSize;
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index f6d26fb22..1c6498511 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -76,7 +76,7 @@
#include <Qt3DRender/qcomputecommand.h>
#include <Qt3DRender/qrendersurfaceselector.h>
#include <Qt3DRender/qrendersettings.h>
-
+#include <Qt3DRender/qrendercapture.h>
#include <Qt3DRender/private/cameraselectornode_p.h>
#include <Qt3DRender/private/layerfilternode_p.h>
#include <Qt3DRender/private/filterkey_p.h>
@@ -119,6 +119,7 @@
#include <Qt3DRender/private/rendersurfaceselector_p.h>
#include <Qt3DRender/private/rendersettings_p.h>
#include <Qt3DRender/private/backendnode_p.h>
+#include <Qt3DRender/private/rendercapture_p.h>
#include <Qt3DCore/qentity.h>
#include <Qt3DCore/qtransform.h>
@@ -223,6 +224,7 @@ void QRenderAspectPrivate::registerBackendTypes()
q->registerBackendType<QSortPolicy>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::SortPolicy, QSortPolicy> >::create(m_renderer, m_nodeManagers->frameGraphManager()));
q->registerBackendType<QTechniqueFilter>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::TechniqueFilter, QTechniqueFilter> >::create(m_renderer, m_nodeManagers->frameGraphManager()));
q->registerBackendType<QViewport>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::ViewportNode, QViewport> >::create(m_renderer, m_nodeManagers->frameGraphManager()));
+ q->registerBackendType<QRenderCapture>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::RenderCapture, QRenderCapture> >::create(m_renderer, m_nodeManagers->frameGraphManager()));
// Picking
q->registerBackendType<QObjectPicker>(QSharedPointer<Render::NodeFunctor<Render::ObjectPicker, Render::ObjectPickerManager> >::create(m_renderer, m_nodeManagers->objectPickerManager()));
@@ -278,6 +280,7 @@ void QRenderAspectPrivate::unregisterBackendTypes()
unregisterBackendType<QSortPolicy>();
unregisterBackendType<QTechniqueFilter>();
unregisterBackendType<QViewport>();
+ unregisterBackendType<QRenderCapture>();
// Picking
unregisterBackendType<QObjectPicker>();
diff --git a/src/render/jobs/renderviewjobutils.cpp b/src/render/jobs/renderviewjobutils.cpp
index f81615959..e5b763fcf 100644
--- a/src/render/jobs/renderviewjobutils.cpp
+++ b/src/render/jobs/renderviewjobutils.cpp
@@ -62,6 +62,7 @@
#include <Qt3DRender/private/statesetnode_p.h>
#include <Qt3DRender/private/dispatchcompute_p.h>
#include <Qt3DRender/private/rendersurfaceselector_p.h>
+#include <Qt3DRender/private/rendercapture_p.h>
#include <Qt3DRender/private/stringtoint_p.h>
QT_BEGIN_NAMESPACE
@@ -220,6 +221,15 @@ void setRenderViewConfigFromFrameGraphLeafNode(RenderView *rv, const FrameGraphN
}
break;
}
+ case FrameGraphNode::RenderCapture: {
+ auto *renderCapture = const_cast<Render::RenderCapture *>(
+ static_cast<const Render::RenderCapture *>(node));
+ if (rv->renderCaptureNodeId().isNull() && renderCapture->wasCaptureRequested()) {
+ renderCapture->acknowledgeCaptureRequest();
+ rv->setRenderCaptureNodeId(renderCapture->peerId());
+ }
+ break;
+ }
default:
// Should never get here