diff options
Diffstat (limited to 'src/quick/scenegraph/qsgcontext.cpp')
-rw-r--r-- | src/quick/scenegraph/qsgcontext.cpp | 66 |
1 files changed, 57 insertions, 9 deletions
diff --git a/src/quick/scenegraph/qsgcontext.cpp b/src/quick/scenegraph/qsgcontext.cpp index 8d36fce481..866d678412 100644 --- a/src/quick/scenegraph/qsgcontext.cpp +++ b/src/quick/scenegraph/qsgcontext.cpp @@ -47,13 +47,16 @@ #include <QtQuick/private/qsgdefaultimagenode_p.h> #include <QtQuick/private/qsgdefaultglyphnode_p.h> #include <QtQuick/private/qsgdistancefieldglyphnode_p.h> +#include <QtQuick/private/qsgdistancefieldglyphnode_p_p.h> #include <QtQuick/private/qsgshareddistancefieldglyphcache_p.h> +#include <QtQuick/QSGFlatColorMaterial> #include <QtQuick/private/qsgtexture_p.h> #include <QtQuick/private/qquickpixmapcache_p.h> #include <QGuiApplication> #include <QOpenGLContext> +#include <QQuickWindow> #include <QtGui/qopenglframebufferobject.h> #include <private/qqmlglobal_p.h> @@ -67,6 +70,8 @@ #include <private/qobject_p.h> #include <qmutex.h> +#include <private/qqmlprofilerservice_p.h> + DEFINE_BOOL_CONFIG_OPTION(qmlFlashMode, QML_FLASH_MODE) DEFINE_BOOL_CONFIG_OPTION(qmlTranslucentMode, QML_TRANSLUCENT_MODE) DEFINE_BOOL_CONFIG_OPTION(qmlDisableDistanceField, QML_DISABLE_DISTANCEFIELD) @@ -157,15 +162,13 @@ QSGContext::QSGContext(QObject *parent) : QObject(*(new QSGContextPrivate), parent) { Q_D(QSGContext); - static bool doSubpixel = qApp->arguments().contains(QLatin1String("--text-subpixel-antialiasing")); - static bool doLowQualSubpixel = qApp->arguments().contains(QLatin1String("--text-subpixel-antialiasing-lowq")); - static bool doGray = qApp->arguments().contains(QLatin1String("--text-gray-antialiasing")); - if (doSubpixel) + QByteArray mode = qgetenv("QSG_DISTANCEFIELD_ANTIALIASING"); + if (mode == "subpixel") d->distanceFieldAntialiasing = QSGGlyphNode::HighQualitySubPixelAntialiasing; - else if (doLowQualSubpixel) + else if (mode == "subpixel-lowq") d->distanceFieldAntialiasing = QSGGlyphNode::LowQualitySubPixelAntialiasing; - else if (doGray) - d->distanceFieldAntialiasing = QSGGlyphNode::GrayAntialiasing; + else if (mode == "gray") + d->distanceFieldAntialiasing = QSGGlyphNode::GrayAntialiasing; } @@ -260,9 +263,35 @@ void QSGContext::initialize(QOpenGLContext *context) Q_ASSERT(!d->gl); d->gl = context; + precompileMaterials(); + emit initialized(); } +#define QSG_PRECOMPILE_MATERIAL(name) { name m; prepareMaterial(&m); } + +/* + * Some glsl compilers take their time compiling materials, and + * the way the scene graph is being processed, these materials + * get compiled when they are first taken into use. This can + * easily lead to skipped frames. By precompiling the most + * common materials, we potentially add a few milliseconds to the + * start up, and reduce the chance of avoiding skipped frames + * later on. + */ +void QSGContext::precompileMaterials() +{ + if (qEnvironmentVariableIsEmpty("QSG_NO_MATERIAL_PRELOADING")) { + QSG_PRECOMPILE_MATERIAL(QSGVertexColorMaterial); + QSG_PRECOMPILE_MATERIAL(QSGFlatColorMaterial); + QSG_PRECOMPILE_MATERIAL(QSGOpaqueTextureMaterial); + QSG_PRECOMPILE_MATERIAL(QSGTextureMaterial); + QSG_PRECOMPILE_MATERIAL(QSGSmoothTextureMaterial); + QSG_PRECOMPILE_MATERIAL(QSGSmoothColorMaterial); + QSG_PRECOMPILE_MATERIAL(QSGDistanceFieldTextMaterial); + } +} + /*! Returns if the scene graph context is ready or not, meaning that it has a valid @@ -354,7 +383,11 @@ QSGDistanceFieldGlyphCache *QSGContext::distanceFieldGlyphCache(const QRawFont & */ QSGGlyphNode *QSGContext::createNativeGlyphNode() { +#if defined(QT_OPENGL_ES) && !defined(QT_OPENGL_ES_2_ANGLE) + return createGlyphNode(); +#else return new QSGDefaultGlyphNode; +#endif } /*! @@ -392,6 +425,8 @@ QSurfaceFormat QSGContext::defaultSurfaceFormat() const QSurfaceFormat format; format.setDepthBufferSize(24); format.setStencilBufferSize(8); + if (QQuickWindow::hasDefaultAlphaBuffer()) + format.setAlphaBufferSize(8); format.setSwapBehavior(QSurfaceFormat::DoubleBuffer); return format; } @@ -472,17 +507,24 @@ QSGDepthStencilBufferManager *QSGContext::depthStencilBufferManager() QSGMaterialShader *QSGContext::prepareMaterial(QSGMaterial *material) { Q_D(QSGContext); + + if (material->m_reserved) + return reinterpret_cast<QSGMaterialShader *>(material->m_reserved); + QSGMaterialType *type = material->type(); QSGMaterialShader *shader = d->materials.value(type); - if (shader) + if (shader) { + material->m_reserved = shader; return shader; + } #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) + if (qsg_render_timing || QQmlProfilerService::enabled) qsg_renderer_timer.start(); #endif shader = material->createShader(); + material->m_reserved = shader; shader->compile(); shader->initialize(); d->materials[type] = shader; @@ -490,6 +532,12 @@ QSGMaterialShader *QSGContext::prepareMaterial(QSGMaterial *material) #ifndef QSG_NO_RENDER_TIMING if (qsg_render_timing) printf(" - compiling material: %dms\n", (int) qsg_renderer_timer.elapsed()); + + if (QQmlProfilerService::enabled) { + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphContextFrame, + qsg_renderer_timer.nsecsElapsed()); + } #endif return shader; |