diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-11-15 01:02:20 +0100 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-11-15 01:02:20 +0100 |
commit | 0ee087f5a5edd7d1aa39fd15e0dc85985320c09a (patch) | |
tree | a998054898e2013407f38b4b6ea267d7f912bd21 /src | |
parent | cd78e8cd862a819ae2683ed98a131f2582e18609 (diff) | |
parent | b6b1d5899415fef3231120c08c56a1dc2e246940 (diff) |
Merge remote-tracking branch 'origin/5.15' into dev
Change-Id: Ibb3be39cbdaf363f017fdfd62e4647acbc3443cb
Diffstat (limited to 'src')
-rw-r--r-- | src/qmltyperegistrar/qmltyperegistrar.pro | 12 | ||||
-rw-r--r-- | src/qmltyperegistrar/qmltypes.prf | 13 | ||||
-rw-r--r-- | src/quick/items/qquickanimatedsprite.cpp | 35 | ||||
-rw-r--r-- | src/quick/items/qquickanimatedsprite_p.h | 11 | ||||
-rw-r--r-- | src/quick/items/qquickanimatedsprite_p_p.h | 5 | ||||
-rw-r--r-- | src/quick/items/qquickframebufferobject.cpp | 30 | ||||
-rw-r--r-- | src/quick/items/qquickframebufferobject.h | 3 | ||||
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 13 |
8 files changed, 101 insertions, 21 deletions
diff --git a/src/qmltyperegistrar/qmltyperegistrar.pro b/src/qmltyperegistrar/qmltyperegistrar.pro index 8f4235c015..dff8f00ca3 100644 --- a/src/qmltyperegistrar/qmltyperegistrar.pro +++ b/src/qmltyperegistrar/qmltyperegistrar.pro @@ -18,7 +18,15 @@ HEADERS += \ build_integration.files = qmltypes.prf build_integration.path = $$[QT_HOST_DATA]/mkspecs/features -prefix_build: INSTALLS += build_integration -else: COPIES += build_integration + +prefix_build { + load(qt_build_paths) + qmltypes_to_builddir.files = qmltypes.prf + qmltypes_to_builddir.path = $$MODULE_BASE_OUTDIR/mkspecs/features + COPIES += qmltypes_to_builddir + INSTALLS += build_integration +} else { + COPIES += build_integration +} load(qt_tool) diff --git a/src/qmltyperegistrar/qmltypes.prf b/src/qmltyperegistrar/qmltypes.prf index 4fed3c69c7..ed11ef44cf 100644 --- a/src/qmltyperegistrar/qmltypes.prf +++ b/src/qmltyperegistrar/qmltypes.prf @@ -39,8 +39,17 @@ qt_module_deps += $$replace(QT_PRIVATE, -private$, '') qt_module_deps = $$replace(qt_module_deps, _private$, '') all_qt_module_deps = $$resolve_depends(qt_module_deps, "QT.", ".depends" ".run_depends") foreign_types = -for(dep, all_qt_module_deps): \ - foreign_types += $$[QT_INSTALL_LIBS]/metatypes/$$lower($$eval(QT.$${dep}.module))_metatypes.json +for(dep, all_qt_module_deps) { + METATYPES_FILENAME = $$lower($$eval(QT.$${dep}.module))_metatypes.json + INSTALLED_METATYPES = $$[QT_INSTALL_LIBS]/metatypes/$$METATYPES_FILENAME + isEmpty(MODULE_BASE_OUTDIR) { + foreign_types += $$INSTALLED_METATYPES + } else { + MODULE_BASE_METATYPES = $$MODULE_BASE_OUTDIR/lib/metatypes/$$METATYPES_FILENAME + exists($$MODULE_BASE_METATYPES): foreign_types += $$MODULE_BASE_METATYPES + else: foreign_types += $$INSTALLED_METATYPES + } +} QML_TYPEREGISTRAR_FLAGS = \ --generate-plugintypes=$$QMLTYPES_FILENAME \ diff --git a/src/quick/items/qquickanimatedsprite.cpp b/src/quick/items/qquickanimatedsprite.cpp index 21c09f898d..b285fe56ed 100644 --- a/src/quick/items/qquickanimatedsprite.cpp +++ b/src/quick/items/qquickanimatedsprite.cpp @@ -263,6 +263,19 @@ QT_BEGIN_NAMESPACE */ /*! + \qmlproperty enumeration QtQuick::AnimatedSprite::finishBehavior + + The behavior when the animation finishes on its own. + + \value FinishAtInitialFrame + When the animation finishes it returns to the initial frame. + This is the default behavior. + + \value FinishAtFinalFrame + When the animation finishes it stays on the final frame. +*/ + +/*! \qmlmethod int QtQuick::AnimatedSprite::restart() Stops, then starts the sprite animation. @@ -381,6 +394,12 @@ int QQuickAnimatedSprite::currentFrame() const return d->m_curFrame; } +QQuickAnimatedSprite::FinishBehavior QQuickAnimatedSprite::finishBehavior() const +{ + Q_D(const QQuickAnimatedSprite); + return d->m_finishBehavior; +} + bool QQuickAnimatedSprite::isCurrentFrameChangedConnected() { IS_SIGNAL_CONNECTED(this, QQuickAnimatedSprite, currentFrameChanged, (int)); @@ -704,6 +723,16 @@ void QQuickAnimatedSprite::setCurrentFrame(int arg) //TODO-C: Probably only work } } +void QQuickAnimatedSprite::setFinishBehavior(FinishBehavior arg) +{ + Q_D(QQuickAnimatedSprite); + + if (d->m_finishBehavior != arg) { + d->m_finishBehavior = arg; + Q_EMIT finishBehaviorChanged(arg); + } +} + void QQuickAnimatedSprite::createEngine() { Q_D(QQuickAnimatedSprite); @@ -838,7 +867,11 @@ void QQuickAnimatedSprite::prepareNextFrame(QSGSpriteNode *node) progress = 0; } if (d->m_loops > 0 && d->m_curLoop >= d->m_loops) { - frameAt = 0; + if (d->m_finishBehavior == FinishAtInitialFrame) + frameAt = 0; + else + frameAt = frameCount() - 1; + d->m_curFrame = frameAt; d->m_running = false; emit runningChanged(false); emit finished(); diff --git a/src/quick/items/qquickanimatedsprite_p.h b/src/quick/items/qquickanimatedsprite_p.h index 30f64e9def..c28b6ce3af 100644 --- a/src/quick/items/qquickanimatedsprite_p.h +++ b/src/quick/items/qquickanimatedsprite_p.h @@ -92,6 +92,7 @@ class Q_AUTOTEST_EXPORT QQuickAnimatedSprite : public QQuickItem Q_PROPERTY(int loops READ loops WRITE setLoops NOTIFY loopsChanged) Q_PROPERTY(bool paused READ paused WRITE setPaused NOTIFY pausedChanged) Q_PROPERTY(int currentFrame READ currentFrame WRITE setCurrentFrame NOTIFY currentFrameChanged) + Q_PROPERTY(FinishBehavior finishBehavior READ finishBehavior WRITE setFinishBehavior NOTIFY finishBehaviorChanged REVISION 15) QML_NAMED_ELEMENT(AnimatedSprite) public: @@ -101,6 +102,12 @@ public: }; Q_ENUM(LoopParameters) + enum FinishBehavior { + FinishAtInitialFrame, + FinishAtFinalFrame + }; + Q_ENUM(FinishBehavior) + bool running() const; bool interpolate() const; QUrl source() const; @@ -116,6 +123,7 @@ public: int loops() const; bool paused() const; int currentFrame() const; + FinishBehavior finishBehavior() const; Q_SIGNALS: @@ -135,6 +143,7 @@ Q_SIGNALS: void frameDurationChanged(int arg); void loopsChanged(int arg); void currentFrameChanged(int arg); + Q_REVISION(15) void finishBehaviorChanged(FinishBehavior arg); Q_REVISION(12) void finished(); @@ -163,7 +172,7 @@ public Q_SLOTS: void resetFrameDuration(); void setLoops(int arg); void setCurrentFrame(int arg); - + void setFinishBehavior(FinishBehavior arg); private Q_SLOTS: void createEngine(); diff --git a/src/quick/items/qquickanimatedsprite_p_p.h b/src/quick/items/qquickanimatedsprite_p_p.h index 3610e58861..fb8faefbee 100644 --- a/src/quick/items/qquickanimatedsprite_p_p.h +++ b/src/quick/items/qquickanimatedsprite_p_p.h @@ -57,11 +57,10 @@ QT_REQUIRE_CONFIG(quick_sprite); #include "qquickitem_p.h" #include "qquicksprite_p.h" +#include "qquickanimatedsprite_p.h" QT_BEGIN_NAMESPACE -class QQuickAnimatedSprite; - class QQuickAnimatedSpritePrivate : public QQuickItemPrivate { Q_DECLARE_PUBLIC(QQuickAnimatedSprite) @@ -78,6 +77,7 @@ public: , m_loops(-1) , m_curLoop(0) , m_pauseOffset(0) + , m_finishBehavior(QQuickAnimatedSprite::FinishAtInitialFrame) { } @@ -93,6 +93,7 @@ public: int m_loops; int m_curLoop; int m_pauseOffset; + QQuickAnimatedSprite::FinishBehavior m_finishBehavior; }; QT_END_NAMESPACE diff --git a/src/quick/items/qquickframebufferobject.cpp b/src/quick/items/qquickframebufferobject.cpp index 190bc6853c..d5550e78b6 100644 --- a/src/quick/items/qquickframebufferobject.cpp +++ b/src/quick/items/qquickframebufferobject.cpp @@ -83,6 +83,11 @@ public: * Everything that relates to rendering must be located in the * QQuickFramebufferObject::Renderer class. * + * \warning This class is only functional when Qt Quick is rendering + * via OpenGL, either directly or through the \l{Scene Graph + * Adaptations}{RHI-based rendering path}. It is not compatible with + * other RHI backends, such as, Vulkan or Metal. + * * To avoid race conditions and read/write issues from two threads * it is important that the renderer and the item never read or * write shared variables. Communication between the item and the renderer @@ -109,10 +114,6 @@ public: * and can be used directly in \l {ShaderEffect}{ShaderEffects} and other * classes that consume texture providers. * - * \warning This class is only suitable when working directly with OpenGL. It - * is not compatible with the \l{Scene Graph Adaptations}{RHI-based rendering - * path}. - * * \sa {Scene Graph - Rendering FBOs}, {Scene Graph and Rendering} */ @@ -233,6 +234,13 @@ public Q_SLOTS: { if (renderPending) { renderPending = false; + + const bool needsWrap = QSGRendererInterface::isApiRhiBased(window->rendererInterface()->graphicsApi()); + if (needsWrap) { + window->beginExternalCommands(); + window->resetOpenGLState(); + } + fbo->bind(); QOpenGLContext::currentContext()->functions()->glViewport(0, 0, fbo->width(), fbo->height()); renderer->render(); @@ -241,6 +249,9 @@ public Q_SLOTS: if (msDisplayFbo) QOpenGLFramebufferObject::blitFramebuffer(msDisplayFbo, fbo); + if (needsWrap) + window->endExternalCommands(); + markDirty(QSGNode::DirtyMaterial); emit textureChanged(); } @@ -270,7 +281,8 @@ public: static inline bool isOpenGL(QSGRenderContext *rc) { QSGRendererInterface *rif = rc->sceneGraphContext()->rendererInterface(rc); - return !rif || rif->graphicsApi() == QSGRendererInterface::OpenGL; + return rif && (rif->graphicsApi() == QSGRendererInterface::OpenGL + || rif->graphicsApi() == QSGRendererInterface::OpenGLRhi); } /*! @@ -335,9 +347,11 @@ QSGNode *QQuickFramebufferObject::updatePaintNode(QSGNode *node, UpdatePaintNode displayTexture = n->msDisplayFbo->texture(); } - n->setTexture(window()->createTextureFromId(displayTexture, - n->fbo->size(), - QQuickWindow::TextureHasAlphaChannel)); + QSGTexture *wrapper = window()->createTextureFromNativeObject(QQuickWindow::NativeObjectTexture, + &displayTexture, 0, + n->fbo->size(), + QQuickWindow::TextureHasAlphaChannel); + n->setTexture(wrapper); } n->setTextureCoordinatesTransform(d->mirrorVertically ? QSGSimpleTextureNode::MirrorVertically : QSGSimpleTextureNode::NoTransform); diff --git a/src/quick/items/qquickframebufferobject.h b/src/quick/items/qquickframebufferobject.h index db143e48cf..e26c8293a6 100644 --- a/src/quick/items/qquickframebufferobject.h +++ b/src/quick/items/qquickframebufferobject.h @@ -48,7 +48,8 @@ class QOpenGLFramebufferObject; class QQuickFramebufferObjectPrivate; class QSGFramebufferObjectNode; -// ### Qt 6: To be removed. To be seen if an alternative will need to be introduced. +// ### Qt 6: Consider what to do here. QQuickFbo supports both direct OpenGL and +// OpenGL via QRhi, but it cannot function when running with another rhi backend. class Q_QUICK_EXPORT QQuickFramebufferObject : public QQuickItem { diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index cb4656874d..9b45750a3b 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -4735,8 +4735,7 @@ void QQuickWindow::setDefaultAlphaBuffer(bool useAlpha) adaptation. \note This function has no effect when running on the RHI graphics - abstraction. With the RHI, the functions to call when enqueuing native - graphics commands are beginExternalCommands() and endExternalCommands(). + abstraction and the underlying RHI backend is not OpenGL. \sa QQuickWindow::beforeRendering(), beginExternalCommands(), endExternalCommands() */ @@ -4744,7 +4743,7 @@ void QQuickWindow::resetOpenGLState() { Q_D(QQuickWindow); - if (d->rhi || !openglContext()) + if (!openglContext()) return; QOpenGLContext *ctx = openglContext(); @@ -4859,7 +4858,13 @@ const QQuickWindow::GraphicsStateInfo &QQuickWindow::graphicsStateInfo() directly and the RHI graphics abstraction layer is not in use. Refer to resetOpenGLState() in that case. - \sa endExternalCommands() + \note When the scenegraph is using the RHI graphics abstraction layer with + the OpenGL backend underneath, pay attention to the fact that the OpenGL + state in the context can have arbitrary settings, and this function does not + perform any resetting of the state back to defaults. Call + resetOpenGLState() if that is seen necessary. + + \sa endExternalCommands(), resetOpenGLState() \since 5.14 */ |