aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/qsgrenderloop.cpp
diff options
context:
space:
mode:
authorFrederik Gladhorn <[email protected]>2014-05-09 16:25:58 +0200
committerGunnar Sletta <[email protected]>2014-05-10 11:53:47 +0200
commit66646dd8c37adb488a79ab274b2396a649674e6d (patch)
treeb0f5ac752a52cec3de1d47692e09295197622dcd /src/quick/scenegraph/qsgrenderloop.cpp
parentda15ea0f3b5805db657f13060c21efa78f10cde2 (diff)
parentd82a17b929dd88fe76258b0f801beaa1b2ee343e (diff)
Merge remote-tracking branch 'origin/stable' into dev
Conflicts: .qmake.conf src/plugins/accessible/quick/quick.pro src/quick/items/qquickpincharea.cpp src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp src/quick/scenegraph/qsgthreadedrenderloop.cpp Manually adjusted for TestHTTPServer constructor change: tests/auto/quick/qquickimage/tst_qquickimage.cpp Change-Id: I5e58a7c08ea92d6fc5e3bce98571c54f7b2ce08f
Diffstat (limited to 'src/quick/scenegraph/qsgrenderloop.cpp')
-rw-r--r--src/quick/scenegraph/qsgrenderloop.cpp48
1 files changed, 33 insertions, 15 deletions
diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp
index 00e67aa944..38de4a5c39 100644
--- a/src/quick/scenegraph/qsgrenderloop.cpp
+++ b/src/quick/scenegraph/qsgrenderloop.cpp
@@ -45,7 +45,6 @@
#include <QtCore/QCoreApplication>
#include <QtCore/QTime>
-#include <QtCore/QScopedPointer>
#include <QtCore/QLibraryInfo>
#include <QtCore/private/qabstractanimation_p.h>
@@ -82,12 +81,27 @@ extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_
DEFINE_BOOL_CONFIG_OPTION(qmlNoThreadedRenderer, QML_BAD_GUI_RENDER_LOOP);
DEFINE_BOOL_CONFIG_OPTION(qmlForceThreadedRenderer, QML_FORCE_THREADED_RENDERER); // Might trigger graphics driver threading bugs, use at own risk
-Q_GLOBAL_STATIC(QScopedPointer<QSGRenderLoop>, s_renderLoopInstance);
+QSGRenderLoop *QSGRenderLoop::s_instance = 0;
QSGRenderLoop::~QSGRenderLoop()
{
}
+void QSGRenderLoop::cleanup()
+{
+ if (!s_instance)
+ return;
+ foreach (QQuickWindow *w, s_instance->windows()) {
+ QQuickWindowPrivate *wd = QQuickWindowPrivate::get(w);
+ if (wd->windowManager == s_instance) {
+ s_instance->windowDestroyed(w);
+ wd->windowManager = 0;
+ }
+ }
+ delete s_instance;
+ s_instance = 0;
+}
+
class QSGGuiThreadRenderLoop : public QSGRenderLoop
{
Q_OBJECT
@@ -148,8 +162,8 @@ bool QSGRenderLoop::useConsistentTiming()
QSGRenderLoop *QSGRenderLoop::instance()
{
- if (s_renderLoopInstance->isNull()) {
- s_renderLoopInstance->reset(QSGContext::createWindowManager());
+ if (!s_instance) {
+ s_instance = QSGContext::createWindowManager();
bool info = qEnvironmentVariableIsSet("QSG_INFO");
@@ -159,7 +173,7 @@ QSGRenderLoop *QSGRenderLoop::instance()
qDebug() << "QSG: using fixed animation steps";
}
- if (s_renderLoopInstance->isNull()) {
+ if (!s_instance) {
enum RenderLoopType {
BasicRenderLoop,
@@ -191,26 +205,28 @@ QSGRenderLoop *QSGRenderLoop::instance()
switch (loopType) {
case ThreadedRenderLoop:
if (info) qDebug() << "QSG: threaded render loop";
- s_renderLoopInstance->reset(new QSGThreadedRenderLoop());
+ s_instance = new QSGThreadedRenderLoop();
break;
case WindowsRenderLoop:
if (info) qDebug() << "QSG: windows render loop";
- s_renderLoopInstance->reset(new QSGWindowsRenderLoop());
+ s_instance = new QSGWindowsRenderLoop();
break;
default:
if (info) qDebug() << "QSG: basic render loop";
- s_renderLoopInstance->reset(new QSGGuiThreadRenderLoop());
+ s_instance = new QSGGuiThreadRenderLoop();
break;
}
}
+
+ qAddPostRoutine(QSGRenderLoop::cleanup);
}
- return s_renderLoopInstance->data();
+ return s_instance;
}
void QSGRenderLoop::setInstance(QSGRenderLoop *instance)
{
- Q_ASSERT(s_renderLoopInstance->isNull());
- s_renderLoopInstance->reset(instance);
+ Q_ASSERT(!s_instance);
+ s_instance = instance;
}
void QSGRenderLoop::handleContextCreationFailure(QQuickWindow *window,
@@ -295,6 +311,8 @@ void QSGGuiThreadRenderLoop::windowDestroyed(QQuickWindow *window)
QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
delete gl;
gl = 0;
+ } else if (window == gl->surface()) {
+ gl->doneCurrent();
}
}
@@ -311,10 +329,10 @@ void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow *window)
if (!gl) {
gl = new QOpenGLContext();
gl->setFormat(window->requestedFormat());
- if (QSGContext::sharedOpenGLContext())
- gl->setShareContext(QSGContext::sharedOpenGLContext());
+ if (QOpenGLContextPrivate::globalShareContext())
+ gl->setShareContext(QOpenGLContextPrivate::globalShareContext());
if (!gl->create()) {
- const bool isEs = gl->isES();
+ const bool isEs = gl->isOpenGLES();
delete gl;
gl = 0;
handleContextCreationFailure(window, isEs);
@@ -361,7 +379,7 @@ void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow *window)
renderTime = renderTimer.nsecsElapsed() - syncTime;
if (data.grabOnly) {
- grabContent = qt_gl_read_framebuffer(window->size(), false, false);
+ grabContent = qt_gl_read_framebuffer(window->size() * window->devicePixelRatio(), false, false);
data.grabOnly = false;
}