If you are not using OpenGL directly or the Qt Quick scene graph's C++ API, 
please ignore this mail.

Qt Quick and the scene graphs supports releasing its graphics resources when 
the application is not rendering. This is not a feature we have been taking 
advantage of so far, but as you can guess, it can be quite beneficial on a 
multitasking system to release unused graphics memory.

Once we move our stack to Qt 5.2, we will change the defaults of 
http://qt-project.org/doc/qt-5/qquickwindow.html#setPersistentSceneGraph and 
to be "false" meaning that when an application is not on screen, its graphics 
memory and OpenGL context will be deleted. 

- Applications using Qt Quick, Sailfish Silica Components combined with 
non-graphical C++ APIs are not affected.
- Applications using only QML-level API, including ShaderEffect or 
CustomParticle, are not affected. 
- Applications using QWindow and QOpenGLContext and not Qt Quick are also not 
- Covers are unaffected.

Only applications using Qt Quick, QSG-classes and/or QOpenGLContext and/or raw 
OpenGL calls ARE affected. If this applies to you, there are two ways to deal 
with graphics stuff being released:

1. Don't allow releasing. 

This is a valid scenario in many cases. Shaders have been compiled, resources 
loaded, etc and rebuilding this is difficult, take too long to be feasible or 
some times not possible at all. If so, add the following two lines to your 
main.cpp AFTER you told it to load the QML file and BEFORE you show it.


This will revert to the current behaviour where graphics resources are 
retained, even when the application is backgrounded.

2. React and handle it.

Use the QQuickWindow::sceneGraphInvalidated() and 
QOpenGLContext::aboutToBeDestroyed() signals to clean up your graphics 
resources and let your application handle not being shown on screen. 


I can't tell you when the change over happens, but we're aiming for some time 
later this year :) I'm giving you an early heads up so you can update your 
applications now if you are affected. Reacting to 
http://qt-project.org/doc/qt-5/qquickwindow.html#sceneGraphInvalidated or 
http://qt-project.org/doc/qt-5/qopenglcontext.html#aboutToBeDestroyed is 
something something you can already do. Same if you want to avoid the issue all 
together and setPersistent(SceneGraph|OpenGL)(true) right away. These APIs have 
been there since Qt 5.0.


If you have further questions, please feel free to ask.

Gunnar (sletta on IRC)

SailfishOS.org Devel mailing list

Reply via email to