summaryrefslogtreecommitdiffstats
path: root/src/render/backend
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-11-10 15:34:10 +0100
committerAndy Nichols <andy.nichols@theqtcompany.com>2015-11-20 13:28:23 +0000
commit4fd95890b33c8bff58e458fc19b66eb4c4d542fc (patch)
treef9cc264d07180d5430498885513fa5089ace27bc /src/render/backend
parent8530caea126acce5f1554b6a772f3e32961f3cae (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.cpp5
-rw-r--r--src/render/backend/renderer.cpp13
-rw-r--r--src/render/backend/renderer_p.h3
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