Krita Source Code Documentation
Loading...
Searching...
No Matches
KisOpenGLBufferCircularStorage Class Reference

#include <KisOpenGLBufferCircularStorage.h>

+ Inheritance diagram for KisOpenGLBufferCircularStorage:

Classes

struct  BufferBinder
 

Public Member Functions

void allocate (int numBuffers, int bufferSize)
 
void allocateMoreBuffers ()
 
QOpenGLBuffer * getNextBuffer ()
 
bool isValid () const
 
 KisOpenGLBufferCircularStorage ()
 
 KisOpenGLBufferCircularStorage (const KisOpenGLBufferCircularStorage &)=delete
 
 KisOpenGLBufferCircularStorage (KisOpenGLBufferCircularStorage &&)=delete
 
 KisOpenGLBufferCircularStorage (QOpenGLBuffer::Type type)
 
KisOpenGLBufferCircularStorageoperator= (const KisOpenGLBufferCircularStorage &)=delete
 
KisOpenGLBufferCircularStorageoperator= (KisOpenGLBufferCircularStorage &&)=delete
 
void reset ()
 
int size () const
 
 ~KisOpenGLBufferCircularStorage ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Public Attributes

std::vector< QOpenGLBuffer > buffers
 
int bufferSize = 0
 
decltype(buffers) ::size_type nextBuffer = 0
 
QOpenGLBuffer::Type type = QOpenGLBuffer::QOpenGLBuffer::VertexBuffer
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Private Member Functions

void addBuffersImpl (size_t buffersToAdd, int bufferSize)
 

Private Attributes

const QScopedPointer< Privatem_d
 

Detailed Description

A simple storage class that owns a fixed amount of QOpenGLBuffer objects and returns them sequentially. Using multiple distinct buffers lets us avoid blocks

Definition at line 34 of file KisOpenGLBufferCircularStorage.cpp.

Constructor & Destructor Documentation

◆ KisOpenGLBufferCircularStorage() [1/4]

KisOpenGLBufferCircularStorage::KisOpenGLBufferCircularStorage ( )

Definition at line 43 of file KisOpenGLBufferCircularStorage.cpp.

44 : KisOpenGLBufferCircularStorage(QOpenGLBuffer::VertexBuffer)
45{
46}

◆ KisOpenGLBufferCircularStorage() [2/4]

KisOpenGLBufferCircularStorage::KisOpenGLBufferCircularStorage ( QOpenGLBuffer::Type type)

Definition at line 48 of file KisOpenGLBufferCircularStorage.cpp.

49 : m_d(new Private)
50{
51 m_d->type = type;
52}

References m_d, and type.

◆ ~KisOpenGLBufferCircularStorage()

KisOpenGLBufferCircularStorage::~KisOpenGLBufferCircularStorage ( )
default

◆ KisOpenGLBufferCircularStorage() [3/4]

KisOpenGLBufferCircularStorage::KisOpenGLBufferCircularStorage ( const KisOpenGLBufferCircularStorage & )
delete

◆ KisOpenGLBufferCircularStorage() [4/4]

KisOpenGLBufferCircularStorage::KisOpenGLBufferCircularStorage ( KisOpenGLBufferCircularStorage && )
delete

Member Function Documentation

◆ addBuffersImpl()

void KisOpenGLBufferCircularStorage::addBuffersImpl ( size_t buffersToAdd,
int bufferSize )
private

Definition at line 119 of file KisOpenGLBufferCircularStorage.cpp.

120{
121 m_d->bufferSize = bufferSize;
122
123 const size_t newSize = qMax(m_d->buffers.size() + buffersToAdd, nextPowerOfTwo(m_d->buffers.size()));
124
125 if (m_d->buffers.capacity() < newSize)
126 m_d->buffers.reserve(newSize);
127
128 // overflow check for size()
129 KIS_ASSERT(m_d->buffers.size() <= std::numeric_limits<int>::max());
130
131 for (size_t i = 0; i < buffersToAdd; i++) {
132 m_d->buffers.emplace_back(m_d->type);
133
134 QOpenGLBuffer &buf = m_d->buffers.back();
135
136 buf.create();
137 buf.setUsagePattern(QOpenGLBuffer::DynamicDraw);
138 buf.bind();
139 buf.allocate(m_d->bufferSize);
140 buf.release();
141 }
142}
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
T nextPowerOfTwo(T v)
Definition kis_global.h:328

References bufferSize, KIS_ASSERT, m_d, and nextPowerOfTwo().

◆ allocate()

void KisOpenGLBufferCircularStorage::allocate ( int numBuffers,
int bufferSize )

Definition at line 56 of file KisOpenGLBufferCircularStorage.cpp.

57{
58 reset();
59 KIS_ASSERT(numBuffers > 0);
61 addBuffersImpl(static_cast<size_t>(numBuffers), bufferSize);
62}
void addBuffersImpl(size_t buffersToAdd, int bufferSize)

References addBuffersImpl(), bufferSize, KIS_ASSERT, and reset().

◆ allocateMoreBuffers()

void KisOpenGLBufferCircularStorage::allocateMoreBuffers ( )

Definition at line 90 of file KisOpenGLBufferCircularStorage.cpp.

91{
92 const size_t numBuffers = nextPowerOfTwo(m_d->buffers.size());
93
94 KIS_SAFE_ASSERT_RECOVER_RETURN(!m_d->buffers.empty());
95
96 auto begin = m_d->buffers.begin();
97 auto middle = [&]() {
98 using value_type = typename decltype(m_d->buffers)::difference_type;
99 const value_type maxIndex = std::numeric_limits<value_type>::max();
100
101 if (m_d->nextBuffer <= std::numeric_limits<value_type>::max()) {
102 return std::next(begin, value_type(m_d->nextBuffer));
103 } else {
104 auto midpoint = std::next(begin, std::numeric_limits<value_type>::max());
105 return std::next(midpoint, value_type(m_d->nextBuffer - maxIndex));
106 }
107 }();
108 auto end = m_d->buffers.end();
109
110 std::rotate(begin, middle, end);
111
112 m_d->nextBuffer = m_d->buffers.size();
113
114 const size_t buffersToAdd = numBuffers - m_d->buffers.size();
115
116 addBuffersImpl(buffersToAdd, m_d->bufferSize);
117}
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References addBuffersImpl(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, and nextPowerOfTwo().

◆ getNextBuffer()

QOpenGLBuffer * KisOpenGLBufferCircularStorage::getNextBuffer ( )

Definition at line 64 of file KisOpenGLBufferCircularStorage.cpp.

65{
67
68 QOpenGLBuffer *buffer = &m_d->buffers[m_d->nextBuffer];
69 m_d->nextBuffer = (m_d->nextBuffer + 1) % m_d->buffers.size();
70 return buffer;
71}
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129

References isValid(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, and m_d.

◆ isValid()

bool KisOpenGLBufferCircularStorage::isValid ( ) const

Definition at line 73 of file KisOpenGLBufferCircularStorage.cpp.

74{
75 return !m_d->buffers.empty();
76}

References m_d.

◆ operator=() [1/2]

KisOpenGLBufferCircularStorage & KisOpenGLBufferCircularStorage::operator= ( const KisOpenGLBufferCircularStorage & )
delete

◆ operator=() [2/2]

KisOpenGLBufferCircularStorage & KisOpenGLBufferCircularStorage::operator= ( KisOpenGLBufferCircularStorage && )
delete

◆ reset()

void KisOpenGLBufferCircularStorage::reset ( )

Definition at line 83 of file KisOpenGLBufferCircularStorage.cpp.

84{
85 m_d->buffers.clear();
86 m_d->nextBuffer = 0;
87 m_d->bufferSize = 0;
88}

References m_d.

◆ size()

int KisOpenGLBufferCircularStorage::size ( ) const

Definition at line 78 of file KisOpenGLBufferCircularStorage.cpp.

79{
80 return static_cast<int>(m_d->buffers.size());
81}

References m_d.

Member Data Documentation

◆ buffers

std::vector<QOpenGLBuffer> KisOpenGLBufferCircularStorage::buffers

Definition at line 36 of file KisOpenGLBufferCircularStorage.cpp.

◆ bufferSize

int KisOpenGLBufferCircularStorage::bufferSize = 0

Definition at line 38 of file KisOpenGLBufferCircularStorage.cpp.

◆ m_d

const QScopedPointer<Private> KisOpenGLBufferCircularStorage::m_d
private

Definition at line 68 of file KisOpenGLBufferCircularStorage.h.

◆ nextBuffer

decltype(buffers) ::size_type KisOpenGLBufferCircularStorage::nextBuffer = 0

Definition at line 37 of file KisOpenGLBufferCircularStorage.cpp.

◆ type

QOpenGLBuffer::Type KisOpenGLBufferCircularStorage::type = QOpenGLBuffer::QOpenGLBuffer::VertexBuffer

Definition at line 39 of file KisOpenGLBufferCircularStorage.cpp.


The documentation for this class was generated from the following files: