diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2019-09-05 11:08:59 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-09-05 11:08:59 +0200 |
commit | 2746518c76e02c642ff29faf568de4de90216e58 (patch) | |
tree | 822a6d979c13b6450c221b2a45ccfb6674bcb8e4 /src/quick/scenegraph/util | |
parent | 9e32b23a1514f367921b4a9ee25bc864a008463c (diff) | |
parent | bdf0a46c289298f7378796d62ae5fb283e08657d (diff) | |
download | qtdeclarative-wip/qt6.tar.gz |
Merge remote-tracking branch 'origin/dev' into wip/qt6wip/qt6
Conflicts:
.qmake.conf
src/qml/qml/qqmlengine.cpp
src/qmlmodels/qqmlmodelsmodule.cpp
Change-Id: Id60420f8250a9c97fcfe56d4eea19b62c6870404
Diffstat (limited to 'src/quick/scenegraph/util')
-rw-r--r-- | src/quick/scenegraph/util/qsgdepthstencilbuffer.cpp | 4 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgengine.cpp | 4 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgengine.h | 2 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgplaintexture.cpp | 32 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgplaintexture_p.h | 4 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgrhinativetextureimporter.cpp | 104 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgrhinativetextureimporter_p.h | 70 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgtexturematerial.cpp | 1 |
8 files changed, 220 insertions, 1 deletions
diff --git a/src/quick/scenegraph/util/qsgdepthstencilbuffer.cpp b/src/quick/scenegraph/util/qsgdepthstencilbuffer.cpp index a850f72053..1154c06d7c 100644 --- a/src/quick/scenegraph/util/qsgdepthstencilbuffer.cpp +++ b/src/quick/scenegraph/util/qsgdepthstencilbuffer.cpp @@ -183,7 +183,9 @@ void QSGDefaultDepthStencilBuffer::free() QSGDepthStencilBufferManager::~QSGDepthStencilBufferManager() { for (Hash::const_iterator it = m_buffers.constBegin(), cend = m_buffers.constEnd(); it != cend; ++it) { - QSGDepthStencilBuffer *buffer = it.value().toStrongRef().data(); + QSharedPointer<QSGDepthStencilBuffer> buffer = it.value().toStrongRef(); + Q_ASSERT_X(buffer, "~QSGDepthStencilBufferManager", + "~QSGDepthStencilBuffer is supposed to unregister from the manager"); buffer->free(); buffer->m_manager = nullptr; } diff --git a/src/quick/scenegraph/util/qsgengine.cpp b/src/quick/scenegraph/util/qsgengine.cpp index c05005c467..4880d98871 100644 --- a/src/quick/scenegraph/util/qsgengine.cpp +++ b/src/quick/scenegraph/util/qsgengine.cpp @@ -69,6 +69,10 @@ QT_BEGIN_NAMESPACE Most of the time you will instead want to subclass QQuickItem and insert your QSGNode in a normal QtQuick scene by overriding QQuickItem::updatePaintNode(). + \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 QSGAbstractRenderer */ diff --git a/src/quick/scenegraph/util/qsgengine.h b/src/quick/scenegraph/util/qsgengine.h index e48b7784ae..c5a59b47e7 100644 --- a/src/quick/scenegraph/util/qsgengine.h +++ b/src/quick/scenegraph/util/qsgengine.h @@ -54,6 +54,8 @@ class QSGRectangleNode; class QSGImageNode; class QSGNinePatchNode; +// ### Qt 6: Remove or redesign. + class Q_QUICK_EXPORT QSGEngine : public QObject { Q_OBJECT diff --git a/src/quick/scenegraph/util/qsgplaintexture.cpp b/src/quick/scenegraph/util/qsgplaintexture.cpp index 4c2b452b45..fdebe03494 100644 --- a/src/quick/scenegraph/util/qsgplaintexture.cpp +++ b/src/quick/scenegraph/util/qsgplaintexture.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qsgplaintexture_p.h" +#include "qsgrhinativetextureimporter_p.h" #include <QtQuick/private/qsgcontext_p.h> #include <qmath.h> #include <private/qquickprofiler_p.h> @@ -274,6 +275,24 @@ void QSGPlainTexture::setTexture(QRhiTexture *texture) // RHI only m_mipmaps_generated = false; } +void QSGPlainTexture::setTextureFromNativeObject(QRhi *rhi, QQuickWindow::NativeObjectType type, + const void *nativeObjectPtr, int nativeLayout, + const QSize &size, bool mipmap) +{ + Q_UNUSED(type); + + QRhiTexture::Flags flags = 0; + if (mipmap) + flags |= QRhiTexture::MipMapped | QRhiTexture::UsedWithGenerateMips; + + QRhiTexture *t = rhi->newTexture(QRhiTexture::RGBA8, size, 1, flags); + + // ownership of the native object is never taken + QSGRhiNativeTextureImporter::buildWrapper(rhi, t, nativeObjectPtr, nativeLayout); + + setTexture(t); +} + int QSGPlainTexturePrivate::comparisonKey() const { Q_Q(const QSGPlainTexture); @@ -378,6 +397,19 @@ void QSGPlainTexturePrivate::updateRhiTexture(QRhi *rhi, QRhiResourceUpdateBatch q->m_texture_size = tmp.size(); } + if ((q->mipmapFiltering() != QSGTexture::None + || q->horizontalWrapMode() != QSGTexture::ClampToEdge + || q->verticalWrapMode() != QSGTexture::ClampToEdge) + && !rhi->isFeatureSupported(QRhi::NPOTTextureRepeat)) + { + const int w = qNextPowerOfTwo(tmp.width() - 1); + const int h = qNextPowerOfTwo(tmp.height() - 1); + if (tmp.width() != w || tmp.height() != h) { + tmp = tmp.scaled(w, h, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + q->m_texture_size = tmp.size(); + } + } + bool needsRebuild = q->m_texture && q->m_texture->pixelSize() != q->m_texture_size; if (mipmappingChanged) { diff --git a/src/quick/scenegraph/util/qsgplaintexture_p.h b/src/quick/scenegraph/util/qsgplaintexture_p.h index 69c0153f9a..1eb0b59d2e 100644 --- a/src/quick/scenegraph/util/qsgplaintexture_p.h +++ b/src/quick/scenegraph/util/qsgplaintexture_p.h @@ -53,6 +53,7 @@ #include <QtQuick/private/qtquickglobal_p.h> #include <QtQuick/private/qsgtexture_p.h> +#include <QtQuick/qquickwindow.h> QT_BEGIN_NAMESPACE @@ -85,6 +86,9 @@ public: void bind() override; void setTexture(QRhiTexture *texture); + void setTextureFromNativeObject(QRhi *rhi, QQuickWindow::NativeObjectType type, + const void *nativeObjectPtr, int nativeLayout, + const QSize &size, bool mipmap); static QSGPlainTexture *fromImage(const QImage &image) { QSGPlainTexture *t = new QSGPlainTexture(); diff --git a/src/quick/scenegraph/util/qsgrhinativetextureimporter.cpp b/src/quick/scenegraph/util/qsgrhinativetextureimporter.cpp new file mode 100644 index 0000000000..7a7c19f587 --- /dev/null +++ b/src/quick/scenegraph/util/qsgrhinativetextureimporter.cpp @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQuick module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qsgrhinativetextureimporter_p.h" +#include <private/qsgrhisupport_p.h> // to get all the relevant qrhi headers + +QT_BEGIN_NAMESPACE + +void QSGRhiNativeTextureImporter::buildWrapper(QRhi *rhi, QRhiTexture *t, + const void *nativeObjectPtr, int nativeLayout) +{ +#if !QT_CONFIG(vulkan) + Q_UNUSED(nativeLayout); +#endif +#if !QT_CONFIG(opengl) && !QT_CONFIG(vulkan) && !defined(Q_OS_WIN) && !defined(Q_OS_DARWIN) + Q_UNUSED(nativeObjectPtr); +#endif + + switch (rhi->backend()) { + case QRhi::OpenGLES2: + { +#if QT_CONFIG(opengl) + QRhiGles2TextureNativeHandles h; + h.texture = *reinterpret_cast<const uint *>(nativeObjectPtr); + t->buildFrom(&h); +#endif + } + break; + case QRhi::Vulkan: + { +#if QT_CONFIG(vulkan) + QRhiVulkanTextureNativeHandles h; + h.image = *reinterpret_cast<const VkImage *>(nativeObjectPtr); + h.layout = VkImageLayout(nativeLayout); + t->buildFrom(&h); +#endif + } + break; + case QRhi::D3D11: + { +#ifdef Q_OS_WIN + QRhiD3D11TextureNativeHandles h; + h.texture = *reinterpret_cast<void * const *>(nativeObjectPtr); + t->buildFrom(&h); +#endif + } + break; + case QRhi::Metal: + { +#ifdef Q_OS_DARWIN + QRhiMetalTextureNativeHandles h; + h.texture = *reinterpret_cast<void * const *>(nativeObjectPtr); + t->buildFrom(&h); +#endif + } + break; + case QRhi::Null: + t->build(); + break; + default: + qWarning("QSGRhiNativeTextureImporter: encountered an unsupported QRhi backend (%d)", + int(rhi->backend())); + t->build(); + break; + } +} + +QT_END_NAMESPACE diff --git a/src/quick/scenegraph/util/qsgrhinativetextureimporter_p.h b/src/quick/scenegraph/util/qsgrhinativetextureimporter_p.h new file mode 100644 index 0000000000..e811109a94 --- /dev/null +++ b/src/quick/scenegraph/util/qsgrhinativetextureimporter_p.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQuick module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QSGRHINATIVETEXTUREIMPORTER_P_H +#define QSGRHINATIVETEXTUREIMPORTER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtQuick/private/qtquickglobal_p.h> + +QT_BEGIN_NAMESPACE + +class QRhi; +class QRhiTexture; + +class QSGRhiNativeTextureImporter +{ +public: + static void buildWrapper(QRhi *rhi, QRhiTexture *t, + const void *nativeObjectPtr, int nativeLayout); +}; + +QT_END_NAMESPACE + +#endif // QSGRHINATIVETEXTUREIMPORTER_P_H diff --git a/src/quick/scenegraph/util/qsgtexturematerial.cpp b/src/quick/scenegraph/util/qsgtexturematerial.cpp index a154ae269a..df4e5cfde2 100644 --- a/src/quick/scenegraph/util/qsgtexturematerial.cpp +++ b/src/quick/scenegraph/util/qsgtexturematerial.cpp @@ -164,6 +164,7 @@ void QSGOpaqueTextureMaterialRhiShader::updateSampledImage(const RenderState &st if (isNpot) { t->setHorizontalWrapMode(QSGTexture::ClampToEdge); t->setVerticalWrapMode(QSGTexture::ClampToEdge); + t->setMipmapFiltering(QSGTexture::None); } } |