rhi: Remove Q_RELOCATABLE_TYPE for types with QVLA in them
QVLA itself is non-relocatable due to self references. (ptr pointing to array[Prealloc] as long as capacity < Prealloc) Seems we shot ourselves in the foot in multiple places with this. Pick-to: 6.2 6.2.0 Fixes: QTBUG-96619 Change-Id: I57a2ce539b671326cd352dbe57a1f3d4c46a6456 Reviewed-by: Tobias Koenig <tobias.koenig@kdab.com> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
parent
b4bb3a5415
commit
481bc82d59
@ -284,8 +284,6 @@ private:
|
||||
friend Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiVertexInputLayout &);
|
||||
};
|
||||
|
||||
Q_DECLARE_TYPEINFO(QRhiVertexInputLayout, Q_RELOCATABLE_TYPE);
|
||||
|
||||
Q_GUI_EXPORT bool operator==(const QRhiVertexInputLayout &a, const QRhiVertexInputLayout &b) noexcept;
|
||||
Q_GUI_EXPORT bool operator!=(const QRhiVertexInputLayout &a, const QRhiVertexInputLayout &b) noexcept;
|
||||
Q_GUI_EXPORT size_t qHash(const QRhiVertexInputLayout &v, size_t seed = 0) noexcept;
|
||||
@ -526,8 +524,6 @@ private:
|
||||
QRhiTexture *m_depthTexture = nullptr;
|
||||
};
|
||||
|
||||
Q_DECLARE_TYPEINFO(QRhiTextureRenderTargetDescription, Q_RELOCATABLE_TYPE);
|
||||
|
||||
class Q_GUI_EXPORT QRhiTextureSubresourceUploadDescription
|
||||
{
|
||||
public:
|
||||
@ -609,8 +605,6 @@ private:
|
||||
QVarLengthArray<QRhiTextureUploadEntry, 16> m_entries;
|
||||
};
|
||||
|
||||
Q_DECLARE_TYPEINFO(QRhiTextureUploadDescription, Q_RELOCATABLE_TYPE);
|
||||
|
||||
class Q_GUI_EXPORT QRhiTextureCopyDescription
|
||||
{
|
||||
public:
|
||||
@ -1470,7 +1464,7 @@ struct Q_GUI_EXPORT QRhiReadbackResult
|
||||
QRhiTexture::Format format;
|
||||
QSize pixelSize;
|
||||
QByteArray data;
|
||||
}; // non-movable due to the std::function
|
||||
};
|
||||
|
||||
struct Q_GUI_EXPORT QRhiBufferReadbackResult
|
||||
{
|
||||
|
@ -519,9 +519,6 @@ public:
|
||||
static QRhiResourceUpdateBatchPrivate *get(QRhiResourceUpdateBatch *b) { return b->d; }
|
||||
};
|
||||
|
||||
Q_DECLARE_TYPEINFO(QRhiResourceUpdateBatchPrivate::BufferOp, Q_RELOCATABLE_TYPE);
|
||||
Q_DECLARE_TYPEINFO(QRhiResourceUpdateBatchPrivate::TextureOp, Q_RELOCATABLE_TYPE);
|
||||
|
||||
template<typename T>
|
||||
struct QRhiBatchedBindings
|
||||
{
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include <QPainter>
|
||||
|
||||
#include <QtGui/private/qrhi_p.h>
|
||||
#include <QtGui/private/qrhi_p_p.h>
|
||||
#include <QtGui/private/qrhinull_p.h>
|
||||
|
||||
#if QT_CONFIG(opengl)
|
||||
@ -93,6 +94,8 @@ private slots:
|
||||
void resourceUpdateBatchRGBATextureMip();
|
||||
void resourceUpdateBatchTextureRawDataStride_data();
|
||||
void resourceUpdateBatchTextureRawDataStride();
|
||||
void resourceUpdateBatchLotsOfResources_data();
|
||||
void resourceUpdateBatchLotsOfResources();
|
||||
void invalidPipeline_data();
|
||||
void invalidPipeline();
|
||||
void srbLayoutCompatibility_data();
|
||||
@ -1371,6 +1374,49 @@ void tst_QRhi::resourceUpdateBatchTextureRawDataStride()
|
||||
}
|
||||
}
|
||||
|
||||
void tst_QRhi::resourceUpdateBatchLotsOfResources_data()
|
||||
{
|
||||
rhiTestData();
|
||||
}
|
||||
|
||||
void tst_QRhi::resourceUpdateBatchLotsOfResources()
|
||||
{
|
||||
QFETCH(QRhi::Implementation, impl);
|
||||
QFETCH(QRhiInitParams *, initParams);
|
||||
|
||||
QScopedPointer<QRhi> rhi(QRhi::create(impl, initParams, QRhi::Flags(), nullptr));
|
||||
if (!rhi)
|
||||
QSKIP("QRhi could not be created, skipping testing resource updates");
|
||||
|
||||
QImage image(128, 128, QImage::Format_RGBA8888_Premultiplied);
|
||||
image.fill(Qt::red);
|
||||
static const float bufferData[64] = {};
|
||||
|
||||
QRhiResourceUpdateBatch *b = rhi->nextResourceUpdateBatch();
|
||||
std::vector<std::unique_ptr<QRhiTexture>> textures;
|
||||
std::vector<std::unique_ptr<QRhiBuffer>> buffers;
|
||||
|
||||
// QTBUG-96619
|
||||
static const int TEXTURE_COUNT = 3 * QRhiResourceUpdateBatchPrivate::TEXTURE_OPS_STATIC_ALLOC;
|
||||
static const int BUFFER_COUNT = 3 * QRhiResourceUpdateBatchPrivate::BUFFER_OPS_STATIC_ALLOC;
|
||||
|
||||
for (int i = 0; i < TEXTURE_COUNT; ++i) {
|
||||
std::unique_ptr<QRhiTexture> texture(rhi->newTexture(QRhiTexture::RGBA8, image.size()));
|
||||
QVERIFY(texture->create());
|
||||
b->uploadTexture(texture.get(), image);
|
||||
textures.push_back(std::move(texture));
|
||||
}
|
||||
|
||||
for (int i = 0; i < BUFFER_COUNT; ++i) {
|
||||
std::unique_ptr<QRhiBuffer> buffer(rhi->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer, 256));
|
||||
QVERIFY(buffer->create());
|
||||
b->uploadStaticBuffer(buffer.get(), bufferData);
|
||||
buffers.push_back(std::move(buffer));
|
||||
}
|
||||
|
||||
submitResourceUpdates(rhi.data(), b);
|
||||
}
|
||||
|
||||
static QShader loadShader(const char *name)
|
||||
{
|
||||
QFile f(QString::fromUtf8(name));
|
||||
|
Loading…
Reference in New Issue
Block a user