diff options
author | Antti Määttä <antti.maatta@qt.io> | 2016-08-12 13:02:04 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2016-08-29 08:02:26 +0000 |
commit | ab8ecac7f2045bea6ac396583c6c484d522a068b (patch) | |
tree | 0170db0c57e9260de0d4af7a2db3dee0aa82ec6b | |
parent | 733dfe608ef70c82dbed43ba85e318e11254a30f (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.cpp | 3 | ||||
-rw-r--r-- | src/render/backend/renderer.cpp | 12 | ||||
-rw-r--r-- | src/render/backend/renderer_p.h | 2 | ||||
-rw-r--r-- | src/render/backend/renderview.cpp | 2 | ||||
-rw-r--r-- | src/render/backend/renderview_p.h | 5 | ||||
-rw-r--r-- | src/render/frontend/qrenderaspect.cpp | 5 | ||||
-rw-r--r-- | src/render/jobs/renderviewjobutils.cpp | 10 |
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 |