aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabian Kosmale <[email protected]>2025-10-09 11:46:01 +0200
committerFabian Kosmale <[email protected]>2025-10-10 19:31:34 +0200
commiteee4e767ab77e6643b0b5992a6879b2f8230f700 (patch)
tree95ec478d2a745cbeaf70792c66d2cddc4a933c19
parent7f4ba3aece3783bdacc5239a2f3d7c600db62c3e (diff)
CanvasImageData: Track image data size for gc purposes
Images can consume a substantial amount of memory on the native heap, while the actual CanvasImageData object is rather small. Our gc already keeps track of native heap consumption (e.g. for strings), so reuse that support to also properly account for CanvasImageData. Pick-to: 6.10 6.8 Fixes: QTBUG-32298 Change-Id: Ie36e9c2399517154d9c46e490a49b16409cbecc1 Reviewed-by: Ulf Hermann <[email protected]>
-rw-r--r--src/quick/items/context2d/qquickcontext2d.cpp7
-rw-r--r--tests/auto/quick/qquickcanvasitem/data/tst_grabManyImages.qml18
2 files changed, 24 insertions, 1 deletions
diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp
index 7102ab27f4..ed283213b5 100644
--- a/src/quick/items/context2d/qquickcontext2d.cpp
+++ b/src/quick/items/context2d/qquickcontext2d.cpp
@@ -497,7 +497,11 @@ struct QQuickContext2DStyle : Object {
struct QQuickJSContext2DPixelData : Object {
void init();
void destroy() {
- delete image;
+ if (image) {
+ auto *mm = internalClass->engine->memoryManager;
+ mm->changeUnmanagedHeapSizeUsage(-image->sizeInBytes());
+ delete image;
+ }
Object::destroy();
}
@@ -940,6 +944,7 @@ static QV4::ReturnedValue qt_create_image_data(qreal w, qreal h, QV4::ExecutionE
QV4::Scope scope(v4);
QQuickContext2DEngineData *ed = engineData(scope.engine);
QV4::Scoped<QQuickJSContext2DPixelData> pixelData(scope, scope.engine->memoryManager->allocate<QQuickJSContext2DPixelData>());
+ v4->memoryManager->changeUnmanagedHeapSizeUsage(image.sizeInBytes());
QV4::ScopedObject p(scope, ed->pixelArrayProto.value());
pixelData->setPrototypeOf(p);
diff --git a/tests/auto/quick/qquickcanvasitem/data/tst_grabManyImages.qml b/tests/auto/quick/qquickcanvasitem/data/tst_grabManyImages.qml
new file mode 100644
index 0000000000..fd18099866
--- /dev/null
+++ b/tests/auto/quick/qquickcanvasitem/data/tst_grabManyImages.qml
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+Item {
+ width: 800
+ height: 800
+
+ Canvas {
+ id: canvas
+ renderStrategy: Canvas.Immediate
+ anchors.fill: parent
+ onPaint: {}
+ onAvailableChanged: {
+ // must not run out of memory
+ for (let i = 0; i < 2000; ++i)
+ canvas.getContext("2d").getImageData(0, 0, canvas.width, canvas.height);
+ }
+ }
+}