diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2021-02-03 18:07:47 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2021-03-30 16:43:35 +0200 |
commit | 7ccd2d02463f8076631bc45e5bf1386c61037dc7 (patch) | |
tree | 02614d53f737f1c4aa56549221262d43e3cbc2fc /tests/auto/gui/rhi | |
parent | 5ce367a55224c862c11aaf5945ddf7bd3c934600 (diff) |
rhi: Add support for custom bytes-per-line for uncompressed raw data
Fixes: QTBUG-90770
Change-Id: Icba328c417bcce256e7b44f1d540af7f8e83376b
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Christian Strømme <christian.stromme@qt.io>
Diffstat (limited to 'tests/auto/gui/rhi')
-rw-r--r-- | tests/auto/gui/rhi/qrhi/tst_qrhi.cpp | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp b/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp index c4d1dca1bb..6d0ec2a488 100644 --- a/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp +++ b/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp @@ -89,6 +89,8 @@ private slots: void resourceUpdateBatchRGBATextureCopy(); void resourceUpdateBatchRGBATextureMip_data(); void resourceUpdateBatchRGBATextureMip(); + void resourceUpdateBatchTextureRawDataStride_data(); + void resourceUpdateBatchTextureRawDataStride(); void invalidPipeline_data(); void invalidPipeline(); void srbLayoutCompatibility_data(); @@ -348,7 +350,8 @@ void tst_QRhi::create() QRhi::IntAttributes, QRhi::ScreenSpaceDerivatives, QRhi::ReadBackAnyTextureFormat, - QRhi::PipelineCacheDataLoadSave + QRhi::PipelineCacheDataLoadSave, + QRhi::ImageDataStride }; for (size_t i = 0; i <sizeof(features) / sizeof(QRhi::Feature); ++i) rhi->isFeatureSupported(features[i]); @@ -1293,6 +1296,64 @@ void tst_QRhi::resourceUpdateBatchRGBATextureMip() } } +void tst_QRhi::resourceUpdateBatchTextureRawDataStride_data() +{ + rhiTestData(); +} + +void tst_QRhi::resourceUpdateBatchTextureRawDataStride() +{ + 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 texture resource updates"); + + const int WIDTH = 150; + const int DATA_WIDTH = 180; + const int HEIGHT = 50; + QByteArray image; + image.resize(DATA_WIDTH * HEIGHT * 4); + for (int y = 0; y < HEIGHT; ++y) { + char *p = image.data() + y * DATA_WIDTH * 4; + memset(p, y, DATA_WIDTH * 4); + } + + { + QScopedPointer<QRhiTexture> texture(rhi->newTexture(QRhiTexture::RGBA8, QSize(WIDTH, HEIGHT), + 1, QRhiTexture::UsedAsTransferSource)); + QVERIFY(texture->create()); + + QRhiResourceUpdateBatch *batch = rhi->nextResourceUpdateBatch(); + + QRhiTextureSubresourceUploadDescription subresDesc(image.constData(), image.size()); + subresDesc.setDataStride(DATA_WIDTH * 4); + QRhiTextureUploadEntry upload(0, 0, subresDesc); + QRhiTextureUploadDescription uploadDesc(upload); + batch->uploadTexture(texture.data(), uploadDesc); + + QRhiReadbackResult readResult; + bool readCompleted = false; + readResult.completed = [&readCompleted] { readCompleted = true; }; + batch->readBackTexture(texture.data(), &readResult); + + QVERIFY(submitResourceUpdates(rhi.data(), batch)); + QVERIFY(readCompleted); + QCOMPARE(readResult.format, QRhiTexture::RGBA8); + QCOMPARE(readResult.pixelSize, QSize(WIDTH, HEIGHT)); + + QImage wrapperImage(reinterpret_cast<const uchar *>(readResult.data.constData()), + readResult.pixelSize.width(), readResult.pixelSize.height(), + QImage::Format_RGBA8888_Premultiplied); + // wrap the original data, note the bytesPerLine argument + QImage originalWrapperImage(reinterpret_cast<const uchar *>(image.constData()), + WIDTH, HEIGHT, DATA_WIDTH * 4, + QImage::Format_RGBA8888_Premultiplied); + QVERIFY(imageRGBAEquals(wrapperImage, originalWrapperImage)); + } +} + static QShader loadShader(const char *name) { QFile f(QString::fromUtf8(name)); |