X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fquick%2Fscenegraph%2Fqsgcontextplugin.cpp;h=2a2268db5ca2ac2d5523f7f6b603c8d89993cd87;hb=45b14259fc0cf704692df1c00da511527d1fba1d;hp=a07793f44f8dfaee8d9ffa07f6c804142c8407c8;hpb=6c8378eaf1edbbefe6aaa3672b0127816a004fd7;p=profile%2Fivi%2Fqtdeclarative.git diff --git a/src/quick/scenegraph/qsgcontextplugin.cpp b/src/quick/scenegraph/qsgcontextplugin.cpp index a07793f..2a2268d 100644 --- a/src/quick/scenegraph/qsgcontextplugin.cpp +++ b/src/quick/scenegraph/qsgcontextplugin.cpp @@ -1,8 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -35,6 +34,7 @@ ** ** ** +** ** $QT_END_LICENSE$ ** ****************************************************************************/ @@ -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 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 - (loader()->instance(device))) { - QSGContext *context = factory->create(device); - if (context) - return context; - } + if (!device.isEmpty()) { + plugin.factory = qobject_cast(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