96 auto begin =
m_d->buffers.begin();
98 using value_type =
typename decltype(
m_d->buffers)::difference_type;
99 const value_type maxIndex = std::numeric_limits<value_type>::max();
101 if (
m_d->nextBuffer <= std::numeric_limits<value_type>::max()) {
102 return std::next(begin, value_type(
m_d->nextBuffer));
104 auto midpoint = std::next(begin, std::numeric_limits<value_type>::max());
105 return std::next(midpoint, value_type(
m_d->nextBuffer - maxIndex));
108 auto end =
m_d->buffers.end();
110 std::rotate(begin, middle, end);
112 m_d->nextBuffer =
m_d->buffers.size();
114 const size_t buffersToAdd = numBuffers -
m_d->buffers.size();
123 const size_t newSize = qMax(
m_d->buffers.size() + buffersToAdd,
nextPowerOfTwo(
m_d->buffers.size()));
125 if (
m_d->buffers.capacity() < newSize)
126 m_d->buffers.reserve(newSize);
129 KIS_ASSERT(
m_d->buffers.size() <= std::numeric_limits<int>::max());
131 for (
size_t i = 0; i < buffersToAdd; i++) {
132 m_d->buffers.emplace_back(
m_d->type);
134 QOpenGLBuffer &buf =
m_d->buffers.back();
137 buf.setUsagePattern(QOpenGLBuffer::DynamicDraw);
139 buf.allocate(
m_d->bufferSize);