32 glGenVertexArrays(1, &vao_id_);
33 glBindVertexArray(vao_id_);
36 glGenBuffers(1, &buffer.vbo_id);
37 glBindBuffer(GL_ARRAY_BUFFER, buffer.vbo_id);
38 glBufferData(GL_ARRAY_BUFFER, buffer.buffer_size,
nullptr, GL_DYNAMIC_DRAW);
41 glGenBuffers(1, &buffer_strict.vbo_id);
42 glBindBuffer(GL_ARRAY_BUFFER, buffer_strict.vbo_id);
43 glBufferData(GL_ARRAY_BUFFER, buffer_strict.buffer_size,
nullptr, GL_DYNAMIC_DRAW);
45 glBindBuffer(GL_ARRAY_BUFFER, 0);
72 const size_t available_bytes = buffer_size() - buffer_offset();
85 glBindBuffer(GL_ARRAY_BUFFER, vbo_id());
87 bool recreate_buffer =
false;
88 if (bytes_needed > buffer_size()) {
90 buffer_size() = bytes_needed;
91 recreate_buffer =
true;
98 recreate_buffer =
true;
108 const uint pre_padding =
padding(buffer_offset(), vert_alignment);
110 if (!recreate_buffer && ((bytes_needed + pre_padding) <= available_bytes)) {
111 buffer_offset() += pre_padding;
115 glBufferData(GL_ARRAY_BUFFER, buffer_size(),
nullptr, GL_DYNAMIC_DRAW);
122 glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufsize);
123 BLI_assert(buffer_offset() + bytes_needed <= bufsize);
127 GLbitfield access = GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT;
129 access |= GL_MAP_FLUSH_EXPLICIT_BIT;
131 void *
data = glMapBufferRange(GL_ARRAY_BUFFER, buffer_offset(), bytes_needed, access);
134 bytes_mapped_ = bytes_needed;
142 uint buffer_bytes_used = bytes_mapped_;
150 glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, buffer_bytes_used);
152 glUnmapBuffer(GL_ARRAY_BUFFER);
158 GLintptr offset = buffer_offset();
159 GLenum target = GL_SHADER_STORAGE_BUFFER;
193 buffer_offset() += buffer_bytes_used;
StateManager * state_manager
uint16_t bound_ssbo_slots