148 glClearNamedBufferData(ssbo_id_, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT, &clear_value);
152 glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo_id_);
154 GL_SHADER_STORAGE_BUFFER, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT, &clear_value);
155 glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
164 if (dst->ssbo_id_ == 0) {
167 if (src->vbo_id_ == 0) {
172 glCopyNamedBufferSubData(src->vbo_id_, dst->ssbo_id_, src_offset, dst_offset, copy_size);
177 glBindBuffer(GL_COPY_WRITE_BUFFER, dst->ssbo_id_);
178 glCopyBufferSubData(GL_ARRAY_BUFFER, GL_COPY_WRITE_BUFFER, src_offset, dst_offset, copy_size);
179 glBindBuffer(GL_COPY_WRITE_BUFFER, 0);
189 if (read_ssbo_id_ == 0) {
190 glGenBuffers(1, &read_ssbo_id_);
191 glBindBuffer(GL_SHADER_STORAGE_BUFFER, read_ssbo_id_);
192 glBufferStorage(GL_SHADER_STORAGE_BUFFER,
193 alloc_size_in_bytes_,
195 GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT);
196 persistent_ptr_ = glMapBufferRange(GL_SHADER_STORAGE_BUFFER,
198 alloc_size_in_bytes_,
199 GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT);
202 glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
206 glCopyNamedBufferSubData(ssbo_id_, read_ssbo_id_, 0, 0, alloc_size_in_bytes_);
209 glBindBuffer(GL_COPY_READ_BUFFER, ssbo_id_);
210 glBindBuffer(GL_COPY_WRITE_BUFFER, read_ssbo_id_);
211 glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, alloc_size_in_bytes_);
212 glBindBuffer(GL_COPY_READ_BUFFER, 0);
213 glBindBuffer(GL_COPY_WRITE_BUFFER, 0);
216 glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT);
219 glDeleteSync(read_fence_);
221 read_fence_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
226 if (
data ==
nullptr) {
236 glBindBuffer(GL_COPY_READ_BUFFER, ssbo_id_);
238 glBindBuffer(GL_COPY_READ_BUFFER, 0);
243 while (glClientWaitSync(read_fence_, GL_SYNC_FLUSH_COMMANDS_BIT, 1000) == GL_TIMEOUT_EXPIRED) {
246 glDeleteSync(read_fence_);
247 read_fence_ =
nullptr;
uint16_t bound_ssbo_slots
static void buffer_free(GLuint buf_id)
static GLint max_ssbo_binds
static bool direct_state_access_support