aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/qsgcontextplugin.cpp
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@nokia.com>2012-01-09 08:43:34 +0100
committerQt by Nokia <qt-info@nokia.com>2012-01-13 09:27:22 +0100
commitc3b4d679684434d318c75474f426d5c61a4b239c (patch)
tree4f512ff74a2ab1fa957db2a123c447156a83df69 /src/quick/scenegraph/qsgcontextplugin.cpp
parentc194b012182c3ae495bb7a740f02a5a9f5b3c3b3 (diff)
Reintroduce plugin support for asynchronous hardware specific textures
Change-Id: Iad36542d2137e7a6470009c308ece3de389907c1 Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
Diffstat (limited to 'src/quick/scenegraph/qsgcontextplugin.cpp')
-rw-r--r--src/quick/scenegraph/qsgcontextplugin.cpp109
1 files changed, 81 insertions, 28 deletions
diff --git a/src/quick/scenegraph/qsgcontextplugin.cpp b/src/quick/scenegraph/qsgcontextplugin.cpp
index a07793f44f..6bf6ac90e7 100644
--- a/src/quick/scenegraph/qsgcontextplugin.cpp
+++ b/src/quick/scenegraph/qsgcontextplugin.cpp
@@ -61,44 +61,97 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
(QSGContextFactoryInterface_iid, QLatin1String("/scenegraph")))
#endif
-/*!
- \fn QSGContext *QSGContext::createDefaultContext()
+struct QSGAdaptionPluginData
+{
+ QSGAdaptionPluginData()
+ : tried(false)
+ , factory(0)
+ {
+ }
- Creates a default scene graph context for the current hardware.
- This may load a device-specific plugin.
-*/
-QSGContext *QSGContext::createDefaultContext()
+ ~QSGAdaptionPluginData()
+ {
+ delete factory;
+ }
+
+ bool tried;
+ QSGContextFactoryInterface *factory;
+ QString deviceName;
+};
+
+QThreadStorage<QSGAdaptionPluginData> qsg_plugin_data;
+
+
+QSGAdaptionPluginData *contextFactory()
{
- const QStringList args = QGuiApplication::arguments();
- QString device;
- for (int index = 0; index < args.count(); ++index) {
- if (args.at(index).startsWith(QLatin1String("--device="))) {
- device = args.at(index).mid(9);
- break;
+ QSGAdaptionPluginData &plugin = qsg_plugin_data.localData();
+ if (!plugin.tried) {
+ plugin.tried = true;
+ const QStringList args = QGuiApplication::arguments();
+ QString device;
+ for (int index = 0; index < args.count(); ++index) {
+ if (args.at(index).startsWith(QLatin1String("--device="))) {
+ device = args.at(index).mid(9);
+ break;
+ }
}
- }
- if (device.isEmpty())
- device = QString::fromLocal8Bit(qgetenv("QMLSCENE_DEVICE"));
- if (device.isEmpty())
- return new QSGContext();
+ if (device.isEmpty())
+ device = QString::fromLocal8Bit(qgetenv("QMLSCENE_DEVICE"));
#if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
- if (QSGContextFactoryInterface *factory
- = qobject_cast<QSGContextFactoryInterface*>
- (loader()->instance(device))) {
- QSGContext *context = factory->create(device);
- if (context)
- return context;
- }
+ if (!device.isEmpty()) {
+ plugin.factory = qobject_cast<QSGContextFactoryInterface*>(loader()->instance(device));
+ plugin.deviceName = device;
+ }
#ifndef QT_NO_DEBUG
- qWarning("Could not create scene graph context for device '%s'"
- " - check that plugins are installed correctly in %s",
- qPrintable(device),
- qPrintable(QLibraryInfo::location(QLibraryInfo::PluginsPath)));
+ if (!device.isEmpty()) {
+ qWarning("Could not create scene graph context for device '%s'"
+ " - check that plugins are installed correctly in %s",
+ qPrintable(device),
+ qPrintable(QLibraryInfo::location(QLibraryInfo::PluginsPath)));
+ }
#endif
+
#endif // QT_NO_LIBRARY || QT_NO_SETTINGS
+ }
+ return &plugin;
+}
+
+
+/*!
+ \fn QSGContext *QSGContext::createDefaultContext()
+
+ Creates a default scene graph context for the current hardware.
+ This may load a device-specific plugin.
+*/
+QSGContext *QSGContext::createDefaultContext()
+{
+ QSGAdaptionPluginData *plugin = contextFactory();
+ if (plugin->factory)
+ return plugin->factory->create(plugin->deviceName);
return new QSGContext();
}
+
+
+/*!
+ \fn QDeclarativeTextureFactory *createTextureFactoryFromImage(const QImage &image)
+
+ Calls into the scene graph adaptation if available and creates a texture
+ factory. The primary purpose of this function is to reimplement hardware
+ specific asynchronous texture frameskip-less uploads that can happen on
+ the image providers thread.
+ */
+
+QDeclarativeTextureFactory *QSGContext::createTextureFactoryFromImage(const QImage &image)
+{
+ QSGAdaptionPluginData *plugin = contextFactory();
+ if (plugin->factory)
+ return plugin->factory->createTextureFactoryFromImage(image);
+ return 0;
+}
+
+
+
QT_END_NAMESPACE