diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-11-10 15:34:10 +0100 |
---|---|---|
committer | Andy Nichols <andy.nichols@theqtcompany.com> | 2015-11-20 13:28:23 +0000 |
commit | 4fd95890b33c8bff58e458fc19b66eb4c4d542fc (patch) | |
tree | f9cc264d07180d5430498885513fa5089ace27bc /src/render/backend | |
parent | 8530caea126acce5f1554b6a772f3e32961f3cae (diff) |
PlatformSurfaceFilter/Renderer: render only when surface is exposed
Change-Id: Idec2f0ee5f3ace590421698293742932e8843aae
Reviewed-by: Andy Nichols <andy.nichols@theqtcompany.com>
Diffstat (limited to 'src/render/backend')
-rw-r--r-- | src/render/backend/platformsurfacefilter.cpp | 5 | ||||
-rw-r--r-- | src/render/backend/renderer.cpp | 13 | ||||
-rw-r--r-- | src/render/backend/renderer_p.h | 3 |
3 files changed, 19 insertions, 2 deletions
diff --git a/src/render/backend/platformsurfacefilter.cpp b/src/render/backend/platformsurfacefilter.cpp index 6e7e1a21c..248e54d93 100644 --- a/src/render/backend/platformsurfacefilter.cpp +++ b/src/render/backend/platformsurfacefilter.cpp @@ -95,6 +95,11 @@ bool PlatformSurfaceFilter::eventFilter(QObject *obj, QEvent *e) Q_UNREACHABLE(); } } + + if (obj == m_obj && e->type() == QEvent::Expose) { + QExposeEvent *ev = static_cast<QExposeEvent *>(e); + m_renderer->setSurfaceExposed(!ev->region().isEmpty()); + } return false; } diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp index 5ad77b19d..73d0b453e 100644 --- a/src/render/backend/renderer.cpp +++ b/src/render/backend/renderer.cpp @@ -143,6 +143,7 @@ Renderer::Renderer(QRenderAspect::RenderType type) , m_vsyncFrameAdvanceService(new VSyncFrameAdvanceService()) , m_debugLogger(Q_NULLPTR) , m_pickEventFilter(new PickEventFilter()) + , m_exposed(0) { // Set renderer as running - it will wait in the context of the // RenderThread for RenderViews to be submitted @@ -332,7 +333,6 @@ void Renderer::initialize(QOpenGLContext *context) if (enableDebugLogging) sf.setOption(QSurfaceFormat::DebugContext); - QOpenGLContext* ctx = context ? context : new QOpenGLContext; if (!context) { qCDebug(Backend) << "Creating OpenGL context with format" << sf; @@ -395,6 +395,12 @@ void Renderer::shutdown() } } +void Renderer::setSurfaceExposed(bool exposed) +{ + qCDebug(Backend) << "Window exposed: " << exposed; + m_exposed.fetchAndStoreOrdered(exposed); +} + void Renderer::setFrameGraphRoot(const Qt3DCore::QNodeId &frameGraphRootUuid) { m_frameGraphRootUuid = frameGraphRootUuid; @@ -526,7 +532,10 @@ void Renderer::render() // One framegraph description while (m_running.load() > 0) { - doRender(); + if (m_exposed.load() > 0) + doRender(); + else + QThread::msleep(250); } } diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h index 7118f9ff1..1df435595 100644 --- a/src/render/backend/renderer_p.h +++ b/src/render/backend/renderer_p.h @@ -174,6 +174,8 @@ public: QMutex* mutex() { return &m_mutex; } bool isRunning() const { return m_running.load(); } + void setSurfaceExposed(bool exposed); + #ifdef QT3D_RENDER_UNIT_TESTS public: #else @@ -239,6 +241,7 @@ private: QVector<Attribute *> m_dirtyAttributes; QVector<Geometry *> m_dirtyGeometry; + QAtomicInt m_exposed; }; } // namespace Render |