diff options
author | Tony Leinonen <tony.leinonen@qt.io> | 2021-02-09 15:47:22 +0200 |
---|---|---|
committer | Tony Leinonen <tony.leinonen@qt.io> | 2021-02-18 12:57:07 +0000 |
commit | fb379c456eb5dd221807e585e71af747f725cee2 (patch) | |
tree | 48aaf6b5f201991b46feb20d1335c5917b95cf11 | |
parent | fdda73198193d2b297a020f6595e3610a4efc109 (diff) |
add signal when renderer is drawing
renderUpdate signal is emitted even if nothing is drawn, so add a new signal
when renderer is actually drawing something to screen.
Task-number: QT3DS-4211
Change-Id: I52d79c618850cc0f87fd9f4226187ed224d0b758
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Antti Määttä <antti.maatta@qt.io>
Reviewed-by: Janne Koskinen <janne.p.koskinen@qt.io>
-rw-r--r-- | src/api/studio3d/q3dssurfaceviewer.cpp | 9 | ||||
-rw-r--r-- | src/api/studio3d/q3dssurfaceviewer.h | 1 | ||||
-rw-r--r-- | src/engine/Qt3DSRenderRuntimeBinding.cpp | 5 | ||||
-rw-r--r-- | src/engine/Qt3DSRenderRuntimeBinding.h | 4 | ||||
-rw-r--r-- | src/engine/Qt3DSRenderRuntimeBindingImpl.h | 5 | ||||
-rw-r--r-- | src/engine/Qt3DSRuntimeView.cpp | 3 | ||||
-rw-r--r-- | src/engine/Qt3DSRuntimeView.h | 1 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderContextCore.cpp | 16 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderContextCore.h | 4 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp | 3 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImpl.h | 2 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp | 2 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h | 2 | ||||
-rw-r--r-- | src/viewer/Qt3DSViewerApp.cpp | 2 | ||||
-rw-r--r-- | src/viewer/Qt3DSViewerApp.h | 1 |
15 files changed, 47 insertions, 13 deletions
diff --git a/src/api/studio3d/q3dssurfaceviewer.cpp b/src/api/studio3d/q3dssurfaceviewer.cpp index 1e1a7ed..1dac70f 100644 --- a/src/api/studio3d/q3dssurfaceviewer.cpp +++ b/src/api/studio3d/q3dssurfaceviewer.cpp @@ -365,6 +365,11 @@ void Q3DSSurfaceViewer::setQmlEngine(QQmlEngine *qmlEngine) d->qmlEngine = qmlEngine; } +/*! + \fn Q3DSSurfaceViewer::frameDraw() + + Emitted each time a frame has been updated and renderer has drawn to it. +*/ /*! \fn Q3DSSurfaceViewer::frameUpdate() @@ -545,7 +550,6 @@ void Q3DSSurfaceViewerPrivate::update() m_presentation->d_ptr->setDataInputValueBatch(); m_presentation->d_ptr->setDataInputsChanged(false); } - m_viewerApp->Render(); Q_EMIT q_ptr->afterRendering(); @@ -657,9 +661,12 @@ bool Q3DSSurfaceViewerPrivate::initializeRuntime() this->q_ptr, &Q3DSSurfaceViewer::presentationReady); connect(m_viewerApp, &Q3DSViewerApp::SigPresentationLoaded, this->q_ptr, &Q3DSSurfaceViewer::presentationLoaded); + connect(m_viewerApp, &Q3DSViewerApp::SigFrameDraw, + this->q_ptr, &Q3DSSurfaceViewer::frameDraw); connect(m_viewerApp, &Q3DSViewerApp::SigLoadShaderCacheErrors, m_presentation, &Q3DSPresentation::shaderCacheLoadErrors); Q_ASSERT(m_viewerApp); + } if (!m_context->makeCurrent(m_surface)) { qWarning () << "Q3DSSurfaceViewer: Unable to make context current"; diff --git a/src/api/studio3d/q3dssurfaceviewer.h b/src/api/studio3d/q3dssurfaceviewer.h index b9e4016..3252a2d 100644 --- a/src/api/studio3d/q3dssurfaceviewer.h +++ b/src/api/studio3d/q3dssurfaceviewer.h @@ -99,6 +99,7 @@ public Q_SLOTS: Q_SIGNALS: void presentationLoaded(); void presentationReady(); + void frameDraw(); void frameUpdate(); void afterRendering(); void errorChanged(); diff --git a/src/engine/Qt3DSRenderRuntimeBinding.cpp b/src/engine/Qt3DSRenderRuntimeBinding.cpp index f314f18..3f4b662 100644 --- a/src/engine/Qt3DSRenderRuntimeBinding.cpp +++ b/src/engine/Qt3DSRenderRuntimeBinding.cpp @@ -1810,12 +1810,13 @@ struct SRenderFactory : public IQt3DSRenderFactoryCore, public IQt3DSRenderFacto }; IQt3DSRenderFactory &CreateRenderFactory(const QSurfaceFormat& format, - bool delayedLoading) override + bool delayedLoading, void *signalProxy) override { { QT3DS_PERF_SCOPED_TIMER(GetPerfTimer(), "Context: CreateRenderContext") SContextTypeRenderFactory theContextFactory(format); - m_Context->CreateRenderContext(theContextFactory, delayedLoading); + m_Context->CreateRenderContext(theContextFactory, delayedLoading, + (QRuntimeViewSignalProxy *)signalProxy); } GetSceneLoader(); diff --git a/src/engine/Qt3DSRenderRuntimeBinding.h b/src/engine/Qt3DSRenderRuntimeBinding.h index ad0c4e6..e12f853 100644 --- a/src/engine/Qt3DSRenderRuntimeBinding.h +++ b/src/engine/Qt3DSRenderRuntimeBinding.h @@ -35,6 +35,7 @@ #include "EABase/eabase.h" #include "render/Qt3DSRenderBaseTypes.h" #include "render/Qt3DSRenderContext.h" +#include "Qt3DSRuntimeView.h" #include <QSurfaceFormat> @@ -63,7 +64,8 @@ namespace render { { public: virtual IQt3DSRenderFactory & - CreateRenderFactory(const QSurfaceFormat &format, bool delayedLoading) = 0; + CreateRenderFactory(const QSurfaceFormat &format, bool delayedLoading, + void *m_SignalProxy) = 0; static IQt3DSRenderFactoryCore & CreateRenderFactoryCore(const char8_t *inApplicationDirectory, diff --git a/src/engine/Qt3DSRenderRuntimeBindingImpl.h b/src/engine/Qt3DSRenderRuntimeBindingImpl.h index 1f0e565..191a3bc 100644 --- a/src/engine/Qt3DSRenderRuntimeBindingImpl.h +++ b/src/engine/Qt3DSRenderRuntimeBindingImpl.h @@ -138,13 +138,14 @@ namespace render { } void CreateRenderContext(qt3ds::render::IRuntimeFactoryRenderFactory &inContextFactory, - bool delayedLoading) + bool delayedLoading, QRuntimeViewSignalProxy *signalProxy) { m_RenderContext = inContextFactory.CreateRenderContext(*m_Foundation, *m_StringTable); + if (m_RenderContext) { m_Context = m_CoreContext->CreateRenderContext(*m_RenderContext, m_PrimitivePath.c_str(), - delayedLoading); + delayedLoading, signalProxy); } } diff --git a/src/engine/Qt3DSRuntimeView.cpp b/src/engine/Qt3DSRuntimeView.cpp index c3dc8e1..47e0001 100644 --- a/src/engine/Qt3DSRuntimeView.cpp +++ b/src/engine/Qt3DSRuntimeView.cpp @@ -312,7 +312,8 @@ bool CRuntimeView::InitializeGraphics(const QSurfaceFormat &format, bool delayed m_ApplicationCore->EndLoad(); // Next call will initialize the render portion of the scenes. This *must* have a loaded // application to go further as it will bind scene graph data to application data. - m_RuntimeFactory = m_RuntimeFactoryCore->CreateRenderFactory(format, delayedLoading); + m_RuntimeFactory = m_RuntimeFactoryCore->CreateRenderFactory(format,delayedLoading, + signalProxy()); m_Application = m_ApplicationCore->CreateApplication(*m_InputEngine, m_AudioPlayer, *m_RuntimeFactory, shaderCache, diff --git a/src/engine/Qt3DSRuntimeView.h b/src/engine/Qt3DSRuntimeView.h index 72d8908..4cef00a 100644 --- a/src/engine/Qt3DSRuntimeView.h +++ b/src/engine/Qt3DSRuntimeView.h @@ -65,6 +65,7 @@ Q_SIGNALS: void SigElementsCreated(const QStringList &elementPaths, const QString &error); void SigMaterialsCreated(const QStringList &materialNames, const QString &error); void SigDataOutputValueUpdated(const QString &name, const QVariant &value); + void SigFrameDraw(); }; namespace qt3ds { diff --git a/src/runtimerender/Qt3DSRenderContextCore.cpp b/src/runtimerender/Qt3DSRenderContextCore.cpp index c87e48b..8280c39 100644 --- a/src/runtimerender/Qt3DSRenderContextCore.cpp +++ b/src/runtimerender/Qt3DSRenderContextCore.cpp @@ -127,7 +127,8 @@ struct SRenderContextCore : public IQt3DSRenderContextCore IPathManagerCore &GetPathManagerCore() override { return *m_PathManagerCore; } IQt3DSRenderContext &CreateRenderContext(NVRenderContext &inContext, const char8_t *inPrimitivesDirectory, - bool delayedLoading) override; + bool delayedLoading, + void *signalProxy) override; void SetTextRendererCore(ITextRendererCore &inRenderer) override { m_TextRenderer = inRenderer; } ITextRendererCore *GetTextRendererCore() override { return m_TextRenderer.mPtr; } void setDistanceFieldRenderer(ITextRendererCore &inRenderer) override @@ -268,9 +269,11 @@ struct SRenderContext : public IQt3DSRenderContext QPair<QT3DSF32, int> m_FPS; bool m_AuthoringMode; QVector<QT3DSF32> m_frameTimes; + void *m_SignalProxy; SRenderContext(NVRenderContext &ctx, IQt3DSRenderContextCore &inCore, - const char8_t *inApplicationDirectory, bool delayedLoading) + const char8_t *inApplicationDirectory, bool delayedLoading, + void *signalProxy) : m_RenderContext(ctx) , m_CoreContext(inCore) , m_StringTable(ctx.GetStringTable()) @@ -300,6 +303,7 @@ struct SRenderContext : public IQt3DSRenderContext , m_PresentationScale(0, 0) , m_FPS(qMakePair(0.0, 0)) , m_AuthoringMode(false) + , m_SignalProxy(signalProxy) { m_BufferManager->enableReloadableResources(delayedLoading); m_OffscreenRenderManager = IOffscreenRenderManager::CreateOffscreenRenderManager( @@ -417,6 +421,8 @@ struct SRenderContext : public IQt3DSRenderContext return m_frameTimes; } + void *GetSignalProxy() override { return m_SignalProxy; } + bool IsAuthoringMode() override { return m_AuthoringMode; } void SetAuthoringMode(bool inMode) override { m_AuthoringMode = inMode; } @@ -963,11 +969,13 @@ struct SRenderContext : public IQt3DSRenderContext IQt3DSRenderContext &SRenderContextCore::CreateRenderContext(NVRenderContext &inContext, const char8_t *inPrimitivesDirectory, - bool delayedLoading) + bool delayedLoading, + void *signalProxy) { return *QT3DS_NEW(m_Foundation.getAllocator(), SRenderContext)(inContext, *this, inPrimitivesDirectory, - delayedLoading); + delayedLoading, + signalProxy); } } diff --git a/src/runtimerender/Qt3DSRenderContextCore.h b/src/runtimerender/Qt3DSRenderContextCore.h index c239d78..337b58f 100644 --- a/src/runtimerender/Qt3DSRenderContextCore.h +++ b/src/runtimerender/Qt3DSRenderContextCore.h @@ -100,7 +100,8 @@ namespace render { // The render context maintains a reference to this object. virtual IQt3DSRenderContext &CreateRenderContext(NVRenderContext &inContext, const char8_t *inPrimitivesDirectory, - bool delayedLoading) = 0; + bool delayedLoading, + void *signalProxy) = 0; static IQt3DSRenderContextCore &Create(NVFoundationBase &fnd, IStringTable &strt); static bool distanceFieldEnabled(); @@ -150,6 +151,7 @@ namespace render { virtual void SetFPS(QPair<QT3DSF32, int> inFPS) = 0; virtual void SetFrameTime(QT3DSF32 time) = 0; virtual QVector<QT3DSF32> GetFrameTimes() const = 0; + virtual void *GetSignalProxy() = 0; // Currently there are a few things that need to work differently // in authoring mode vs. runtime. The particle effects, for instance diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp index ad9b227..9728f40 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp @@ -129,6 +129,7 @@ namespace render { , m_PickRenderPlugins(true) , m_LayerCachingEnabled(true) , m_LayerGPuProfilingEnabled(false) + , m_SignalProxy(ctx.GetSignalProxy()) { } Qt3DSRendererImpl::~Qt3DSRendererImpl() @@ -367,7 +368,7 @@ namespace render { SLayerRenderData *theRenderData = QT3DS_NEW(m_Context->GetAllocator(), SLayerRenderData)( const_cast<SLayer &>(*theLayer), *this); m_InstanceRenderMap.insert(make_pair(combineLayerAndId(theLayer, id), theRenderData)); - + theRenderData->m_SignalProxy = (QRuntimeViewSignalProxy *)m_SignalProxy; // create a profiler if enabled if (IsLayerGpuProfilingEnabled() && theRenderData) theRenderData->CreateGpuProfiler(); diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h index d3048ea..2230733 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h @@ -296,6 +296,7 @@ namespace render { bool m_PickRenderPlugins; bool m_LayerCachingEnabled; bool m_LayerGPuProfilingEnabled; + void *m_SignalProxy; SShaderDefaultMaterialKeyProperties m_DefaultMaterialShaderKeyProperties; QHash<SLayer *, SLayerRenderData *> m_initialPrepareData; @@ -305,6 +306,7 @@ namespace render { float m_alphaOp = 1.0f; float m_alphaRef = 1.0f; + public: Qt3DSRendererImpl(IQt3DSRenderContext &ctx); virtual ~Qt3DSRendererImpl(); diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp index 623f6ab..eceb566 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp @@ -1782,6 +1782,8 @@ void SLayerRenderData::RunRenderPass(TRenderRenderableFunction inRenderFn, // will do this. StartProfiling("Render pass", false); Render(&theFB); + + Q_EMIT m_SignalProxy->SigFrameDraw(); // Debug measure to view the depth map to ensure we're rendering it correctly. //if (m_Layer.m_TemporalAAEnabled) { // RenderFakeDepthMapPass(m_ShadowMapManager->GetShadowMapEntry(0)->m_DepthMap, diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h index 7520edf..e4c1574 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h @@ -33,6 +33,7 @@ #include "Qt3DSRender.h" #include "Qt3DSRendererImplLayerRenderPreparationData.h" #include "Qt3DSRenderResourceBufferObjects.h" +#include "Qt3DSRuntimeView.h" namespace qt3ds { namespace render { @@ -97,6 +98,7 @@ struct AdvancedBlendModes NVRenderTextureFormats::Enum m_DepthBufferFormat; QSize m_previousDimensions; + QRuntimeViewSignalProxy *m_SignalProxy; SLayerRenderData(SLayer &inLayer, Qt3DSRendererImpl &inRenderer); diff --git a/src/viewer/Qt3DSViewerApp.cpp b/src/viewer/Qt3DSViewerApp.cpp index 7d94f3a..523f681 100644 --- a/src/viewer/Qt3DSViewerApp.cpp +++ b/src/viewer/Qt3DSViewerApp.cpp @@ -479,6 +479,8 @@ void Q3DSViewerApp::connectSignals() &Q3DSViewerApp::SigElementsCreated); connect(m_Impl.m_view->signalProxy(), &QRuntimeViewSignalProxy::SigMaterialsCreated, this, &Q3DSViewerApp::SigMaterialsCreated); + connect(m_Impl.m_view->signalProxy(), &QRuntimeViewSignalProxy::SigFrameDraw, this, + &Q3DSViewerApp::SigFrameDraw); } void Q3DSViewerApp::finishAsyncInit() diff --git a/src/viewer/Qt3DSViewerApp.h b/src/viewer/Qt3DSViewerApp.h index 8aca9e1..39ebb63 100644 --- a/src/viewer/Qt3DSViewerApp.h +++ b/src/viewer/Qt3DSViewerApp.h @@ -557,6 +557,7 @@ Q_SIGNALS: void SigPresentationReady(); void SigPresentationLoaded(); void SigLoadShaderCacheErrors(const QString &errors); + void SigFrameDraw(); }; } // end namespace |