summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Leinonen <tony.leinonen@qt.io>2021-02-09 15:47:22 +0200
committerTony Leinonen <tony.leinonen@qt.io>2021-02-18 12:57:07 +0000
commitfb379c456eb5dd221807e585e71af747f725cee2 (patch)
tree48aaf6b5f201991b46feb20d1335c5917b95cf11
parentfdda73198193d2b297a020f6595e3610a4efc109 (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.cpp9
-rw-r--r--src/api/studio3d/q3dssurfaceviewer.h1
-rw-r--r--src/engine/Qt3DSRenderRuntimeBinding.cpp5
-rw-r--r--src/engine/Qt3DSRenderRuntimeBinding.h4
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImpl.h5
-rw-r--r--src/engine/Qt3DSRuntimeView.cpp3
-rw-r--r--src/engine/Qt3DSRuntimeView.h1
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.cpp16
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.h4
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp3
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.h2
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp2
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h2
-rw-r--r--src/viewer/Qt3DSViewerApp.cpp2
-rw-r--r--src/viewer/Qt3DSViewerApp.h1
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