From 481bc82d5931d5c715c2e889da6f249aa88057de Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Sun, 19 Sep 2021 10:50:17 +0200 Subject: 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 Reviewed-by: Lars Knoll --- tests/auto/gui/rhi/qrhi/tst_qrhi.cpp | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'tests/auto') diff --git a/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp b/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp index 47dfe8334e..24d6ad2d7c 100644 --- a/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp +++ b/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp @@ -33,6 +33,7 @@ #include #include +#include #include #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 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> textures; + std::vector> 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 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 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)); -- cgit v1.2.3