aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickrendertarget.cpp1
-rw-r--r--src/quick/items/qquickwindow.cpp15
-rw-r--r--tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp33
3 files changed, 41 insertions, 8 deletions
diff --git a/src/quick/items/qquickrendertarget.cpp b/src/quick/items/qquickrendertarget.cpp
index 69063ecdbe..3ccfe85b88 100644
--- a/src/quick/items/qquickrendertarget.cpp
+++ b/src/quick/items/qquickrendertarget.cpp
@@ -404,6 +404,7 @@ bool QQuickRenderTargetPrivate::resolve(QRhi *rhi, QQuickWindowRenderTarget *dst
case Type::RhiRenderTarget:
dst->renderTarget = u.rhiRt;
+ dst->rpDesc = u.rhiRt->renderPassDescriptor(); // just for QQuickWindowRenderTarget::reset()
dst->owns = false;
return true;
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp
index 9e01737c8b..698ac341a4 100644
--- a/src/quick/items/qquickwindow.cpp
+++ b/src/quick/items/qquickwindow.cpp
@@ -515,14 +515,15 @@ void forceUpdate(QQuickItem *item)
void QQuickWindowRenderTarget::reset(QRhi *rhi, QSGRenderer *renderer)
{
- if (rhi && owns) {
- if (renderer != nullptr && rpDesc != nullptr)
+ if (rhi) {
+ if (renderer)
renderer->invalidatePipelineCacheDependency(rpDesc);
-
- delete renderTarget;
- delete rpDesc;
- delete texture;
- delete depthStencil;
+ if (owns) {
+ delete renderTarget;
+ delete rpDesc;
+ delete texture;
+ delete depthStencil;
+ }
}
renderTarget = nullptr;
diff --git a/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp b/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp
index d81c40f5b6..4bf48f5a58 100644
--- a/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp
+++ b/tests/auto/quick/qquickrendercontrol/tst_qquickrendercontrol.cpp
@@ -232,7 +232,38 @@ void tst_RenderControl::renderAndReadBackWithRhi()
// redirect Qt Quick rendering into our texture
quickWindow->setRenderTarget(QQuickRenderTarget::fromRhiRenderTarget(texRt.data()));
+ QSize currentSize = size;
+
for (int frame = 0; frame < 100; ++frame) {
+ // QTBUG-88761 - change the render target size at some point and verify the renderer continues to function
+ if (frame == 80) {
+ currentSize -= QSize(2, 2); // small enough change to not bother the pixel verification checks
+ tex->setPixelSize(currentSize);
+ QVERIFY(tex->create()); // internally we now have a whole new native texture object
+ ds->setPixelSize(currentSize);
+ QVERIFY(ds->create());
+ QVERIFY(texRt->create());
+ // setRenderTarget is mandatory upon changing something, even if the texRt pointer itself is the same
+ quickWindow->setRenderTarget(QQuickRenderTarget::fromRhiRenderTarget(texRt.data()));
+ } else if (frame == 90) {
+ // Go berserk, destroy and recreate the texture and related stuff
+ // (the QRhi objects themselves, not just the native stuff
+ // internally), it should still work.
+ currentSize -= QSize(2, 2); // chip off another 2 pixels
+ tex.reset(rhi->newTexture(QRhiTexture::RGBA8, currentSize, 1,
+ QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource));
+ QVERIFY(tex->create());
+ ds.reset(rhi->newRenderBuffer(QRhiRenderBuffer::DepthStencil, currentSize, 1));
+ QVERIFY(ds->create());
+ rtDesc = QRhiTextureRenderTargetDescription(QRhiColorAttachment(tex.data()));
+ rtDesc.setDepthStencilBuffer(ds.data());
+ texRt.reset(rhi->newTextureRenderTarget(rtDesc));
+ rp.reset(texRt->newCompatibleRenderPassDescriptor());
+ texRt->setRenderPassDescriptor(rp.data());
+ QVERIFY(texRt->create());
+ quickWindow->setRenderTarget(QQuickRenderTarget::fromRhiRenderTarget(texRt.data()));
+ }
+
// have to process events, e.g. to get queued metacalls delivered
QCoreApplication::processEvents();
@@ -276,7 +307,7 @@ void tst_RenderControl::renderAndReadBackWithRhi()
QImage img = result;
QVERIFY(!img.isNull());
- QCOMPARE(img.size(), rootItem->size());
+ QCOMPARE(img.size(), currentSize);
const int maxFuzz = 2;