diff options
author | Paul Olav Tvete <paul.tvete@qt.io> | 2019-11-29 12:43:38 +0100 |
---|---|---|
committer | Paul Olav Tvete <paul.tvete@qt.io> | 2019-12-17 13:08:41 +0100 |
commit | 5b8a0966ce32fbe9739f955c759cf16131e72f7c (patch) | |
tree | 026c0d936c214676c724bd42c0c8afc0cb311bcd /src/quick/scenegraph | |
parent | cc759804aa4156eb75094345dbfe21597b2fe3b8 (diff) |
Add API to get the platform specific texture handle
Also update the implementation of setTextureFromNativeObject
to use the new API from QRhi
Task-number: QTBUG-78570
Change-Id: Ic43371c4bb7a1dd14bfe5ef0d8ce2ef50e1d25d6
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/quick/scenegraph')
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgtexture.cpp | 50 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgtexture.h | 6 | ||||
-rw-r--r-- | src/quick/scenegraph/scenegraph.pri | 2 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgplaintexture.cpp | 3 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgrhinativetextureimporter.cpp | 104 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgrhinativetextureimporter_p.h | 70 |
6 files changed, 57 insertions, 178 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgtexture.cpp b/src/quick/scenegraph/coreapi/qsgtexture.cpp index 58b42e4094..715633fdba 100644 --- a/src/quick/scenegraph/coreapi/qsgtexture.cpp +++ b/src/quick/scenegraph/coreapi/qsgtexture.cpp @@ -317,6 +317,34 @@ static void qt_debug_remove_texture(QSGTexture* texture) \since 5.9 */ +/*! + \class QSGTexture::NativeTexture + \brief Contains information about the underlying native resources of a texture. + \since 5.15 + */ + +/*! + \variable QSGTexture::NativeTexture::object + \brief a pointer to the native object handle. + + With OpenGL, the native handle is a GLuint value, so \c object is then a + pointer to a GLuint. With Vulkan, the native handle is a VkImage, so \c + object is a pointer to a VkImage. With Direct3D 11 and Metal \c + object is a pointer to a ID3D11Texture2D or MTLTexture pointer, respectively. + + \note Pay attention to the fact that \a object is always a pointer + to the native texture handle type, even if the native type itself is a + pointer. + */ + +/*! + \variable QSGTexture::NativeTexture::layout + \brief Specifies the current image layout for APIs like Vulkan. + + For Vulkan, \c layout contains a \c VkImageLayout value. + */ + + #ifndef QT_NO_DEBUG Q_QUICK_PRIVATE_EXPORT void qsg_set_material_failure(); #endif @@ -721,6 +749,28 @@ void QSGTexture::updateRhiTexture(QRhi *rhi, QRhiResourceUpdateBatch *resourceUp } /*! + \return the platform-specific texture data for this texture. + + \note This is only available when running the graphics API independent + rendering path of the scene graph. Use textureId() otherwise. + + Returns an empty result (\c object is null) if there is no available + underlying native texture. + + \since 5.15 + \sa QQuickWindow::createTextureFromNativeObject() + */ +QSGTexture::NativeTexture QSGTexture::nativeTexture() const +{ + Q_D(const QSGTexture); + if (auto *tex = d->rhiTexture()) { + auto nativeTexture = tex->nativeTexture(); + return {nativeTexture.object, nativeTexture.layout}; + } + return {}; +} + +/*! \internal */ void QSGTexture::setWorkResourceUpdateBatch(QRhiResourceUpdateBatch *resourceUpdates) diff --git a/src/quick/scenegraph/coreapi/qsgtexture.h b/src/quick/scenegraph/coreapi/qsgtexture.h index 2efdd8b7c3..207ef52f4e 100644 --- a/src/quick/scenegraph/coreapi/qsgtexture.h +++ b/src/quick/scenegraph/coreapi/qsgtexture.h @@ -80,7 +80,13 @@ public: Anisotropy16x }; + struct NativeTexture { + const void *object; + int layout; + }; + virtual int textureId() const = 0; // ### Qt 6: remove + NativeTexture nativeTexture() const; virtual QSize textureSize() const = 0; virtual bool hasAlphaChannel() const = 0; virtual bool hasMipmaps() const = 0; diff --git a/src/quick/scenegraph/scenegraph.pri b/src/quick/scenegraph/scenegraph.pri index 56d97226fb..b12f57d8ef 100644 --- a/src/quick/scenegraph/scenegraph.pri +++ b/src/quick/scenegraph/scenegraph.pri @@ -53,7 +53,6 @@ HEADERS += \ $$PWD/util/qsgengine.h \ $$PWD/util/qsgengine_p.h \ $$PWD/util/qsgplaintexture_p.h \ - $$PWD/util/qsgrhinativetextureimporter_p.h \ $$PWD/util/qsgsimplerectnode.h \ $$PWD/util/qsgsimpletexturenode.h \ $$PWD/util/qsgtextureprovider.h \ @@ -70,7 +69,6 @@ SOURCES += \ $$PWD/util/qsgareaallocator.cpp \ $$PWD/util/qsgengine.cpp \ $$PWD/util/qsgplaintexture.cpp \ - $$PWD/util/qsgrhinativetextureimporter.cpp \ $$PWD/util/qsgsimplerectnode.cpp \ $$PWD/util/qsgsimpletexturenode.cpp \ $$PWD/util/qsgtextureprovider.cpp \ diff --git a/src/quick/scenegraph/util/qsgplaintexture.cpp b/src/quick/scenegraph/util/qsgplaintexture.cpp index cbc226fd6e..f00918bb4e 100644 --- a/src/quick/scenegraph/util/qsgplaintexture.cpp +++ b/src/quick/scenegraph/util/qsgplaintexture.cpp @@ -38,7 +38,6 @@ ****************************************************************************/ #include "qsgplaintexture_p.h" -#include "qsgrhinativetextureimporter_p.h" #include <QtQuick/private/qsgcontext_p.h> #include <qmath.h> #include <private/qquickprofiler_p.h> @@ -300,7 +299,7 @@ void QSGPlainTexture::setTextureFromNativeObject(QRhi *rhi, QQuickWindow::Native QRhiTexture *t = rhi->newTexture(QRhiTexture::RGBA8, size, 1, flags); // ownership of the native object is never taken - QSGRhiNativeTextureImporter::buildWrapper(rhi, t, nativeObjectPtr, nativeLayout); + t->buildFrom({nativeObjectPtr, nativeLayout}); setTexture(t); } diff --git a/src/quick/scenegraph/util/qsgrhinativetextureimporter.cpp b/src/quick/scenegraph/util/qsgrhinativetextureimporter.cpp deleted file mode 100644 index 85a88326ca..0000000000 --- a/src/quick/scenegraph/util/qsgrhinativetextureimporter.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/**************************************************************************** -** -** 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_MACOS) && !defined(Q_OS_IOS) - 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: - { -#if defined(Q_OS_MACOS) || defined(Q_OS_IOS) - 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 deleted file mode 100644 index e811109a94..0000000000 --- a/src/quick/scenegraph/util/qsgrhinativetextureimporter_p.h +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** 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 |