Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_memory_statistics_server.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QGlobalStatic>
10#include <QApplication>
11
12#include "kis_image.h"
13#include "kis_image_config.h"
15
17
19
21{
23 : updateCompressor(1000 /* ms */, KisSignalCompressor::POSTPONE, q)
24 {
25 }
26
28};
29
30
32 : m_d(new Private(this))
33{
39 moveToThread(qApp->thread());
40 connect(&m_d->updateCompressor, SIGNAL(timeout()), SIGNAL(sigUpdateMemoryStatistics()));
41}
42
46
51
53 bool isProjection,
54 QSet<KisPaintDevice*> &devices,
55 qint64 &memBound,
56 qint64 &layersSize,
57 qint64 &projectionsSize,
58 qint64 &lodSize)
59{
60 if (dev && !devices.contains(dev.data())) {
61 devices.insert(dev.data());
62
63 qint64 imageData = 0;
64 qint64 temporaryData = 0;
65 qint64 lodData = 0;
66
67 dev->estimateMemoryStats(imageData, temporaryData, lodData);
68 memBound += imageData + temporaryData + lodData;
69
70 KIS_SAFE_ASSERT_RECOVER_NOOP(!temporaryData || isProjection);
71
72 if (!isProjection) {
73 layersSize += imageData + temporaryData;
74 } else {
75 projectionsSize += imageData + temporaryData;
76 }
77
78 lodSize += lodData;
79 }
80}
81
83 QSet<KisPaintDevice*> &devices,
84 qint64 &layersSize,
85 qint64 &projectionsSize,
86 qint64 &lodSize)
87{
88 qint64 memBound = 0;
89
90 const bool originalIsProjection =
91 node->inherits("KisGroupLayer") ||
92 node->inherits("KisAdjustmentLayer");
93
94
95 addDevice(node->paintDevice(), false, devices, memBound, layersSize, projectionsSize, lodSize);
96 addDevice(node->original(), originalIsProjection, devices, memBound, layersSize, projectionsSize, lodSize);
97 addDevice(node->projection(), true, devices, memBound, layersSize, projectionsSize, lodSize);
98
99 node = node->firstChild();
100 while (node) {
101 memBound += calculateNodeMemoryHiBoundStep(node, devices,
102 layersSize, projectionsSize, lodSize);
103 node = node->nextSibling();
104 }
105
106 return memBound;
107}
108
110 qint64 &layersSize,
111 qint64 &projectionsSize,
112 qint64 &lodSize)
113{
114 layersSize = 0;
115 projectionsSize = 0;
116 lodSize = 0;
117
118 QSet<KisPaintDevice*> devices;
120 devices,
121 layersSize,
122 projectionsSize,
123 lodSize);
124}
125
126
129{
132
133 Statistics stats;
134 if (image) {
135 stats.imageSize =
137 stats.layersSize,
138 stats.projectionsSize,
139 stats.lodSize);
140 }
141 stats.totalMemorySize = tileStats.totalMemorySize;
142 stats.realMemorySize = tileStats.realMemorySize;
144 stats.poolSize = tileStats.poolSize;
145
146 stats.swapSize = tileStats.swapSize;
147
148 KisImageConfig cfg(true);
149
150 stats.tilesHardLimit = cfg.tilesHardLimit() * MiB;
151 stats.tilesSoftLimit = cfg.tilesSoftLimit() * MiB;
152 stats.tilesPoolLimit = cfg.poolLimit() * MiB;
153 stats.totalMemoryLimit = stats.tilesHardLimit + stats.tilesPoolLimit;
154
155 return stats;
156}
157
163
165{
166 m_d->updateCompressor.start();
167}
168
169
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
int tilesHardLimit() const
int tilesSoftLimit() const
void estimateMemoryStats(qint64 &imageData, qint64 &temporaryData, qint64 &lodData) const
void tryForceUpdateMemoryStatisticsWhileIdle()
MemoryStatistics memoryStatistics()
static KisTileDataStore * instance()
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
#define MiB
qint64 calculateNodeMemoryHiBoundStep(KisNodeSP node, QSet< KisPaintDevice * > &devices, qint64 &layersSize, qint64 &projectionsSize, qint64 &lodSize)
qint64 calculateNodeMemoryHiBound(KisNodeSP node, qint64 &layersSize, qint64 &projectionsSize, qint64 &lodSize)
void addDevice(KisPaintDeviceSP dev, bool isProjection, QSet< KisPaintDevice * > &devices, qint64 &memBound, qint64 &layersSize, qint64 &projectionsSize, qint64 &lodSize)
virtual KisPaintDeviceSP projection() const =0
virtual KisPaintDeviceSP original() const =0
virtual KisPaintDeviceSP paintDevice() const =0
const QScopedPointer< Private > m_d
Statistics fetchMemoryStatistics(KisImageSP image) const
static KisMemoryStatisticsServer * instance()
Private(KisMemoryStatisticsServer *q)
KisNodeSP firstChild() const
Definition kis_node.cpp:361
KisNodeSP nextSibling() const
Definition kis_node.cpp:408