aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2020-06-26 17:18:37 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2020-06-26 21:08:06 +0200
commitccb9eb0cc17c689f6be61e83d2d9fb5724a6338d (patch)
treeb68f89d1bdf582b5dd89259b2b1da5dd43cb1b0b
parente79281533d61dda90d1c5995345a66e6089c7501 (diff)
Follow QQuickGraphicsDevice changes in QQuickRenderTarget
They are not strictly related of course, but the API pattern should be kept. We can also move away from the QSGTexture dependency which is good since that was never directly related. Change-Id: I9aedff5918443bda3d6e3ee1ea389071222d1ad7 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
-rw-r--r--examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp6
-rw-r--r--examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.cpp2
-rw-r--r--src/quick/items/qquickrendertarget.cpp149
-rw-r--r--src/quick/items/qquickrendertarget.h27
-rw-r--r--src/quick/items/qquickrendertarget_p.h6
-rw-r--r--src/quickwidgets/qquickwidget.cpp2
-rw-r--r--tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp5
7 files changed, 172 insertions, 25 deletions
diff --git a/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp b/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp
index c574343a98..884f7e3981 100644
--- a/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp
+++ b/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp
@@ -368,9 +368,9 @@ void Window::updateQuick()
qWarning("Failed to initialize redirected Qt Quick rendering");
// Redirect Qt Quick's output.
- m_quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ quint64(m_res.texture), 0 },
- QSize(QML_WIDTH, QML_HEIGHT),
- SAMPLE_COUNT));
+ m_quickWindow->setRenderTarget(QQuickRenderTarget::fromD3D11Texture(m_res.texture,
+ QSize(QML_WIDTH, QML_HEIGHT),
+ SAMPLE_COUNT));
m_quickInitialized = true;
}
diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.cpp b/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.cpp
index 0d29a155dd..8f3bfe77db 100644
--- a/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.cpp
+++ b/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.cpp
@@ -182,7 +182,7 @@ void WindowSingleThreaded::createTexture()
f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
f->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_textureSize.width(), m_textureSize.height(), 0,
GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
- m_quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ quint64(m_textureId), 0 }, m_textureSize));
+ m_quickWindow->setRenderTarget(QQuickRenderTarget::fromOpenGLTexture(m_textureId, m_textureSize));
}
void WindowSingleThreaded::destroyTexture()
diff --git a/src/quick/items/qquickrendertarget.cpp b/src/quick/items/qquickrendertarget.cpp
index b4b8154f74..bdaee055a8 100644
--- a/src/quick/items/qquickrendertarget.cpp
+++ b/src/quick/items/qquickrendertarget.cpp
@@ -123,15 +123,138 @@ bool QQuickRenderTarget::isNull() const
}
/*!
- \return a new QQuickRenderTarget referencing a native texture or image
- object.
+ \return a new QQuickRenderTarget referencing an OpenGL texture object
+ specified by \a textureId.
- \a nativeTexture references a native resource, for example, a \c VkImage,
- \c ID3D11Texture2D*, c MTLTexture*, or \c GLuint. Where applicable, this
- must be complemented by the current layout of the image.
+ \a pixelSize specifies the size of the image, in pixels. Currently only 2D
+ textures are supported.
+
+ \a sampleCount specific the number of samples. 0 or 1 means no
+ multisampling, while a value like 4 or 8 states that the native object is a
+ multisample texture.
+
+ \note the resulting QQuickRenderTarget does not own any native resources,
+ it merely contains references and the associated metadata of the size and
+ sample count. It is the caller's responsibility to ensure that the native
+ resource exists as long as necessary.
+
+ \sa QQuickWindow::setRenderTarget(), QQuickRenderControl
+ */
+#if QT_CONFIG(opengl) || defined(Q_CLANG_QDOC)
+QQuickRenderTarget QQuickRenderTarget::fromOpenGLTexture(uint textureId, const QSize &pixelSize, int sampleCount)
+{
+ QQuickRenderTarget rt;
+ QQuickRenderTargetPrivate *d = QQuickRenderTargetPrivate::get(&rt);
+
+ if (!textureId) {
+ qWarning("QQuickRenderTarget: textureId is invalid");
+ return rt;
+ }
+
+ if (pixelSize.isEmpty()) {
+ qWarning("QQuickRenderTarget: Cannot create with empty size");
+ return rt;
+ }
+
+ d->type = QQuickRenderTargetPrivate::Type::NativeTexture;
+ d->pixelSize = pixelSize;
+ d->sampleCount = qMax(1, sampleCount);
+ d->u.nativeTexture = { textureId, 0 };
+
+ return rt;
+}
+#endif
+
+/*!
+ \return a new QQuickRenderTarget referencing an D3D11 texture object
+ specified by \a texture.
+
+ \a pixelSize specifies the size of the image, in pixels. Currently only 2D
+ textures are supported.
+
+ \a sampleCount specific the number of samples. 0 or 1 means no
+ multisampling, while a value like 4 or 8 states that the native object is a
+ multisample texture.
+
+ \note the resulting QQuickRenderTarget does not own any native resources,
+ it merely contains references and the associated metadata of the size and
+ sample count. It is the caller's responsibility to ensure that the native
+ resource exists as long as necessary.
+
+ \sa QQuickWindow::setRenderTarget(), QQuickRenderControl
+ */
+#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
+QQuickRenderTarget QQuickRenderTarget::fromD3D11Texture(void *texture, const QSize &pixelSize, int sampleCount)
+{
+ QQuickRenderTarget rt;
+ QQuickRenderTargetPrivate *d = QQuickRenderTargetPrivate::get(&rt);
- \note the \c object field in \a nativeTexture must always be a pointer to
- the native object, even if the type is already a pointer.
+ if (!texture) {
+ qWarning("QQuickRenderTarget: texture is null");
+ return rt;
+ }
+
+ if (pixelSize.isEmpty()) {
+ qWarning("QQuickRenderTarget: Cannot create with empty size");
+ return rt;
+ }
+
+ d->type = QQuickRenderTargetPrivate::Type::NativeTexture;
+ d->pixelSize = pixelSize;
+ d->sampleCount = qMax(1, sampleCount);
+ d->u.nativeTexture = { quint64(texture), 0 };
+
+ return rt;
+}
+#endif
+
+/*!
+ \return a new QQuickRenderTarget referencing an Metal texture object
+ specified by \a texture.
+
+ \a pixelSize specifies the size of the image, in pixels. Currently only 2D
+ textures are supported.
+
+ \a sampleCount specific the number of samples. 0 or 1 means no
+ multisampling, while a value like 4 or 8 states that the native object is a
+ multisample texture.
+
+ \note the resulting QQuickRenderTarget does not own any native resources,
+ it merely contains references and the associated metadata of the size and
+ sample count. It is the caller's responsibility to ensure that the native
+ resource exists as long as necessary.
+
+ \sa QQuickWindow::setRenderTarget(), QQuickRenderControl
+ */
+#if defined(Q_OS_MACOS) || defined(Q_OS_IOS) || defined(Q_CLANG_QDOC)
+QQuickRenderTarget QQuickRenderTarget::fromMetalTexture(MTLTexture *texture, const QSize &pixelSize, int sampleCount)
+{
+ QQuickRenderTarget rt;
+ QQuickRenderTargetPrivate *d = QQuickRenderTargetPrivate::get(&rt);
+
+ if (!texture) {
+ qWarning("QQuickRenderTarget: texture is null");
+ return rt;
+ }
+
+ if (pixelSize.isEmpty()) {
+ qWarning("QQuickRenderTarget: Cannot create with empty size");
+ return rt;
+ }
+
+ d->type = QQuickRenderTargetPrivate::Type::NativeTexture;
+ d->pixelSize = pixelSize;
+ d->sampleCount = qMax(1, sampleCount);
+ d->u.nativeTexture = { quint64(texture), 0 };
+
+ return rt;
+}
+#endif
+
+/*!
+ \return a new QQuickRenderTarget referencing an Vulkan image object
+ specified by \a image. The current \a layout of the image must be provided
+ as well.
\a pixelSize specifies the size of the image, in pixels. Currently only 2D
textures are supported.
@@ -147,15 +270,14 @@ bool QQuickRenderTarget::isNull() const
\sa QQuickWindow::setRenderTarget(), QQuickRenderControl
*/
-QQuickRenderTarget QQuickRenderTarget::fromNativeTexture(const QSGTexture::NativeTexture &nativeTexture,
- const QSize &pixelSize,
- int sampleCount)
+#if QT_CONFIG(vulkan) || defined(Q_CLANG_QDOC)
+QQuickRenderTarget QQuickRenderTarget::fromVulkanImage(VkImage image, VkImageLayout layout, const QSize &pixelSize, int sampleCount)
{
QQuickRenderTarget rt;
QQuickRenderTargetPrivate *d = QQuickRenderTargetPrivate::get(&rt);
- if (!nativeTexture.object) {
- qWarning("QQuickRenderTarget: nativeTexture.object is null");
+ if (image == VK_NULL_HANDLE) {
+ qWarning("QQuickRenderTarget: image is invalid");
return rt;
}
@@ -167,10 +289,11 @@ QQuickRenderTarget QQuickRenderTarget::fromNativeTexture(const QSGTexture::Nativ
d->type = QQuickRenderTargetPrivate::Type::NativeTexture;
d->pixelSize = pixelSize;
d->sampleCount = qMax(1, sampleCount);
- d->u.nativeTexture = nativeTexture;
+ d->u.nativeTexture = { quint64(image), layout };
return rt;
}
+#endif
/*!
\internal
diff --git a/src/quick/items/qquickrendertarget.h b/src/quick/items/qquickrendertarget.h
index 5139046ad4..a40df626d1 100644
--- a/src/quick/items/qquickrendertarget.h
+++ b/src/quick/items/qquickrendertarget.h
@@ -41,7 +41,14 @@
#define QQUICKRENDERTARGET_H
#include <QtQuick/qtquickglobal.h>
-#include <QtQuick/qsgtexture.h>
+
+#if QT_CONFIG(vulkan)
+#include <QtGui/QVulkanInstance>
+#endif
+
+#if defined(Q_OS_MACOS) || defined(Q_OS_IOS)
+Q_FORWARD_DECLARE_OBJC_CLASS(MTLTexture);
+#endif
QT_BEGIN_NAMESPACE
@@ -58,9 +65,21 @@ public:
bool isNull() const;
- static QQuickRenderTarget fromNativeTexture(const QSGTexture::NativeTexture &nativeTexture,
- const QSize &pixelSize,
- int sampleCount = 1);
+#if QT_CONFIG(opengl) || defined(Q_CLANG_QDOC)
+ static QQuickRenderTarget fromOpenGLTexture(uint textureId, const QSize &pixelSize, int sampleCount = 1);
+#endif
+
+#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
+ static QQuickRenderTarget fromD3D11Texture(void *texture, const QSize &pixelSize, int sampleCount = 1);
+#endif
+
+#if defined(Q_OS_MACOS) || defined(Q_OS_IOS) || defined(Q_CLANG_QDOC)
+ static QQuickRenderTarget fromMetalTexture(MTLTexture *texture, const QSize &pixelSize, int sampleCount = 1);
+#endif
+
+#if QT_CONFIG(vulkan) || defined(Q_CLANG_QDOC)
+ static QQuickRenderTarget fromVulkanImage(VkImage image, VkImageLayout layout, const QSize &pixelSize, int sampleCount = 1);
+#endif
static QQuickRenderTarget fromRhiRenderTarget(QRhiRenderTarget *renderTarget);
diff --git a/src/quick/items/qquickrendertarget_p.h b/src/quick/items/qquickrendertarget_p.h
index 628e5c277b..173cb699b6 100644
--- a/src/quick/items/qquickrendertarget_p.h
+++ b/src/quick/items/qquickrendertarget_p.h
@@ -79,8 +79,12 @@ public:
Type type = Type::Null;
QSize pixelSize;
int sampleCount = 1;
+ struct NativeTexture {
+ quint64 object;
+ int layout;
+ };
union {
- QSGTexture::NativeTexture nativeTexture;
+ NativeTexture nativeTexture;
QRhiRenderTarget *rhiRt;
} u;
};
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp
index 04c321d0a5..ed0210629d 100644
--- a/src/quickwidgets/qquickwidget.cpp
+++ b/src/quickwidgets/qquickwidget.cpp
@@ -1077,7 +1077,7 @@ void QQuickWidget::createFramebufferObject()
#endif
GLuint textureId = d->fbo->texture();
- d->offscreenWindow->setRenderTarget( QQuickRenderTarget::fromNativeTexture({ textureId, 0 }, fboSize, samples));
+ d->offscreenWindow->setRenderTarget( QQuickRenderTarget::fromOpenGLTexture(textureId, fboSize, samples));
d->renderControl->setSamples(samples);
diff --git a/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp b/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp
index a2217f5427..d81c40f5b6 100644
--- a/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp
+++ b/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp
@@ -487,8 +487,9 @@ void tst_RenderControl::renderAndReadBackWithVulkanNative()
QCOMPARE(err, VK_SUCCESS);
// Tell Qt Quick to target our VkImage.
- quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ quint64(img), VK_IMAGE_LAYOUT_PREINITIALIZED },
- rootItem->size().toSize()));
+ quickWindow->setRenderTarget(QQuickRenderTarget::fromVulkanImage(img,
+ VK_IMAGE_LAYOUT_PREINITIALIZED,
+ rootItem->size().toSize()));
// Create a readback buffer.
VkBuffer buf = VK_NULL_HANDLE;