diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2020-05-19 07:29:14 +0200 |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2020-05-25 13:39:32 +0200 |
commit | 5d4d598354c85de7bf33412b42a5693b4ac27d78 (patch) | |
tree | 96e892cf15c6720db0c9aaf7060bde18ed8b44ca | |
parent | de41077a57313f67e330de5a60281be81b414a1d (diff) |
Adapt to changes in NativeTexture in qtbase
To make the API less error prone, we have changed the
void pointer to the texture handle to a 64-bit in
instead, since all handles are maximum 64-bit.
Task-number: QTBUG-78638
Change-Id: I9d995d6a883b3377f57d7c5b19d4bc4e15aa347b
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
14 files changed, 28 insertions, 39 deletions
diff --git a/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp b/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp index cb84371fed..ccbac5cbed 100644 --- a/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp +++ b/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp @@ -367,10 +367,8 @@ void Window::updateQuick() if (!m_renderControl->initialize()) qWarning("Failed to initialize redirected Qt Quick rendering"); - // Redirect Qt Quick's output. (note that the QSGTexture::NativeTexture - // struct is expected to contain a pointer to the native object, even - // if the native object type is a pointer, such as ID3D11Texture2D*) - m_quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ &m_res.texture, 0 }, + // Redirect Qt Quick's output. + m_quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ quint64(m_res.texture), 0 }, QSize(QML_WIDTH, QML_HEIGHT), SAMPLE_COUNT)); diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.cpp b/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.cpp index fb3c0b4f4f..dc9d310ff2 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({ &m_textureId, 0 }, m_textureSize)); + m_quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ quint64(m_textureId), 0 }, m_textureSize)); } void WindowSingleThreaded::destroyTexture() diff --git a/examples/quick/scenegraph/metaltextureimport/metaltextureimport.mm b/examples/quick/scenegraph/metaltextureimport/metaltextureimport.mm index 61f5e7f8e1..e676ff2e5e 100644 --- a/examples/quick/scenegraph/metaltextureimport/metaltextureimport.mm +++ b/examples/quick/scenegraph/metaltextureimport/metaltextureimport.mm @@ -264,7 +264,7 @@ void CustomTextureNode::sync() [desc release]; QSGTexture *wrapper = m_window->createTextureFromNativeObject(QQuickWindow::NativeObjectTexture, - &m_texture, + quint64(m_texture), 0, m_size); diff --git a/examples/quick/scenegraph/opengltextureinthread/threadrenderer.cpp b/examples/quick/scenegraph/opengltextureinthread/threadrenderer.cpp index 8c07785926..6f6ec467dc 100644 --- a/examples/quick/scenegraph/opengltextureinthread/threadrenderer.cpp +++ b/examples/quick/scenegraph/opengltextureinthread/threadrenderer.cpp @@ -161,7 +161,7 @@ public: { // Our texture node must have a texture, so use the default 0 texture. GLuint id = 0; - m_texture = m_window->createTextureFromNativeObject(QQuickWindow::NativeObjectTexture, &id, 0, QSize(1, 1)); + m_texture = m_window->createTextureFromNativeObject(QQuickWindow::NativeObjectTexture, id, 0, QSize(1, 1)); setTexture(m_texture); setFiltering(QSGTexture::Linear); } @@ -202,7 +202,7 @@ public slots: delete m_texture; // note: include QQuickWindow::TextureHasAlphaChannel if the rendered content // has alpha. - m_texture = m_window->createTextureFromNativeObject(QQuickWindow::NativeObjectTexture, &newId, 0, QSize(1, 1)); + m_texture = m_window->createTextureFromNativeObject(QQuickWindow::NativeObjectTexture, newId, 0, QSize(1, 1)); setTexture(m_texture); markDirty(DirtyMaterial); diff --git a/examples/quick/scenegraph/vulkantextureimport/vulkantextureimport.cpp b/examples/quick/scenegraph/vulkantextureimport/vulkantextureimport.cpp index 964984085e..72833df7f5 100644 --- a/examples/quick/scenegraph/vulkantextureimport/vulkantextureimport.cpp +++ b/examples/quick/scenegraph/vulkantextureimport/vulkantextureimport.cpp @@ -717,7 +717,7 @@ void CustomTextureNode::sync() freeTexture(); buildTexture(m_size); QSGTexture *wrapper = m_window->createTextureFromNativeObject(QQuickWindow::NativeObjectTexture, - &m_texture, + quint64(m_texture), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, m_size); setTexture(wrapper); diff --git a/src/quick/items/qquickframebufferobject.cpp b/src/quick/items/qquickframebufferobject.cpp index 41a56788fa..3ff6f857ab 100644 --- a/src/quick/items/qquickframebufferobject.cpp +++ b/src/quick/items/qquickframebufferobject.cpp @@ -349,7 +349,7 @@ QSGNode *QQuickFramebufferObject::updatePaintNode(QSGNode *node, UpdatePaintNode } QSGTexture *wrapper = window()->createTextureFromNativeObject(QQuickWindow::NativeObjectTexture, - &displayTexture, 0, + displayTexture, 0, n->fbo->size(), QQuickWindow::TextureHasAlphaChannel); n->setTexture(wrapper); diff --git a/src/quick/items/qquickrendercontrol.cpp b/src/quick/items/qquickrendercontrol.cpp index b42a3ea6aa..79cf8b73bc 100644 --- a/src/quick/items/qquickrendercontrol.cpp +++ b/src/quick/items/qquickrendercontrol.cpp @@ -636,7 +636,7 @@ QQuickWindow *QQuickRenderControl::window() const if (!m_renderControl->initialize()) qWarning("Failed to initialize redirected Qt Quick rendering"); - m_quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ &m_res.texture, 0 }, + m_quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ quint64(m_res.texture), 0 }, QSize(QML_WIDTH, QML_HEIGHT), SAMPLE_COUNT)); diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 05819c430f..28edf1eede 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -4314,7 +4314,7 @@ QOpenGLFramebufferObject *QQuickWindow::renderTarget() const however. \badcode - QQuickRenderTarget rt = QQuickRenderTarget::fromNativeTexture({ &vulkanImage, VK_IMAGE_LAYOUT_PREINITIALIZED }, pixelSize); + QQuickRenderTarget rt = QQuickRenderTarget::fromNativeTexture({ vulkanImage, VK_IMAGE_LAYOUT_PREINITIALIZED }, pixelSize); quickWindow->setRenderTarget(rt); \endcode @@ -5059,15 +5059,10 @@ QSGTexture *QQuickWindow::createTextureFromId(uint id, const QSize &size, Create \a size specifies the size in pixels. - \a nativeObjectPtr is a pointer to the native object handle. With OpenGL, - the native handle is a GLuint value, so \a nativeObjectPtr is then a - pointer to a GLuint. With Vulkan, the native handle is a VkImage, so \a - nativeObjectPtr is a pointer to a VkImage. With Direct3D 11 and Metal \a - nativeObjectPtr is a pointer to a ID3D11Texture2D or MTLTexture pointer. - - \note Pay attention to the fact that \a nativeObjectPtr is always a pointer - to the native texture handle type, even if the native type itself is a - pointer. + \a nativeObjectHandle is a 64-bit container for the native object handle. With + OpenGL, the native handle is a GLuint value, so \a nativeObjectHandle then + contains a GLuint. With Vulkan, \a nativeObjectHandle contains a VkImage, and + with Direct3D 11 and Metal it contains a ID3D11Texture2D or MTLTexture pointer. \a nativeLayout is only used for APIs like Vulkan. When applicable, it must specify the current image layout, such as, a VkImageLayout value. @@ -5077,7 +5072,7 @@ QSGTexture *QQuickWindow::createTextureFromId(uint id, const QSize &size, Create \since 5.14 */ QSGTexture *QQuickWindow::createTextureFromNativeObject(NativeObjectType type, - const void *nativeObjectPtr, + quint64 nativeObjectHandle, int nativeLayout, const QSize &size, CreateTextureOptions options) const @@ -5091,7 +5086,7 @@ QSGTexture *QQuickWindow::createTextureFromNativeObject(NativeObjectType type, Q_D(const QQuickWindow); if (d->rhi) { QSGPlainTexture *texture = new QSGPlainTexture; - texture->setTextureFromNativeObject(d->rhi, type, nativeObjectPtr, nativeLayout, + texture->setTextureFromNativeObject(d->rhi, type, nativeObjectHandle, nativeLayout, size, options.testFlag(TextureHasMipmaps)); texture->setHasAlphaChannel(options & TextureHasAlphaChannel); // note that the QRhiTexture does not (and cannot) own the native object @@ -5100,7 +5095,7 @@ QSGTexture *QQuickWindow::createTextureFromNativeObject(NativeObjectType type, return texture; } else if (openglContext()) { QSGPlainTexture *texture = new QSGPlainTexture; - texture->setTextureId(*reinterpret_cast<const uint *>(nativeObjectPtr)); + texture->setTextureId(uint(nativeObjectHandle)); texture->setHasAlphaChannel(options & TextureHasAlphaChannel); texture->setOwnsTexture(options & TextureOwnsGLTexture); texture->setTextureSize(size); @@ -6067,7 +6062,7 @@ QString QQuickWindow::sceneGraphBackend() ... window->setGraphicsDevice(QQuickGraphicsDevice::fromDeviceAndContext(device, context)); renderControl->initialize(); - window->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ &texture, 0 }, textureSize); + window->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ quint64(texture), 0 }, textureSize); ... \endcode diff --git a/src/quick/items/qquickwindow.h b/src/quick/items/qquickwindow.h index ea3f787d12..820b53cce9 100644 --- a/src/quick/items/qquickwindow.h +++ b/src/quick/items/qquickwindow.h @@ -170,7 +170,7 @@ public: #endif QSGTexture *createTextureFromNativeObject(NativeObjectType type, - const void *nativeObjectPtr, + quint64 nativeObjectHandle, int nativeLayout, const QSize &size, CreateTextureOptions options = CreateTextureOption()) const; diff --git a/src/quick/scenegraph/coreapi/qsgtexture.cpp b/src/quick/scenegraph/coreapi/qsgtexture.cpp index 25e02d8058..2cf60f317e 100644 --- a/src/quick/scenegraph/coreapi/qsgtexture.cpp +++ b/src/quick/scenegraph/coreapi/qsgtexture.cpp @@ -325,15 +325,11 @@ static void qt_debug_remove_texture(QSGTexture* texture) /*! \variable QSGTexture::NativeTexture::object - \brief a pointer to the native object handle. + \brief a 64-bit container of 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 + With OpenGL, the native handle is a GLuint value, so \c object then + contains a GLuint. With Vulkan, \c object contains a VkImage, and + with Direct3D 11 and Metal it contains a ID3D11Texture2D or MTLTexture pointer. */ diff --git a/src/quick/scenegraph/coreapi/qsgtexture.h b/src/quick/scenegraph/coreapi/qsgtexture.h index b0f01b1933..d9176f58f1 100644 --- a/src/quick/scenegraph/coreapi/qsgtexture.h +++ b/src/quick/scenegraph/coreapi/qsgtexture.h @@ -81,7 +81,7 @@ public: }; struct NativeTexture { - const void *object; + quint64 object; int layout; }; diff --git a/src/quick/scenegraph/util/qsgplaintexture.cpp b/src/quick/scenegraph/util/qsgplaintexture.cpp index 037cf8c254..93448d7738 100644 --- a/src/quick/scenegraph/util/qsgplaintexture.cpp +++ b/src/quick/scenegraph/util/qsgplaintexture.cpp @@ -287,7 +287,7 @@ void QSGPlainTexture::setTexture(QRhiTexture *texture) // RHI only } void QSGPlainTexture::setTextureFromNativeObject(QRhi *rhi, QQuickWindow::NativeObjectType type, - const void *nativeObjectPtr, int nativeLayout, + quint64 nativeObjectHandle, int nativeLayout, const QSize &size, bool mipmap) { Q_UNUSED(type); @@ -299,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 - t->buildFrom({nativeObjectPtr, nativeLayout}); + t->buildFrom({nativeObjectHandle, nativeLayout}); setTexture(t); } diff --git a/src/quick/scenegraph/util/qsgplaintexture_p.h b/src/quick/scenegraph/util/qsgplaintexture_p.h index 4bde505ec4..fed464a0b4 100644 --- a/src/quick/scenegraph/util/qsgplaintexture_p.h +++ b/src/quick/scenegraph/util/qsgplaintexture_p.h @@ -92,7 +92,7 @@ public: void setTexture(QRhiTexture *texture); void setTextureFromNativeObject(QRhi *rhi, QQuickWindow::NativeObjectType type, - const void *nativeObjectPtr, int nativeLayout, + quint64 nativeObjectHandle, int nativeLayout, const QSize &size, bool mipmap); static QSGPlainTexture *fromImage(const QImage &image) { diff --git a/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp b/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp index b0dd2d0c94..ed0818fd7d 100644 --- a/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp +++ b/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp @@ -487,7 +487,7 @@ void tst_RenderControl::renderAndReadBackWithVulkanNative() QCOMPARE(err, VK_SUCCESS); // Tell Qt Quick to target our VkImage. - quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ &img, VK_IMAGE_LAYOUT_PREINITIALIZED }, + quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ quint64(img), VK_IMAGE_LAYOUT_PREINITIALIZED }, rootItem->size().toSize())); // Create a readback buffer. |