Add type safe native texture accessors
Following the pattern from QtGui. Task-number: QTBUG-85239 Change-Id: I07b4456028d0f45223ad10e55ce65f423bab6a9b Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
6826b2decc
commit
fb96109bbc
|
@ -263,10 +263,7 @@ void CustomTextureNode::sync()
|
||||||
m_texture = [m_device newTextureWithDescriptor: desc];
|
m_texture = [m_device newTextureWithDescriptor: desc];
|
||||||
[desc release];
|
[desc release];
|
||||||
|
|
||||||
QSGTexture *wrapper = m_window->createTextureFromNativeObject(QQuickWindow::NativeObjectTexture,
|
QSGTexture *wrapper = QPlatformInterface::QSGMetalTexture::fromNative((MTLTexture *) m_texture, m_window, m_size);
|
||||||
quint64(m_texture),
|
|
||||||
0,
|
|
||||||
m_size);
|
|
||||||
|
|
||||||
qDebug() << "Got QSGTexture wrapper" << wrapper << "for an MTLTexture of size" << m_size;
|
qDebug() << "Got QSGTexture wrapper" << wrapper << "for an MTLTexture of size" << m_size;
|
||||||
|
|
||||||
|
|
|
@ -716,11 +716,12 @@ void CustomTextureNode::sync()
|
||||||
delete texture();
|
delete texture();
|
||||||
freeTexture();
|
freeTexture();
|
||||||
buildTexture(m_size);
|
buildTexture(m_size);
|
||||||
QSGTexture *wrapper = m_window->createTextureFromNativeObject(QQuickWindow::NativeObjectTexture,
|
QSGTexture *wrapper = QPlatformInterface::QSGVulkanTexture::fromNative(m_texture,
|
||||||
quint64(m_texture),
|
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
m_window,
|
||||||
m_size);
|
m_size);
|
||||||
setTexture(wrapper);
|
setTexture(wrapper);
|
||||||
|
Q_ASSERT(wrapper->platformInterface<QPlatformInterface::QSGVulkanTexture>()->nativeImage() == m_texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_t = float(static_cast<CustomTextureItem *>(m_item)->t());
|
m_t = float(static_cast<CustomTextureItem *>(m_item)->t());
|
||||||
|
|
|
@ -123,6 +123,7 @@ qt_add_module(Quick
|
||||||
scenegraph/coreapi/qsgrendernode.cpp scenegraph/coreapi/qsgrendernode.h scenegraph/coreapi/qsgrendernode_p.h
|
scenegraph/coreapi/qsgrendernode.cpp scenegraph/coreapi/qsgrendernode.h scenegraph/coreapi/qsgrendernode_p.h
|
||||||
scenegraph/coreapi/qsgrhivisualizer.cpp scenegraph/coreapi/qsgrhivisualizer_p.h
|
scenegraph/coreapi/qsgrhivisualizer.cpp scenegraph/coreapi/qsgrhivisualizer_p.h
|
||||||
scenegraph/coreapi/qsgtexture.cpp scenegraph/coreapi/qsgtexture.h scenegraph/coreapi/qsgtexture_p.h
|
scenegraph/coreapi/qsgtexture.cpp scenegraph/coreapi/qsgtexture.h scenegraph/coreapi/qsgtexture_p.h
|
||||||
|
scenegraph/coreapi/qsgtexture_platform.h
|
||||||
scenegraph/qsgadaptationlayer.cpp scenegraph/qsgadaptationlayer_p.h
|
scenegraph/qsgadaptationlayer.cpp scenegraph/qsgadaptationlayer_p.h
|
||||||
scenegraph/qsgbasicglyphnode.cpp scenegraph/qsgbasicglyphnode_p.h
|
scenegraph/qsgbasicglyphnode.cpp scenegraph/qsgbasicglyphnode_p.h
|
||||||
scenegraph/qsgbasicinternalimagenode.cpp scenegraph/qsgbasicinternalimagenode_p.h
|
scenegraph/qsgbasicinternalimagenode.cpp scenegraph/qsgbasicinternalimagenode_p.h
|
||||||
|
@ -398,6 +399,11 @@ qt_extend_target(Quick CONDITION QT_FEATURE_opengl OR QT_FEATURE_opengles2 OR QT
|
||||||
util/qquickopenglutils.cpp util/qquickopenglutils.h
|
util/qquickopenglutils.cpp util/qquickopenglutils.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
qt_extend_target(Quick CONDITION IOS OR MACOS
|
||||||
|
SOURCES
|
||||||
|
scenegraph/coreapi/qsgtexture_mac.mm
|
||||||
|
)
|
||||||
|
|
||||||
qt_extend_target(Quick CONDITION QT_FEATURE_thread
|
qt_extend_target(Quick CONDITION QT_FEATURE_thread
|
||||||
SOURCES
|
SOURCES
|
||||||
scenegraph/adaptations/software/qsgsoftwarethreadedrenderloop.cpp scenegraph/adaptations/software/qsgsoftwarethreadedrenderloop_p.h
|
scenegraph/adaptations/software/qsgsoftwarethreadedrenderloop.cpp scenegraph/adaptations/software/qsgsoftwarethreadedrenderloop_p.h
|
||||||
|
|
|
@ -123,6 +123,7 @@ qt_add_module(Quick
|
||||||
scenegraph/coreapi/qsgrendernode.cpp scenegraph/coreapi/qsgrendernode.h scenegraph/coreapi/qsgrendernode_p.h
|
scenegraph/coreapi/qsgrendernode.cpp scenegraph/coreapi/qsgrendernode.h scenegraph/coreapi/qsgrendernode_p.h
|
||||||
scenegraph/coreapi/qsgrhivisualizer.cpp scenegraph/coreapi/qsgrhivisualizer_p.h
|
scenegraph/coreapi/qsgrhivisualizer.cpp scenegraph/coreapi/qsgrhivisualizer_p.h
|
||||||
scenegraph/coreapi/qsgtexture.cpp scenegraph/coreapi/qsgtexture.h scenegraph/coreapi/qsgtexture_p.h
|
scenegraph/coreapi/qsgtexture.cpp scenegraph/coreapi/qsgtexture.h scenegraph/coreapi/qsgtexture_p.h
|
||||||
|
scenegraph/coreapi/qsgtexture_platform.h
|
||||||
scenegraph/qsgadaptationlayer.cpp scenegraph/qsgadaptationlayer_p.h
|
scenegraph/qsgadaptationlayer.cpp scenegraph/qsgadaptationlayer_p.h
|
||||||
scenegraph/qsgbasicglyphnode.cpp scenegraph/qsgbasicglyphnode_p.h
|
scenegraph/qsgbasicglyphnode.cpp scenegraph/qsgbasicglyphnode_p.h
|
||||||
scenegraph/qsgbasicinternalimagenode.cpp scenegraph/qsgbasicinternalimagenode_p.h
|
scenegraph/qsgbasicinternalimagenode.cpp scenegraph/qsgbasicinternalimagenode_p.h
|
||||||
|
@ -398,6 +399,11 @@ qt_extend_target(Quick CONDITION QT_FEATURE_opengl OR QT_FEATURE_opengles2 OR QT
|
||||||
util/qquickopenglutils.cpp util/qquickopenglutils.h
|
util/qquickopenglutils.cpp util/qquickopenglutils.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
qt_extend_target(Quick CONDITION IOS OR MACOS
|
||||||
|
SOURCES
|
||||||
|
scenegraph/coreapi/qsgtexture_mac.mm
|
||||||
|
)
|
||||||
|
|
||||||
qt_extend_target(Quick CONDITION QT_FEATURE_thread
|
qt_extend_target(Quick CONDITION QT_FEATURE_thread
|
||||||
SOURCES
|
SOURCES
|
||||||
scenegraph/adaptations/software/qsgsoftwarethreadedrenderloop.cpp scenegraph/adaptations/software/qsgsoftwarethreadedrenderloop_p.h
|
scenegraph/adaptations/software/qsgsoftwarethreadedrenderloop.cpp scenegraph/adaptations/software/qsgsoftwarethreadedrenderloop_p.h
|
||||||
|
|
|
@ -346,10 +346,10 @@ QSGNode *QQuickFramebufferObject::updatePaintNode(QSGNode *node, UpdatePaintNode
|
||||||
displayTexture = n->msDisplayFbo->texture();
|
displayTexture = n->msDisplayFbo->texture();
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGTexture *wrapper = window()->createTextureFromNativeObject(QQuickWindow::NativeObjectTexture,
|
QSGTexture *wrapper = QPlatformInterface::QSGOpenGLTexture::fromNative(displayTexture,
|
||||||
displayTexture, 0,
|
window(),
|
||||||
n->fbo->size(),
|
n->fbo->size(),
|
||||||
QQuickWindow::TextureHasAlphaChannel);
|
QQuickWindow::TextureHasAlphaChannel);
|
||||||
n->setTexture(wrapper);
|
n->setTexture(wrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1495,9 +1495,10 @@ void QQuickWindowPrivate::cleanup(QSGNode *n)
|
||||||
QQuickWindow by calling rendererInterface(). The enablers for this
|
QQuickWindow by calling rendererInterface(). The enablers for this
|
||||||
integration are the beforeRendering(), beforeRenderPassRecording(),
|
integration are the beforeRendering(), beforeRenderPassRecording(),
|
||||||
afterRenderPassRecording(), and related signals. These allow rendering
|
afterRenderPassRecording(), and related signals. These allow rendering
|
||||||
underlays or overlays. Alternatively, createTextureFromNativeObject() allows
|
underlays or overlays. Alternatively, QPlatformInterface::QSGOpenGLTexture,
|
||||||
wrapping an existing native texture or image object in a QSGTexture that can
|
QPlatformInterface::QSGVulkanTexture, and other similar classes allow
|
||||||
then be used with the scene graph.
|
wrapping an existing native texture or image object in a QSGTexture that
|
||||||
|
can then be used with the scene graph.
|
||||||
|
|
||||||
\section2 Rendering without Acceleration
|
\section2 Rendering without Acceleration
|
||||||
|
|
||||||
|
@ -4805,80 +4806,22 @@ QSGTexture *QQuickWindow::createTextureFromImage(const QImage &image, CreateText
|
||||||
return d->context->createTexture(image, flags);
|
return d->context->createTexture(image, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
QSGTexture *QQuickWindowPrivate::createTextureFromNativeTexture(quint64 nativeObjectHandle,
|
||||||
\enum QQuickWindow::NativeObjectType
|
int nativeLayout,
|
||||||
\since 5.14
|
const QSize &size,
|
||||||
|
QQuickWindow::CreateTextureOptions options) const
|
||||||
Specifies the type of the native object passed to functions such as
|
|
||||||
createTextureFromNativeObject().
|
|
||||||
|
|
||||||
\value NativeObjectTexture The native object is a 2D texture (OpenGL,
|
|
||||||
Direct3D 11, Metal) or image (Vulkan).
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Creates a new QSGTexture object from an existing native object.
|
|
||||||
|
|
||||||
The native object is wrapped, but not owned, by the resulting QSGTexture.
|
|
||||||
The caller of the function is responsible for deleting the returned
|
|
||||||
QSGTexture, but that will not destroy the underlying native object.
|
|
||||||
|
|
||||||
\a type specifies the type of the object. In practice the type is
|
|
||||||
NativeObjectTexture, indicating that the native object is a texture or
|
|
||||||
image of the underlying graphics API. Other types may be introduced in the
|
|
||||||
future.
|
|
||||||
|
|
||||||
This function is currently suitable for 2D RGBA textures only.
|
|
||||||
|
|
||||||
\warning This function will return null if the scenegraph has not yet been
|
|
||||||
initialized.
|
|
||||||
|
|
||||||
Use \a options to customize the texture attributes. Only the
|
|
||||||
TextureHasAlphaChannel and TextureHasMipmaps are taken into account here.
|
|
||||||
|
|
||||||
\warning Unlike the now-removed createTextureFromId() in Qt 5, this function
|
|
||||||
never takes ownership of the native object, and the TextureOwnsGLTexture
|
|
||||||
flag is ignored.
|
|
||||||
|
|
||||||
\a size specifies the size in pixels.
|
|
||||||
|
|
||||||
\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.
|
|
||||||
|
|
||||||
\sa sceneGraphInitialized(), QSGTexture, QSGTexture::nativeTexture(),
|
|
||||||
{Scene Graph - Metal Texture Import}, {Scene Graph - Vulkan Texture Import}
|
|
||||||
|
|
||||||
\since 5.14
|
|
||||||
*/
|
|
||||||
QSGTexture *QQuickWindow::createTextureFromNativeObject(NativeObjectType type,
|
|
||||||
quint64 nativeObjectHandle,
|
|
||||||
int nativeLayout,
|
|
||||||
const QSize &size,
|
|
||||||
CreateTextureOptions options) const
|
|
||||||
{
|
{
|
||||||
if (type != NativeObjectTexture) {
|
if (!rhi)
|
||||||
qWarning("createTextureFromNativeObject: only textures are supported");
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
|
||||||
|
|
||||||
Q_D(const QQuickWindow);
|
QSGPlainTexture *texture = new QSGPlainTexture;
|
||||||
if (d->rhi) {
|
texture->setTextureFromNativeTexture(rhi, nativeObjectHandle, nativeLayout,
|
||||||
QSGPlainTexture *texture = new QSGPlainTexture;
|
size, options.testFlag(QQuickWindow::TextureHasMipmaps));
|
||||||
texture->setTextureFromNativeObject(d->rhi, type, nativeObjectHandle, nativeLayout,
|
texture->setHasAlphaChannel(options & QQuickWindow::TextureHasAlphaChannel);
|
||||||
size, options.testFlag(TextureHasMipmaps));
|
// note that the QRhiTexture does not (and cannot) own the native object
|
||||||
texture->setHasAlphaChannel(options & TextureHasAlphaChannel);
|
texture->setOwnsTexture(true); // texture meaning the QRhiTexture here, not the native object
|
||||||
// note that the QRhiTexture does not (and cannot) own the native object
|
texture->setTextureSize(size);
|
||||||
texture->setOwnsTexture(true); // texture meaning the QRhiTexture here, not the native object
|
return texture;
|
||||||
texture->setTextureSize(size);
|
|
||||||
return texture;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
|
@ -113,11 +113,6 @@ public:
|
||||||
};
|
};
|
||||||
Q_ENUM(TextRenderType)
|
Q_ENUM(TextRenderType)
|
||||||
|
|
||||||
enum NativeObjectType {
|
|
||||||
NativeObjectTexture
|
|
||||||
};
|
|
||||||
Q_ENUM(NativeObjectType)
|
|
||||||
|
|
||||||
explicit QQuickWindow(QWindow *parent = nullptr);
|
explicit QQuickWindow(QWindow *parent = nullptr);
|
||||||
explicit QQuickWindow(QQuickRenderControl *renderControl);
|
explicit QQuickWindow(QQuickRenderControl *renderControl);
|
||||||
|
|
||||||
|
@ -156,12 +151,6 @@ public:
|
||||||
QSGTexture *createTextureFromImage(const QImage &image) const;
|
QSGTexture *createTextureFromImage(const QImage &image) const;
|
||||||
QSGTexture *createTextureFromImage(const QImage &image, CreateTextureOptions options) const;
|
QSGTexture *createTextureFromImage(const QImage &image, CreateTextureOptions options) const;
|
||||||
|
|
||||||
QSGTexture *createTextureFromNativeObject(NativeObjectType type,
|
|
||||||
quint64 nativeObjectHandle,
|
|
||||||
int nativeLayout,
|
|
||||||
const QSize &size,
|
|
||||||
CreateTextureOptions options = CreateTextureOption()) const;
|
|
||||||
|
|
||||||
void setColor(const QColor &color);
|
void setColor(const QColor &color);
|
||||||
QColor color() const;
|
QColor color() const;
|
||||||
|
|
||||||
|
|
|
@ -242,6 +242,11 @@ public:
|
||||||
|
|
||||||
bool emitError(QQuickWindow::SceneGraphError error, const QString &msg);
|
bool emitError(QQuickWindow::SceneGraphError error, const QString &msg);
|
||||||
|
|
||||||
|
QSGTexture *createTextureFromNativeTexture(quint64 nativeObjectHandle,
|
||||||
|
int nativeLayout,
|
||||||
|
const QSize &size,
|
||||||
|
QQuickWindow::CreateTextureOptions options) const;
|
||||||
|
|
||||||
QQuickItem::UpdatePaintNodeData updatePaintNodeData;
|
QQuickItem::UpdatePaintNodeData updatePaintNodeData;
|
||||||
|
|
||||||
QQuickItem *dirtyItemList;
|
QQuickItem *dirtyItemList;
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
QSGSoftwareLayer::QSGSoftwareLayer(QSGRenderContext *renderContext)
|
QSGSoftwareLayer::QSGSoftwareLayer(QSGRenderContext *renderContext)
|
||||||
: QSGLayer(*(new QSGTexturePrivate))
|
: QSGLayer(*(new QSGTexturePrivate(this)))
|
||||||
, m_item(nullptr)
|
, m_item(nullptr)
|
||||||
, m_context(renderContext)
|
, m_context(renderContext)
|
||||||
, m_renderer(nullptr)
|
, m_renderer(nullptr)
|
||||||
|
|
|
@ -49,7 +49,7 @@ QT_BEGIN_NAMESPACE
|
||||||
Q_LOGGING_CATEGORY(QSG_LOG_TEXTUREIO, "qt.scenegraph.textureio");
|
Q_LOGGING_CATEGORY(QSG_LOG_TEXTUREIO, "qt.scenegraph.textureio");
|
||||||
|
|
||||||
QSGCompressedTexture::QSGCompressedTexture(const QTextureFileData &texData)
|
QSGCompressedTexture::QSGCompressedTexture(const QTextureFileData &texData)
|
||||||
: QSGTexture(*(new QSGTexturePrivate)),
|
: QSGTexture(*(new QSGTexturePrivate(this))),
|
||||||
m_textureData(texData)
|
m_textureData(texData)
|
||||||
{
|
{
|
||||||
m_size = m_textureData.size();
|
m_size = m_textureData.size();
|
||||||
|
|
|
@ -38,8 +38,11 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "qsgtexture_p.h"
|
#include "qsgtexture_p.h"
|
||||||
|
#include "qsgtexture_platform.h"
|
||||||
#include <private/qqmlglobal_p.h>
|
#include <private/qqmlglobal_p.h>
|
||||||
#include <private/qsgmaterialshader_p.h>
|
#include <private/qsgmaterialshader_p.h>
|
||||||
|
#include <private/qquickitem_p.h> // qquickwindow_p.h cannot be included on its own due to template nonsense
|
||||||
|
#include <private/qquickwindow_p.h>
|
||||||
#include <QtGui/private/qrhi_p.h>
|
#include <QtGui/private/qrhi_p.h>
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) && defined(__GLIBC__)
|
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) && defined(__GLIBC__)
|
||||||
|
@ -101,7 +104,7 @@ QSGSamplerDescription QSGSamplerDescription::fromTexture(QSGTexture *t)
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGTexturePrivate::QSGTexturePrivate()
|
QSGTexturePrivate::QSGTexturePrivate(QSGTexture *t)
|
||||||
: wrapChanged(false)
|
: wrapChanged(false)
|
||||||
, filteringChanged(false)
|
, filteringChanged(false)
|
||||||
, anisotropyChanged(false)
|
, anisotropyChanged(false)
|
||||||
|
@ -110,6 +113,18 @@ QSGTexturePrivate::QSGTexturePrivate()
|
||||||
, mipmapMode(QSGTexture::None)
|
, mipmapMode(QSGTexture::None)
|
||||||
, filterMode(QSGTexture::Nearest)
|
, filterMode(QSGTexture::Nearest)
|
||||||
, anisotropyLevel(QSGTexture::AnisotropyNone)
|
, anisotropyLevel(QSGTexture::AnisotropyNone)
|
||||||
|
#if QT_CONFIG(opengl)
|
||||||
|
, m_openglTextureAccessor(t)
|
||||||
|
#endif
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
, m_d3d11TextureAccessor(t)
|
||||||
|
#endif
|
||||||
|
#if defined(Q_OS_MACOS) || defined(Q_OS_IOS)
|
||||||
|
, m_metalTextureAccessor(t)
|
||||||
|
#endif
|
||||||
|
#if QT_CONFIG(vulkan)
|
||||||
|
, m_vulkanTextureAccessor(t)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,34 +329,11 @@ static void qt_debug_remove_texture(QSGTexture* texture)
|
||||||
\since 5.9
|
\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 64-bit container of the native object handle.
|
|
||||||
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\variable QSGTexture::NativeTexture::layout
|
|
||||||
\brief Specifies the current image layout for APIs like Vulkan.
|
|
||||||
|
|
||||||
For Vulkan, \c layout contains a \c VkImageLayout value.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Constructs the QSGTexture base class.
|
Constructs the QSGTexture base class.
|
||||||
*/
|
*/
|
||||||
QSGTexture::QSGTexture()
|
QSGTexture::QSGTexture()
|
||||||
: QObject(*(new QSGTexturePrivate))
|
: QObject(*(new QSGTexturePrivate(this)))
|
||||||
{
|
{
|
||||||
#ifndef QT_NO_DEBUG
|
#ifndef QT_NO_DEBUG
|
||||||
if (qsg_leak_check)
|
if (qsg_leak_check)
|
||||||
|
@ -651,24 +643,6 @@ void QSGTexture::commitTextureOperations(QRhi *rhi, QRhiResourceUpdateBatch *res
|
||||||
Q_UNUSED(resourceUpdates);
|
Q_UNUSED(resourceUpdates);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
|
||||||
\return the platform-specific texture data for this texture.
|
|
||||||
|
|
||||||
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
|
|
||||||
{
|
|
||||||
if (auto *tex = rhiTexture()) {
|
|
||||||
auto nativeTexture = tex->nativeTexture();
|
|
||||||
return {nativeTexture.object, nativeTexture.layout};
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QSGTexturePrivate::hasDirtySamplerOptions() const
|
bool QSGTexturePrivate::hasDirtySamplerOptions() const
|
||||||
{
|
{
|
||||||
return wrapChanged || filteringChanged || anisotropyChanged;
|
return wrapChanged || filteringChanged || anisotropyChanged;
|
||||||
|
@ -714,6 +688,324 @@ QSGDynamicTexture::QSGDynamicTexture(QSGTexturePrivate &dd)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn template<typename T> T *QSGTexture::platformInterface<T>()
|
||||||
|
|
||||||
|
Returns a platform interface of type T for the texture.
|
||||||
|
|
||||||
|
This function provides access to platform specific functionality of
|
||||||
|
QSGTexture, as defined in the QPlatformInterface namespace. This allows
|
||||||
|
accessing the underlying native texture object, such as, the \c GLuint
|
||||||
|
texture ID with OpenGL, or the \c VkImage handle with Vulkan.
|
||||||
|
|
||||||
|
If the requested interface is not available a \nullptr is returned.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\namespace QPlatformInterface
|
||||||
|
\inmodule QtQuick
|
||||||
|
\since 6.0
|
||||||
|
|
||||||
|
\brief The QPlatformInterface namespace contains graphics API specific
|
||||||
|
interfaces that allow accessing the underlying graphics resources and allow
|
||||||
|
creating QSGTexture instances that wrap an existing native resource.
|
||||||
|
|
||||||
|
The classes in this namespace can be passed to
|
||||||
|
QSGTexture::platformInterface() to gain access to the appropriate graphics
|
||||||
|
API specific interface, as long as the scene graph has been initialized with
|
||||||
|
the graphics API in question.
|
||||||
|
|
||||||
|
\sa QSGTexture::platformInterface()
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if QT_CONFIG(opengl) || defined(Q_CLANG_QDOC)
|
||||||
|
namespace QPlatformInterface {
|
||||||
|
/*!
|
||||||
|
\class QPlatformInterface::QSGOpenGLTexture
|
||||||
|
\inmodule QtQuick
|
||||||
|
\brief Provides access to and enables adopting OpenGL texture objects.
|
||||||
|
\since 6.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn VkImage QPlatformInterface::QSGOpenGLTexture::nativeTexture() const
|
||||||
|
\return the OpenGL texture ID.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\internal
|
||||||
|
*/
|
||||||
|
QSGOpenGLTexture::~QSGOpenGLTexture()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Creates a new QSGTexture wrapping an existing OpenGL texture object.
|
||||||
|
|
||||||
|
The native object specified in \a textureId is wrapped, but not owned, by
|
||||||
|
the resulting QSGTexture. The caller of the function is responsible for
|
||||||
|
deleting the returned QSGTexture, but that will not destroy the underlying
|
||||||
|
native object.
|
||||||
|
|
||||||
|
This function is currently suitable for 2D RGBA textures only.
|
||||||
|
|
||||||
|
\warning This function will return null if the scenegraph has not yet been
|
||||||
|
initialized.
|
||||||
|
|
||||||
|
Use \a options to customize the texture attributes. Only the
|
||||||
|
TextureHasAlphaChannel and TextureHasMipmaps are taken into account here.
|
||||||
|
|
||||||
|
\a size specifies the size in pixels.
|
||||||
|
|
||||||
|
\note This function must be called on the scenegraph rendering thread.
|
||||||
|
|
||||||
|
\sa QQuickWindow::sceneGraphInitialized(), QSGTexture,
|
||||||
|
{Scene Graph - Metal Texture Import}, {Scene Graph - Vulkan Texture Import}
|
||||||
|
|
||||||
|
\since 6.0
|
||||||
|
*/
|
||||||
|
QSGTexture *QSGOpenGLTexture::fromNative(GLuint textureId,
|
||||||
|
QQuickWindow *window,
|
||||||
|
const QSize &size,
|
||||||
|
QQuickWindow::CreateTextureOptions options)
|
||||||
|
{
|
||||||
|
return QQuickWindowPrivate::get(window)->createTextureFromNativeTexture(quint64(textureId), 0, size, options);
|
||||||
|
}
|
||||||
|
} // QPlatformInterface
|
||||||
|
|
||||||
|
GLuint QSGTexturePlatformOpenGL::nativeTexture() const
|
||||||
|
{
|
||||||
|
if (auto *tex = m_texture->rhiTexture())
|
||||||
|
return GLuint(tex->nativeTexture().object);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> Q_QUICK_EXPORT
|
||||||
|
QPlatformInterface::QSGOpenGLTexture *QSGTexture::platformInterface<QPlatformInterface::QSGOpenGLTexture>()
|
||||||
|
{
|
||||||
|
Q_D(QSGTexture);
|
||||||
|
return &d->m_openglTextureAccessor;
|
||||||
|
}
|
||||||
|
#endif // opengl
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
|
||||||
|
namespace QPlatformInterface {
|
||||||
|
/*!
|
||||||
|
\class QPlatformInterface::QSGD3D11Texture
|
||||||
|
\inmodule QtQuick
|
||||||
|
\brief Provides access to and enables adopting Direct3D 11 texture objects.
|
||||||
|
\since 6.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn void *QPlatformInterface::QSGD3D11Texture::nativeTexture() const
|
||||||
|
\return the ID3D11Texture2D object.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\internal
|
||||||
|
*/
|
||||||
|
QSGD3D11Texture::~QSGD3D11Texture()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Creates a new QSGTexture wrapping an existing Direct 3D 11 \a texture object.
|
||||||
|
|
||||||
|
The native object is wrapped, but not owned, by the resulting QSGTexture.
|
||||||
|
The caller of the function is responsible for deleting the returned
|
||||||
|
QSGTexture, but that will not destroy the underlying native object.
|
||||||
|
|
||||||
|
This function is currently suitable for 2D RGBA textures only.
|
||||||
|
|
||||||
|
\warning This function will return null if the scene graph has not yet been
|
||||||
|
initialized.
|
||||||
|
|
||||||
|
Use \a options to customize the texture attributes. Only the
|
||||||
|
TextureHasAlphaChannel and TextureHasMipmaps are taken into account here.
|
||||||
|
|
||||||
|
\a size specifies the size in pixels.
|
||||||
|
|
||||||
|
\note This function must be called on the scene graph rendering thread.
|
||||||
|
|
||||||
|
\sa QQuickWindow::sceneGraphInitialized(), QSGTexture,
|
||||||
|
{Scene Graph - Metal Texture Import}, {Scene Graph - Vulkan Texture Import}
|
||||||
|
|
||||||
|
\since 6.0
|
||||||
|
*/
|
||||||
|
QSGTexture *QSGD3D11Texture::fromNative(void *texture,
|
||||||
|
QQuickWindow *window,
|
||||||
|
const QSize &size,
|
||||||
|
QQuickWindow::CreateTextureOptions options)
|
||||||
|
{
|
||||||
|
return QQuickWindowPrivate::get(window)->createTextureFromNativeTexture(quint64(texture), 0, size, options);
|
||||||
|
}
|
||||||
|
} // QPlatformInterface
|
||||||
|
|
||||||
|
void *QSGTexturePlatformD3D11::nativeTexture() const
|
||||||
|
{
|
||||||
|
if (auto *tex = m_texture->rhiTexture())
|
||||||
|
return reinterpret_cast<void *>(quintptr(tex->nativeTexture().object));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> Q_QUICK_EXPORT
|
||||||
|
QPlatformInterface::QSGD3D11Texture *QSGTexture::platformInterface<QPlatformInterface::QSGD3D11Texture>()
|
||||||
|
{
|
||||||
|
Q_D(QSGTexture);
|
||||||
|
return &d->m_d3d11TextureAccessor;
|
||||||
|
}
|
||||||
|
#endif // win
|
||||||
|
|
||||||
|
#if defined(Q_OS_MACOS) || defined(Q_OS_IOS) || defined(Q_CLANG_QDOC)
|
||||||
|
namespace QPlatformInterface {
|
||||||
|
/*!
|
||||||
|
\class QPlatformInterface::QSGMetalTexture
|
||||||
|
\inmodule QtQuick
|
||||||
|
\brief Provides access to and enables adopting Metal texture objects.
|
||||||
|
\since 6.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn MTLTexture *QPlatformInterface::QSGMetalTexture::nativeTexture() const
|
||||||
|
\return the Metal texture object.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\internal
|
||||||
|
*/
|
||||||
|
QSGMetalTexture::~QSGMetalTexture()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn QSGTexture *QPlatformInterface::QSGMetalTexture::fromNative(MTLTexture *texture, QQuickWindow *window, const QSize &size, QQuickWindow::CreateTextureOptions options)
|
||||||
|
|
||||||
|
Creates a new QSGTexture wrapping an existing Metal \a texture object.
|
||||||
|
|
||||||
|
The native object is wrapped, but not owned, by the resulting QSGTexture.
|
||||||
|
The caller of the function is responsible for deleting the returned
|
||||||
|
QSGTexture, but that will not destroy the underlying native object.
|
||||||
|
|
||||||
|
This function is currently suitable for 2D RGBA textures only.
|
||||||
|
|
||||||
|
\warning This function will return null if the scene graph has not yet been
|
||||||
|
initialized.
|
||||||
|
|
||||||
|
Use \a options to customize the texture attributes. Only the
|
||||||
|
TextureHasAlphaChannel and TextureHasMipmaps are taken into account here.
|
||||||
|
|
||||||
|
\a size specifies the size in pixels.
|
||||||
|
|
||||||
|
\note This function must be called on the scene graph rendering thread.
|
||||||
|
|
||||||
|
\sa QQuickWindow::sceneGraphInitialized(), QSGTexture,
|
||||||
|
{Scene Graph - Metal Texture Import}, {Scene Graph - Vulkan Texture Import}
|
||||||
|
|
||||||
|
\since 6.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
} // QPlatformInterface
|
||||||
|
|
||||||
|
MTLTexture *QSGTexturePlatformMetal::nativeTexture() const
|
||||||
|
{
|
||||||
|
if (auto *tex = m_texture->rhiTexture())
|
||||||
|
return (MTLTexture *) quintptr(tex->nativeTexture().object);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> Q_QUICK_EXPORT
|
||||||
|
QPlatformInterface::QSGMetalTexture *QSGTexture::platformInterface<QPlatformInterface::QSGMetalTexture>()
|
||||||
|
{
|
||||||
|
Q_D(QSGTexture);
|
||||||
|
return &d->m_metalTextureAccessor;
|
||||||
|
}
|
||||||
|
#endif // win
|
||||||
|
|
||||||
|
#if QT_CONFIG(vulkan) || defined(Q_CLANG_QDOC)
|
||||||
|
namespace QPlatformInterface {
|
||||||
|
/*!
|
||||||
|
\class QPlatformInterface::QSGVulkanTexture
|
||||||
|
\inmodule QtQuick
|
||||||
|
\brief Provides access to and enables adopting Vulkan image objects.
|
||||||
|
\since 6.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn VkImage QPlatformInterface::QSGVulkanTexture::nativeImage() const
|
||||||
|
\return the VkImage handle.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn VkImageLayout QPlatformInterface::QSGVulkanTexture::nativeImageLayout() const
|
||||||
|
\return the image layout.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\internal
|
||||||
|
*/
|
||||||
|
QSGVulkanTexture::~QSGVulkanTexture()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Creates a new QSGTexture wrapping an existing Vulkan \a image object.
|
||||||
|
|
||||||
|
The native object is wrapped, but not owned, by the resulting QSGTexture.
|
||||||
|
The caller of the function is responsible for deleting the returned
|
||||||
|
QSGTexture, but that will not destroy the underlying native object.
|
||||||
|
|
||||||
|
This function is currently suitable for 2D RGBA textures only.
|
||||||
|
|
||||||
|
\warning This function will return null if the scene graph has not yet been
|
||||||
|
initialized.
|
||||||
|
|
||||||
|
\a layout must specify the current layout of the image.
|
||||||
|
|
||||||
|
Use \a options to customize the texture attributes. Only the
|
||||||
|
TextureHasAlphaChannel and TextureHasMipmaps are taken into account here.
|
||||||
|
|
||||||
|
\a size specifies the size in pixels.
|
||||||
|
|
||||||
|
\note This function must be called on the scene graph rendering thread.
|
||||||
|
|
||||||
|
\sa QQuickWindow::sceneGraphInitialized(), QSGTexture,
|
||||||
|
{Scene Graph - Metal Texture Import}, {Scene Graph - Vulkan Texture Import}
|
||||||
|
|
||||||
|
\since 6.0
|
||||||
|
*/
|
||||||
|
QSGTexture *QSGVulkanTexture::fromNative(VkImage image,
|
||||||
|
VkImageLayout layout,
|
||||||
|
QQuickWindow *window,
|
||||||
|
const QSize &size,
|
||||||
|
QQuickWindow::CreateTextureOptions options)
|
||||||
|
{
|
||||||
|
return QQuickWindowPrivate::get(window)->createTextureFromNativeTexture(quint64(image), layout, size, options);
|
||||||
|
}
|
||||||
|
} // QPlatformInterface
|
||||||
|
|
||||||
|
VkImage QSGTexturePlatformVulkan::nativeImage() const
|
||||||
|
{
|
||||||
|
if (auto *tex = m_texture->rhiTexture())
|
||||||
|
return VkImage(tex->nativeTexture().object);
|
||||||
|
return VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
VkImageLayout QSGTexturePlatformVulkan::nativeImageLayout() const
|
||||||
|
{
|
||||||
|
if (auto *tex = m_texture->rhiTexture())
|
||||||
|
return VkImageLayout(tex->nativeTexture().layout);
|
||||||
|
return VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> Q_QUICK_EXPORT
|
||||||
|
QPlatformInterface::QSGVulkanTexture *QSGTexture::platformInterface<QPlatformInterface::QSGVulkanTexture>()
|
||||||
|
{
|
||||||
|
Q_D(QSGTexture);
|
||||||
|
return &d->m_vulkanTextureAccessor;
|
||||||
|
}
|
||||||
|
#endif // vulkan
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#include "moc_qsgtexture.cpp"
|
#include "moc_qsgtexture.cpp"
|
||||||
|
|
|
@ -41,8 +41,9 @@
|
||||||
#define QSGTEXTURE_H
|
#define QSGTEXTURE_H
|
||||||
|
|
||||||
#include <QtQuick/qtquickglobal.h>
|
#include <QtQuick/qtquickglobal.h>
|
||||||
#include <QtCore/QObject>
|
#include <QtCore/qobject.h>
|
||||||
#include <QtGui/QImage>
|
#include <QtGui/qimage.h>
|
||||||
|
#include <QtQuick/qsgtexture_platform.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
@ -80,14 +81,8 @@ public:
|
||||||
Anisotropy16x
|
Anisotropy16x
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NativeTexture {
|
|
||||||
quint64 object;
|
|
||||||
int layout;
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual qint64 comparisonKey() const = 0;
|
virtual qint64 comparisonKey() const = 0;
|
||||||
virtual QRhiTexture *rhiTexture() const;
|
virtual QRhiTexture *rhiTexture() const;
|
||||||
NativeTexture nativeTexture() const;
|
|
||||||
virtual QSize textureSize() const = 0;
|
virtual QSize textureSize() const = 0;
|
||||||
virtual bool hasAlphaChannel() const = 0;
|
virtual bool hasAlphaChannel() const = 0;
|
||||||
virtual bool hasMipmaps() const = 0;
|
virtual bool hasMipmaps() const = 0;
|
||||||
|
@ -117,6 +112,8 @@ public:
|
||||||
|
|
||||||
inline QRectF convertToNormalizedSourceRect(const QRectF &rect) const;
|
inline QRectF convertToNormalizedSourceRect(const QRectF &rect) const;
|
||||||
|
|
||||||
|
template<typename T> T *platformInterface();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QSGTexture(QSGTexturePrivate &dd);
|
QSGTexture(QSGTexturePrivate &dd);
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2020 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 "qsgtexture_p.h"
|
||||||
|
#include "qsgtexture_platform.h"
|
||||||
|
#include <private/qquickitem_p.h>
|
||||||
|
#include <private/qquickwindow_p.h>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
namespace QPlatformInterface {
|
||||||
|
|
||||||
|
QSGTexture *QSGMetalTexture::fromNative(MTLTexture *texture,
|
||||||
|
QQuickWindow *window,
|
||||||
|
const QSize &size,
|
||||||
|
QQuickWindow::CreateTextureOptions options)
|
||||||
|
{
|
||||||
|
return QQuickWindowPrivate::get(window)->createTextureFromNativeTexture(quint64(texture), 0, size, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // QPlatformInterface
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
|
@ -74,11 +74,56 @@ bool operator==(const QSGSamplerDescription &a, const QSGSamplerDescription &b)
|
||||||
bool operator!=(const QSGSamplerDescription &a, const QSGSamplerDescription &b) Q_DECL_NOTHROW;
|
bool operator!=(const QSGSamplerDescription &a, const QSGSamplerDescription &b) Q_DECL_NOTHROW;
|
||||||
size_t qHash(const QSGSamplerDescription &s, uint seed = 0) Q_DECL_NOTHROW;
|
size_t qHash(const QSGSamplerDescription &s, uint seed = 0) Q_DECL_NOTHROW;
|
||||||
|
|
||||||
|
#if QT_CONFIG(opengl)
|
||||||
|
class Q_QUICK_PRIVATE_EXPORT QSGTexturePlatformOpenGL : public QPlatformInterface::QSGOpenGLTexture
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QSGTexturePlatformOpenGL(QSGTexture *t) : m_texture(t) { }
|
||||||
|
QSGTexture *m_texture;
|
||||||
|
|
||||||
|
GLuint nativeTexture() const override;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
class Q_QUICK_PRIVATE_EXPORT QSGTexturePlatformD3D11 : public QPlatformInterface::QSGD3D11Texture
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QSGTexturePlatformD3D11(QSGTexture *t) : m_texture(t) { }
|
||||||
|
QSGTexture *m_texture;
|
||||||
|
|
||||||
|
void *nativeTexture() const override;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(Q_OS_MACOS) || defined(Q_OS_IOS)
|
||||||
|
class Q_QUICK_PRIVATE_EXPORT QSGTexturePlatformMetal : public QPlatformInterface::QSGMetalTexture
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QSGTexturePlatformMetal(QSGTexture *t) : m_texture(t) { }
|
||||||
|
QSGTexture *m_texture;
|
||||||
|
|
||||||
|
MTLTexture *nativeTexture() const override;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if QT_CONFIG(vulkan)
|
||||||
|
class Q_QUICK_PRIVATE_EXPORT QSGTexturePlatformVulkan : public QPlatformInterface::QSGVulkanTexture
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QSGTexturePlatformVulkan(QSGTexture *t) : m_texture(t) { }
|
||||||
|
QSGTexture *m_texture;
|
||||||
|
|
||||||
|
VkImage nativeImage() const override;
|
||||||
|
VkImageLayout nativeImageLayout() const override;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
class Q_QUICK_PRIVATE_EXPORT QSGTexturePrivate : public QObjectPrivate
|
class Q_QUICK_PRIVATE_EXPORT QSGTexturePrivate : public QObjectPrivate
|
||||||
{
|
{
|
||||||
Q_DECLARE_PUBLIC(QSGTexture)
|
Q_DECLARE_PUBLIC(QSGTexture)
|
||||||
public:
|
public:
|
||||||
QSGTexturePrivate();
|
QSGTexturePrivate(QSGTexture *t);
|
||||||
static QSGTexturePrivate *get(QSGTexture *t) { return t->d_func(); }
|
static QSGTexturePrivate *get(QSGTexture *t) { return t->d_func(); }
|
||||||
void resetDirtySamplerOptions();
|
void resetDirtySamplerOptions();
|
||||||
bool hasDirtySamplerOptions() const;
|
bool hasDirtySamplerOptions() const;
|
||||||
|
@ -92,6 +137,22 @@ public:
|
||||||
uint mipmapMode : 2;
|
uint mipmapMode : 2;
|
||||||
uint filterMode : 2;
|
uint filterMode : 2;
|
||||||
uint anisotropyLevel: 3;
|
uint anisotropyLevel: 3;
|
||||||
|
|
||||||
|
// While we could make QSGTexturePrivate implement all the interfaces, we
|
||||||
|
// rather choose to use separate objects to avoid clashes in the function
|
||||||
|
// names and signatures.
|
||||||
|
#if QT_CONFIG(opengl)
|
||||||
|
QSGTexturePlatformOpenGL m_openglTextureAccessor;
|
||||||
|
#endif
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
QSGTexturePlatformD3D11 m_d3d11TextureAccessor;
|
||||||
|
#endif
|
||||||
|
#if defined(Q_OS_MACOS) || defined(Q_OS_IOS)
|
||||||
|
QSGTexturePlatformMetal m_metalTextureAccessor;
|
||||||
|
#endif
|
||||||
|
#if QT_CONFIG(vulkan)
|
||||||
|
QSGTexturePlatformVulkan m_vulkanTextureAccessor;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_QUICK_PRIVATE_EXPORT bool qsg_safeguard_texture(QSGTexture *);
|
Q_QUICK_PRIVATE_EXPORT bool qsg_safeguard_texture(QSGTexture *);
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2020 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 QSGTEXTURE_PLATFORM_H
|
||||||
|
#define QSGTEXTURE_PLATFORM_H
|
||||||
|
|
||||||
|
#include <QtQuick/qquickwindow.h>
|
||||||
|
|
||||||
|
#if QT_CONFIG(opengl)
|
||||||
|
#include <QtGui/qopengl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if QT_CONFIG(vulkan)
|
||||||
|
#include <QtGui/qvulkaninstance.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(Q_OS_MACOS) || defined(Q_OS_IOS) || defined(Q_CLANG_QDOC)
|
||||||
|
Q_FORWARD_DECLARE_OBJC_CLASS(MTLTexture);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
namespace QPlatformInterface {
|
||||||
|
|
||||||
|
#if QT_CONFIG(opengl) || defined(Q_CLANG_QDOC)
|
||||||
|
class Q_QUICK_EXPORT QSGOpenGLTexture
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~QSGOpenGLTexture();
|
||||||
|
virtual GLuint nativeTexture() const = 0;
|
||||||
|
static QSGTexture *fromNative(GLuint textureId,
|
||||||
|
QQuickWindow *window,
|
||||||
|
const QSize &size,
|
||||||
|
QQuickWindow::CreateTextureOptions options = {});
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
|
||||||
|
class Q_QUICK_EXPORT QSGD3D11Texture
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~QSGD3D11Texture();
|
||||||
|
virtual void *nativeTexture() const = 0;
|
||||||
|
static QSGTexture *fromNative(void *texture,
|
||||||
|
QQuickWindow *window,
|
||||||
|
const QSize &size,
|
||||||
|
QQuickWindow::CreateTextureOptions options = {});
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(Q_OS_MACOS) || defined(Q_OS_IOS) || defined(Q_CLANG_QDOC)
|
||||||
|
class Q_QUICK_EXPORT QSGMetalTexture
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~QSGMetalTexture();
|
||||||
|
virtual MTLTexture *nativeTexture() const = 0;
|
||||||
|
static QSGTexture *fromNative(MTLTexture *texture,
|
||||||
|
QQuickWindow *window,
|
||||||
|
const QSize &size,
|
||||||
|
QQuickWindow::CreateTextureOptions options = {});
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if QT_CONFIG(vulkan) || defined(Q_CLANG_QDOC)
|
||||||
|
class Q_QUICK_EXPORT QSGVulkanTexture
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~QSGVulkanTexture();
|
||||||
|
virtual VkImage nativeImage() const = 0;
|
||||||
|
virtual VkImageLayout nativeImageLayout() const = 0;
|
||||||
|
static QSGTexture *fromNative(VkImage image,
|
||||||
|
VkImageLayout layout,
|
||||||
|
QQuickWindow *window,
|
||||||
|
const QSize &size,
|
||||||
|
QQuickWindow::CreateTextureOptions options = {});
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // QPlatformInterface
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // QSGTEXTURE_PLATFORM_H
|
|
@ -44,7 +44,7 @@
|
||||||
#include <private/qsgdefaultrendercontext_p.h>
|
#include <private/qsgdefaultrendercontext_p.h>
|
||||||
|
|
||||||
QSGRhiLayer::QSGRhiLayer(QSGRenderContext *context)
|
QSGRhiLayer::QSGRhiLayer(QSGRenderContext *context)
|
||||||
: QSGLayer(*(new QSGTexturePrivate))
|
: QSGLayer(*(new QSGTexturePrivate(this)))
|
||||||
, m_mipmap(false)
|
, m_mipmap(false)
|
||||||
, m_live(true)
|
, m_live(true)
|
||||||
, m_recursive(false)
|
, m_recursive(false)
|
||||||
|
|
|
@ -19,6 +19,7 @@ HEADERS += \
|
||||||
$$PWD/coreapi/qsggeometry_p.h \
|
$$PWD/coreapi/qsggeometry_p.h \
|
||||||
$$PWD/coreapi/qsgtexture.h \
|
$$PWD/coreapi/qsgtexture.h \
|
||||||
$$PWD/coreapi/qsgtexture_p.h \
|
$$PWD/coreapi/qsgtexture_p.h \
|
||||||
|
$$PWD/coreapi/qsgtexture_platform.h \
|
||||||
$$PWD/coreapi/qsgbatchrenderer_p.h \
|
$$PWD/coreapi/qsgbatchrenderer_p.h \
|
||||||
$$PWD/coreapi/qsgrhivisualizer_p.h
|
$$PWD/coreapi/qsgrhivisualizer_p.h
|
||||||
|
|
||||||
|
@ -36,6 +37,10 @@ SOURCES += \
|
||||||
$$PWD/coreapi/qsgbatchrenderer.cpp \
|
$$PWD/coreapi/qsgbatchrenderer.cpp \
|
||||||
$$PWD/coreapi/qsgrhivisualizer.cpp
|
$$PWD/coreapi/qsgrhivisualizer.cpp
|
||||||
|
|
||||||
|
macos|ios {
|
||||||
|
SOURCES += \
|
||||||
|
$$PWD/coreapi/qsgtexture_mac.mm
|
||||||
|
}
|
||||||
|
|
||||||
# Util API
|
# Util API
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
|
|
|
@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE
|
||||||
#define QT_MINIMUM_DYNAMIC_FBO_SIZE 64U
|
#define QT_MINIMUM_DYNAMIC_FBO_SIZE 64U
|
||||||
|
|
||||||
QSGPainterTexture::QSGPainterTexture()
|
QSGPainterTexture::QSGPainterTexture()
|
||||||
: QSGPlainTexture(*(new QSGPlainTexturePrivate))
|
: QSGPlainTexture(*(new QSGPlainTexturePrivate(this)))
|
||||||
{
|
{
|
||||||
m_retain_image = true;
|
m_retain_image = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
QSGPlainTexture::QSGPlainTexture()
|
QSGPlainTexture::QSGPlainTexture()
|
||||||
: QSGTexture(*(new QSGPlainTexturePrivate))
|
: QSGTexture(*(new QSGPlainTexturePrivate(this)))
|
||||||
, m_texture(nullptr)
|
, m_texture(nullptr)
|
||||||
, m_has_alpha(false)
|
, m_has_alpha(false)
|
||||||
, m_dirty_texture(false)
|
, m_dirty_texture(false)
|
||||||
|
@ -100,12 +100,10 @@ void QSGPlainTexture::setTexture(QRhiTexture *texture) // RHI only
|
||||||
m_mipmaps_generated = false;
|
m_mipmaps_generated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QSGPlainTexture::setTextureFromNativeObject(QRhi *rhi, QQuickWindow::NativeObjectType type,
|
void QSGPlainTexture::setTextureFromNativeTexture(QRhi *rhi,
|
||||||
quint64 nativeObjectHandle, int nativeLayout,
|
quint64 nativeObjectHandle, int nativeLayout,
|
||||||
const QSize &size, bool mipmap)
|
const QSize &size, bool mipmap)
|
||||||
{
|
{
|
||||||
Q_UNUSED(type);
|
|
||||||
|
|
||||||
QRhiTexture::Flags flags;
|
QRhiTexture::Flags flags;
|
||||||
if (mipmap)
|
if (mipmap)
|
||||||
flags |= QRhiTexture::MipMapped | QRhiTexture::UsedWithGenerateMips;
|
flags |= QRhiTexture::MipMapped | QRhiTexture::UsedWithGenerateMips;
|
||||||
|
|
|
@ -87,9 +87,9 @@ public:
|
||||||
void commitTextureOperations(QRhi *rhi, QRhiResourceUpdateBatch *resourceUpdates) override;
|
void commitTextureOperations(QRhi *rhi, QRhiResourceUpdateBatch *resourceUpdates) override;
|
||||||
|
|
||||||
void setTexture(QRhiTexture *texture);
|
void setTexture(QRhiTexture *texture);
|
||||||
void setTextureFromNativeObject(QRhi *rhi, QQuickWindow::NativeObjectType type,
|
void setTextureFromNativeTexture(QRhi *rhi,
|
||||||
quint64 nativeObjectHandle, int nativeLayout,
|
quint64 nativeObjectHandle, int nativeLayout,
|
||||||
const QSize &size, bool mipmap);
|
const QSize &size, bool mipmap);
|
||||||
|
|
||||||
static QSGPlainTexture *fromImage(const QImage &image) {
|
static QSGPlainTexture *fromImage(const QImage &image) {
|
||||||
QSGPlainTexture *t = new QSGPlainTexture();
|
QSGPlainTexture *t = new QSGPlainTexture();
|
||||||
|
@ -119,6 +119,7 @@ class QSGPlainTexturePrivate : public QSGTexturePrivate
|
||||||
{
|
{
|
||||||
Q_DECLARE_PUBLIC(QSGPlainTexture)
|
Q_DECLARE_PUBLIC(QSGPlainTexture)
|
||||||
public:
|
public:
|
||||||
|
QSGPlainTexturePrivate(QSGTexture *t) : QSGTexturePrivate(t) { }
|
||||||
QSGTexture::Filtering m_last_mipmap_filter = QSGTexture::None;
|
QSGTexture::Filtering m_last_mipmap_filter = QSGTexture::None;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -338,7 +338,7 @@ void Atlas::enqueueTextureUpload(TextureBase *t, QRhiResourceUpdateBatch *resour
|
||||||
}
|
}
|
||||||
|
|
||||||
TextureBase::TextureBase(AtlasBase *atlas, const QRect &textureRect)
|
TextureBase::TextureBase(AtlasBase *atlas, const QRect &textureRect)
|
||||||
: QSGTexture(*(new QSGTexturePrivate))
|
: QSGTexture(*(new QSGTexturePrivate(this)))
|
||||||
, m_allocated_rect(textureRect)
|
, m_allocated_rect(textureRect)
|
||||||
, m_atlas(atlas)
|
, m_atlas(atlas)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue