Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_swapped_data_store.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2010 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include <QMutexLocker>
8//#include "kis_debug.h"
10#include "kis_memory_window.h"
11#include "kis_image_config.h"
12
14
15//#define COMPRESSOR_VERSION 2
16
18 : m_totalSwapMemoryUsed(0)
19{
20 KisImageConfig config(true);
21 const quint64 maxSwapSize = config.maxSwapSize() * MiB;
22 const quint64 swapSlabSize = config.swapSlabSize() * MiB;
23 const quint64 swapWindowSize = config.swapWindowSize() * MiB;
24
25 m_allocator = new KisChunkAllocator(swapSlabSize, maxSwapSize);
26 m_swapSpace = new KisMemoryWindow(config.swapDir(), swapWindowSize);
27
28 // FIXME: use a factory after the patch is committed
30}
31
38
40{
41 // We are not acquiring the lock here...
42 // Hope QLinkedList will ensure atomic access to it's size...
43
44 return m_allocator->numChunks();
45}
46
48{
49 Q_ASSERT(td->data());
50 QMutexLocker locker(&m_lock);
51
58 const qint32 expectedBufferSize = m_compressor->tileDataBufferSize(td);
59 if(m_buffer.size() < expectedBufferSize)
60 m_buffer.resize(expectedBufferSize);
61
62 qint32 bytesWritten;
63 m_compressor->compressTileData(td, (quint8*) m_buffer.data(), m_buffer.size(), bytesWritten);
64
65 KisChunk chunk = m_allocator->getChunk(bytesWritten);
66 quint8 *ptr = m_swapSpace->getWriteChunkPtr(chunk);
67 if (!ptr) {
68 qWarning() << "swap out of tile failed";
69 return false;
70 }
71 memcpy(ptr, m_buffer.data(), bytesWritten);
72
73 td->releaseMemory();
74 td->setSwapChunk(chunk);
75
76 m_totalSwapMemoryUsed += chunk.size();
77
78 return true;
79}
80
82{
83 Q_ASSERT(!td->data());
84 QMutexLocker locker(&m_lock);
85
86 // see comment in swapOutTileData()
87
88 KisChunk chunk = td->swapChunk();
89 m_totalSwapMemoryUsed -= chunk.size();
90
91 td->allocateMemory();
93
94 quint8 *ptr = m_swapSpace->getReadChunkPtr(chunk);
95 Q_ASSERT(ptr);
96 m_compressor->decompressTileData(ptr, chunk.size(), td);
97 m_allocator->freeChunk(chunk);
98}
99
101{
102 QMutexLocker locker(&m_lock);
103
105
107 td->setSwapChunk(KisChunk());
108}
109
114
virtual void compressTileData(KisTileData *tileData, quint8 *buffer, qint32 bufferSize, qint32 &bytesWritten)=0
virtual bool decompressTileData(quint8 *buffer, qint32 bufferSize, KisTileData *tileData)=0
virtual qint32 tileDataBufferSize(KisTileData *tileData)=0
KisChunk getChunk(quint64 size)
qreal debugFragmentation(bool toStderr=true)
quint64 numChunks() const
void freeChunk(KisChunk chunk)
bool sanityCheck(bool pleaseCrash=true)
quint64 size() const
QString swapDir(bool requestDefault=false)
int maxSwapSize(bool requestDefault=false) const
int swapWindowSize() const
int swapSlabSize() const
quint8 * getWriteChunkPtr(KisChunk writeChunk)
quint8 * getReadChunkPtr(KisChunk readChunk)
bool trySwapOutTileData(KisTileData *td)
KisMemoryWindow * m_swapSpace
KisAbstractTileCompressor * m_compressor
void forgetTileData(KisTileData *td)
KisChunkAllocator * m_allocator
void swapInTileData(KisTileData *td)
KisChunk swapChunk() const
quint8 * data() const
void setSwapChunk(KisChunk chunk)
void allocateMemory()
void releaseMemory()
#define MiB