diff options
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/context2d/qquickcanvasitem.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/context2d/qquickcontext2d.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquickborderimage.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquickimage.cpp | 16 | ||||
-rw-r--r-- | src/quick/items/qquickitem_p.h | 7 | ||||
-rw-r--r-- | src/quick/items/qquickshadereffectsource.cpp | 31 | ||||
-rw-r--r-- | src/quick/items/qquickshadereffectsource_p.h | 5 | ||||
-rw-r--r-- | src/quick/items/qquicktext.cpp | 7 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextnode.cpp | 15 | ||||
-rw-r--r-- | src/quick/items/qquicktextnode_p.h | 3 | ||||
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 34 | ||||
-rw-r--r-- | src/quick/items/qquickwindow_p.h | 2 |
14 files changed, 58 insertions, 72 deletions
diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp index d9feb8d8eb..ba3592986c 100644 --- a/src/quick/items/context2d/qquickcanvasitem.cpp +++ b/src/quick/items/context2d/qquickcanvasitem.cpp @@ -112,7 +112,7 @@ QSGTexture *QQuickCanvasPixmap::texture() Q_ASSERT(m_pixmap->textureFactory()); m_texture = m_pixmap->textureFactory()->createTexture(m_window); } else { - m_texture = QQuickWindowPrivate::get(m_window)->context->createTexture(m_image); + m_texture = m_window->createTextureFromImage(m_image, QQuickWindow::TextureCanUseAtlas); } } return m_texture; diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp index 2b2504daf2..3088c41cd7 100644 --- a/src/quick/items/context2d/qquickcontext2d.cpp +++ b/src/quick/items/context2d/qquickcontext2d.cpp @@ -4112,7 +4112,7 @@ void QQuickContext2D::init(QQuickCanvasItem *canvasItem, const QVariantMap &args m_texture->moveToThread(renderThread); if (m_renderTarget == QQuickCanvasItem::FramebufferObject && renderThread != sceneGraphThread) { - QOpenGLContext *cc = QQuickWindowPrivate::get(window)->context->glContext(); + QOpenGLContext *cc = QQuickWindowPrivate::get(window)->context->openglContext(); m_surface = window; m_glContext = new QOpenGLContext; m_glContext->setFormat(cc->format()); diff --git a/src/quick/items/qquickborderimage.cpp b/src/quick/items/qquickborderimage.cpp index a2e4e91755..0bed5e96a2 100644 --- a/src/quick/items/qquickborderimage.cpp +++ b/src/quick/items/qquickborderimage.cpp @@ -551,7 +551,7 @@ QSGNode *QQuickBorderImage::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeDat { Q_D(QQuickBorderImage); - QSGTexture *texture = d->sceneGraphContext()->textureForFactory(d->pix.textureFactory(), window()); + QSGTexture *texture = d->sceneGraphRenderContext()->textureForFactory(d->pix.textureFactory(), window()); if (!texture || width() <= 0 || height() <= 0) { delete oldNode; diff --git a/src/quick/items/qquickimage.cpp b/src/quick/items/qquickimage.cpp index d6be13f3c0..0708304051 100644 --- a/src/quick/items/qquickimage.cpp +++ b/src/quick/items/qquickimage.cpp @@ -532,17 +532,17 @@ QRectF QQuickImage::boundingRect() const QSGTextureProvider *QQuickImage::textureProvider() const { Q_D(const QQuickImage); + + if (!d->window || !d->sceneGraphRenderContext() || QThread::currentThread() != d->sceneGraphRenderContext()->thread()) { + qWarning("QQuickImage::textureProvider: can only be queried on the rendering thread of an exposed window"); + return 0; + } + if (!d->provider) { - // Make sure it gets thread affinity on the rendering thread so deletion works properly.. - Q_ASSERT_X(d->window - && d->sceneGraphContext() - && QThread::currentThread() == d->sceneGraphContext()->thread(), - "QQuickImage::textureProvider", - "Cannot be used outside the GUI thread"); QQuickImagePrivate *dd = const_cast<QQuickImagePrivate *>(d); dd->provider = new QQuickImageTextureProvider; dd->provider->m_smooth = d->smooth; - dd->provider->m_texture = d->sceneGraphContext()->textureForFactory(d->pix.textureFactory(), window()); + dd->provider->m_texture = d->sceneGraphRenderContext()->textureForFactory(d->pix.textureFactory(), window()); } return d->provider; @@ -552,7 +552,7 @@ QSGNode *QQuickImage::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) { Q_D(QQuickImage); - QSGTexture *texture = d->sceneGraphContext()->textureForFactory(d->pix.textureFactory(), window()); + QSGTexture *texture = d->sceneGraphRenderContext()->textureForFactory(d->pix.textureFactory(), window()); // Copy over the current texture state into the texture provider... if (d->provider) { diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h index f731acabbb..7faf39f8e5 100644 --- a/src/quick/items/qquickitem_p.h +++ b/src/quick/items/qquickitem_p.h @@ -468,6 +468,7 @@ public: QQuickWindow *window; int windowRefCount; inline QSGContext *sceneGraphContext() const; + inline QSGRenderContext *sceneGraphRenderContext() const; QQuickItem *parentItem; QQmlNotifier parentNotifier; @@ -840,6 +841,12 @@ Qt::MouseButtons QQuickItemPrivate::acceptedMouseButtons() const QSGContext *QQuickItemPrivate::sceneGraphContext() const { Q_ASSERT(window); + return static_cast<QQuickWindowPrivate *>(QObjectPrivate::get(window))->context->sceneGraphContext(); +} + +QSGRenderContext *QQuickItemPrivate::sceneGraphRenderContext() const +{ + Q_ASSERT(window); return static_cast<QQuickWindowPrivate *>(QObjectPrivate::get(window))->context; } diff --git a/src/quick/items/qquickshadereffectsource.cpp b/src/quick/items/qquickshadereffectsource.cpp index e86550d731..c05545c292 100644 --- a/src/quick/items/qquickshadereffectsource.cpp +++ b/src/quick/items/qquickshadereffectsource.cpp @@ -45,6 +45,7 @@ #include "qquickwindow_p.h" #include <private/qsgadaptationlayer_p.h> #include <QtQuick/private/qsgrenderer_p.h> +#include <qsgsimplerectnode.h> #include "qopenglframebufferobject.h" #include "qmath.h" @@ -143,7 +144,7 @@ QQuickShaderEffectTexture::QQuickShaderEffectTexture(QQuickItem *shaderSource) #ifdef QSG_DEBUG_FBO_OVERLAY , m_debugOverlay(0) #endif - , m_context(QQuickItemPrivate::get(shaderSource)->sceneGraphContext()) + , m_context(QQuickItemPrivate::get(shaderSource)->sceneGraphRenderContext()) , m_mipmap(false) , m_live(true) , m_recursive(false) @@ -326,7 +327,7 @@ void QQuickShaderEffectTexture::grab() || (!m_fbo->format().mipmap() && m_mipmap)) { if (!m_multisamplingChecked) { - if (m_context->glContext()->format().samples() <= 1) { + if (m_context->openglContext()->format().samples() <= 1) { m_multisampling = false; } else { QList<QByteArray> extensions = QByteArray((const char *)glGetString(GL_EXTENSIONS)).split(' '); @@ -342,7 +343,7 @@ void QQuickShaderEffectTexture::grab() QOpenGLFramebufferObjectFormat format; format.setInternalTextureFormat(m_format); - format.setSamples(m_context->glContext()->format().samples()); + format.setSamples(m_context->openglContext()->format().samples()); m_secondaryFbo = new QOpenGLFramebufferObject(m_size, format); m_depthStencilBuffer = m_context->depthStencilBufferForFbo(m_secondaryFbo); } else { @@ -385,20 +386,16 @@ void QQuickShaderEffectTexture::grab() #ifdef QSG_DEBUG_FBO_OVERLAY if (qmlFboOverlay()) { if (!m_debugOverlay) - m_debugOverlay = m_context->createRectangleNode(); + m_debugOverlay = new QSGSimpleRectNode(); m_debugOverlay->setRect(QRectF(0, 0, m_size.width(), m_size.height())); m_debugOverlay->setColor(QColor(0xff, 0x00, 0x80, 0x40)); - m_debugOverlay->setPenColor(QColor()); - m_debugOverlay->setPenWidth(0); - m_debugOverlay->setRadius(0); - m_debugOverlay->update(); root->appendChildNode(m_debugOverlay); } #endif m_dirtyTexture = false; - QOpenGLContext *ctx = m_context->glContext(); + QOpenGLContext *ctx = m_context->openglContext(); m_renderer->setDeviceRect(m_size); m_renderer->setViewportRect(m_size); QRectF mirrored(m_rect.left(), m_rect.bottom(), m_rect.width(), -m_rect.height()); @@ -591,8 +588,8 @@ void QQuickShaderEffectSource::ensureTexture() return; Q_ASSERT_X(QQuickItemPrivate::get(this)->window - && QQuickItemPrivate::get(this)->sceneGraphContext() - && QThread::currentThread() == QQuickItemPrivate::get(this)->sceneGraphContext()->thread(), + && QQuickItemPrivate::get(this)->sceneGraphRenderContext() + && QThread::currentThread() == QQuickItemPrivate::get(this)->sceneGraphRenderContext()->thread(), "QQuickShaderEffectSource::ensureTexture", "Cannot be used outside the rendering thread"); @@ -603,13 +600,13 @@ void QQuickShaderEffectSource::ensureTexture() QSGTextureProvider *QQuickShaderEffectSource::textureProvider() const { + const QQuickItemPrivate *d = QQuickItemPrivate::get(this); + if (!d->window || !d->sceneGraphRenderContext() || QThread::currentThread() != d->sceneGraphRenderContext()->thread()) { + qWarning("QQuickShaderEffectSource::textureProvider: can only be queried on the rendering thread of an exposed window"); + return 0; + } + if (!m_provider) { - // Make sure it gets thread affinity on the rendering thread so deletion works properly.. - Q_ASSERT_X(QQuickItemPrivate::get(this)->window - && QQuickItemPrivate::get(this)->sceneGraphContext() - && QThread::currentThread() == QQuickItemPrivate::get(this)->sceneGraphContext()->thread(), - "QQuickShaderEffectSource::textureProvider", - "Cannot be used outside the rendering thread"); const_cast<QQuickShaderEffectSource *>(this)->m_provider = new QQuickShaderEffectSourceTextureProvider(); const_cast<QQuickShaderEffectSource *>(this)->ensureTexture(); connect(m_texture, SIGNAL(updateRequested()), m_provider, SIGNAL(textureChanged())); diff --git a/src/quick/items/qquickshadereffectsource_p.h b/src/quick/items/qquickshadereffectsource_p.h index 7d1a9b7304..85b58e67e4 100644 --- a/src/quick/items/qquickshadereffectsource_p.h +++ b/src/quick/items/qquickshadereffectsource_p.h @@ -60,6 +60,7 @@ QT_BEGIN_NAMESPACE class QSGNode; class UpdatePaintNodeData; class QOpenGLFramebufferObject; +class QSGSimpleRectNode; class QQuickShaderEffectSourceTextureProvider; @@ -139,10 +140,10 @@ private: QSharedPointer<QSGDepthStencilBuffer> m_depthStencilBuffer; #ifdef QSG_DEBUG_FBO_OVERLAY - QSGRectangleNode *m_debugOverlay; + QSGSimpleRectNode *m_debugOverlay; #endif - QSGContext *m_context; + QSGRenderContext *m_context; uint m_mipmap : 1; uint m_live : 1; diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index fbda2df2dc..6335c83b2b 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -2241,11 +2241,10 @@ QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data const qreal dy = QQuickTextUtil::alignedY(d->layedOutTextRect.height(), height(), d->vAlign); QQuickTextNode *node = 0; - if (!oldNode) { - node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); - } else { + if (!oldNode) + node = new QQuickTextNode(this); + else node = static_cast<QQuickTextNode *>(oldNode); - } node->setUseNativeRenderer(d->renderType == NativeRendering && d->window->devicePixelRatio() <= 1); node->deleteContent(); diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index be2cd37dee..ffc732621d 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -2370,7 +2370,7 @@ void QQuickTextEditPrivate::addCurrentTextNodeToRoot(QSGTransformNode *root, QQu QQuickTextNode *QQuickTextEditPrivate::createTextNode() { Q_Q(QQuickTextEdit); - QQuickTextNode* node = new QQuickTextNode(QQuickItemPrivate::get(q)->sceneGraphContext(), q); + QQuickTextNode* node = new QQuickTextNode(q); node->setUseNativeRenderer(renderType == QQuickTextEdit::NativeRendering && window->devicePixelRatio() <= 1); node->initEngine(color, selectedTextColor, selectionColor); return node; diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index 1848fbb80b..93ea677d2c 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -1834,7 +1834,7 @@ QSGNode *QQuickTextInput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData QQuickTextNode *node = static_cast<QQuickTextNode *>(oldNode); if (node == 0) - node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); + node = new QQuickTextNode(this); d->textNode = node; if (!d->textLayoutDirty && oldNode != 0) { diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp index 1f4ca34b13..6acfaaf396 100644 --- a/src/quick/items/qquicktextnode.cpp +++ b/src/quick/items/qquicktextnode.cpp @@ -47,6 +47,7 @@ #include <private/qsgadaptationlayer_p.h> #include <private/qsgdistancefieldglyphnode_p.h> #include <private/qquickclipnode_p.h> +#include <private/qquickitem_p.h> #include <QtQuick/private/qsgcontext_p.h> #include <QtCore/qpoint.h> @@ -80,8 +81,8 @@ namespace { /*! Creates an empty QQuickTextNode */ -QQuickTextNode::QQuickTextNode(QSGContext *context, QQuickItem *ownerElement) - : m_context(context), m_cursorNode(0), m_ownerElement(ownerElement), m_useNativeRenderer(false) +QQuickTextNode::QQuickTextNode(QQuickItem *ownerElement) + : m_cursorNode(0), m_ownerElement(ownerElement), m_useNativeRenderer(false) { #ifdef QSG_RUNTIME_DESCRIPTION qsgnode_set_description(this, QLatin1String("text")); @@ -141,9 +142,10 @@ QSGGlyphNode *QQuickTextNode::addGlyphs(const QPointF &position, const QGlyphRun QQuickText::TextStyle style, const QColor &styleColor, QSGNode *parentNode) { + QSGRenderContext *sg = QQuickItemPrivate::get(m_ownerElement)->sceneGraphRenderContext(); QSGGlyphNode *node = m_useNativeRenderer - ? m_context->createNativeGlyphNode() - : m_context->createGlyphNode(); + ? sg->sceneGraphContext()->createNativeGlyphNode(sg) + : sg->sceneGraphContext()->createGlyphNode(sg); node->setOwnerElement(m_ownerElement); node->setGlyphs(position + QPointF(0, glyphs.rawFont().ascent()), glyphs); node->setStyle(style); @@ -189,8 +191,9 @@ void QQuickTextNode::initEngine(const QColor& textColor, const QColor& selectedT void QQuickTextNode::addImage(const QRectF &rect, const QImage &image) { - QSGImageNode *node = m_context->createImageNode(); - QSGTexture *texture = m_context->createTexture(image); + QSGRenderContext *sg = QQuickItemPrivate::get(m_ownerElement)->sceneGraphRenderContext(); + QSGImageNode *node = sg->sceneGraphContext()->createImageNode(); + QSGTexture *texture = sg->createTexture(image); m_textures.append(texture); node->setTargetRect(rect); node->setInnerTargetRect(rect); diff --git a/src/quick/items/qquicktextnode_p.h b/src/quick/items/qquicktextnode_p.h index 64f396eb10..0bff0d5cff 100644 --- a/src/quick/items/qquicktextnode_p.h +++ b/src/quick/items/qquicktextnode_p.h @@ -77,7 +77,7 @@ public: }; Q_DECLARE_FLAGS(Decorations, Decoration) - QQuickTextNode(QSGContext *, QQuickItem *ownerElement); + QQuickTextNode(QQuickItem *ownerElement); ~QQuickTextNode(); static bool isComplexRichText(QTextDocument *); @@ -110,7 +110,6 @@ private: void initEngine(const QColor &textColor, const QColor &selectedTextColor, const QColor &selectionColor, const QColor& anchorColor = QColor() , const QPointF &position = QPointF()); - QSGContext *m_context; QSGSimpleRectNode *m_cursorNode; QList<QSGTexture *> m_textures; QQuickItem *m_ownerElement; diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index fd0313aed5..ed97325c85 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -50,8 +50,6 @@ #include <QtQuick/private/qsgrenderer_p.h> #include <QtQuick/private/qsgtexture_p.h> -#include <QtQuick/private/qsgflashnode_p.h> - #include <private/qsgrenderloop_p.h> #include <private/qquickanimatorcontroller_p.h> @@ -416,9 +414,10 @@ void QQuickWindowPrivate::init(QQuickWindow *c) contentItemPrivate->flags |= QQuickItem::ItemIsFocusScope; windowManager = QSGRenderLoop::instance(); - context = windowManager->sceneGraphContext(); + QSGContext *sg = windowManager->sceneGraphContext(); + context = windowManager->createRenderContext(sg); q->setSurfaceType(QWindow::OpenGLSurface); - q->setFormat(context->defaultSurfaceFormat()); + q->setFormat(sg->defaultSurfaceFormat()); animationController = new QQuickAnimatorController(); animationController->window = q; @@ -2319,10 +2318,6 @@ void QQuickWindowPrivate::updateDirtyNodes() void QQuickWindowPrivate::updateDirtyNode(QQuickItem *item) { -#ifdef QML_RUNTIME_TESTING - bool didFlash = false; -#endif - QQuickItemPrivate *itemPriv = QQuickItemPrivate::get(item); quint32 dirty = itemPriv->dirtyAttributes; itemPriv->dirtyAttributes = 0; @@ -2546,19 +2541,6 @@ void QQuickWindowPrivate::updateDirtyNode(QQuickItem *item) } #endif -#ifdef QML_RUNTIME_TESTING - if (itemPriv->sceneGraphContext()->isFlashModeEnabled()) { - QSGFlashNode *flash = new QSGFlashNode(); - flash->setRect(item->boundingRect()); - itemPriv->childContainerNode()->appendChildNode(flash); - didFlash = true; - } - Q_Q(QQuickWindow); - if (didFlash) { - q->maybeUpdate(); - } -#endif - } void QQuickWindow::maybeUpdate() @@ -2598,9 +2580,7 @@ void QQuickWindow::setTransientParent_helper(QQuickWindow *window) QOpenGLContext *QQuickWindow::openglContext() const { Q_D(const QQuickWindow); - if (d->context->isReady()) - return d->context->glContext(); - return 0; + return d->context->openglContext(); } /*! @@ -2796,7 +2776,7 @@ QImage QQuickWindow::grabWindow() Q_D(QQuickWindow); if (!isVisible()) { - if (d->context->isReady()) { + if (d->context->openglContext()) { qWarning("QQuickWindow::grabWindow: scene graph already in use"); return QImage(); } @@ -2993,7 +2973,7 @@ QSGTexture *QQuickWindow::createTextureFromImage(const QImage &image) const QSGTexture *QQuickWindow::createTextureFromImage(const QImage &image, CreateTextureOptions options) const { Q_D(const QQuickWindow); - if (d->context && d->context->isReady()) { + if (d->context && d->context->openglContext()) { if (options & TextureCanUseAtlas) return d->context->createTexture(image); else @@ -3021,7 +3001,7 @@ QSGTexture *QQuickWindow::createTextureFromImage(const QImage &image, CreateText QSGTexture *QQuickWindow::createTextureFromId(uint id, const QSize &size, CreateTextureOptions options) const { Q_D(const QQuickWindow); - if (d->context && d->context->isReady()) { + if (d->context && d->context->openglContext()) { QSGPlainTexture *texture = new QSGPlainTexture(); texture->setTextureId(id); texture->setHasAlphaChannel(options & TextureHasAlphaChannel); diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index c02f7107d4..2cf98bfe21 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -194,7 +194,7 @@ public: void fireFrameSwapped() { Q_EMIT q_func()->frameSwapped(); } - QSGContext *context; + QSGRenderContext *context; QSGRenderer *renderer; QSGRenderLoop *windowManager; |