147 glClearNamedBufferData(ssbo_id_, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT, &clear_value);
151 glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo_id_);
153 GL_SHADER_STORAGE_BUFFER, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT, &clear_value);
154 glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
163 if (dst->ssbo_id_ == 0) {
166 if (src->vbo_id_ == 0) {
171 glCopyNamedBufferSubData(src->vbo_id_, dst->ssbo_id_, src_offset, dst_offset, copy_size);
176 glBindBuffer(GL_COPY_WRITE_BUFFER, dst->ssbo_id_);
177 glCopyBufferSubData(GL_ARRAY_BUFFER, GL_COPY_WRITE_BUFFER, src_offset, dst_offset, copy_size);
178 glBindBuffer(GL_COPY_WRITE_BUFFER, 0);
188 if (read_ssbo_id_ == 0) {
189 glGenBuffers(1, &read_ssbo_id_);
190 glBindBuffer(GL_SHADER_STORAGE_BUFFER, read_ssbo_id_);
191 glBufferStorage(GL_SHADER_STORAGE_BUFFER,
194 GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT);
195 persistent_ptr_ = glMapBufferRange(
196 GL_SHADER_STORAGE_BUFFER, 0,
size_in_bytes_, GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT);
199 glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
203 glCopyNamedBufferSubData(ssbo_id_, read_ssbo_id_, 0, 0,
size_in_bytes_);
206 glBindBuffer(GL_COPY_READ_BUFFER, ssbo_id_);
207 glBindBuffer(GL_COPY_WRITE_BUFFER, read_ssbo_id_);
208 glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0,
size_in_bytes_);
209 glBindBuffer(GL_COPY_READ_BUFFER, 0);
210 glBindBuffer(GL_COPY_WRITE_BUFFER, 0);
213 glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT);
216 glDeleteSync(read_fence_);
218 read_fence_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
223 if (data ==
nullptr) {
227 if (!persistent_ptr_ || !read_fence_) {
231 while (glClientWaitSync(read_fence_, GL_SYNC_FLUSH_COMMANDS_BIT, 1000) == GL_TIMEOUT_EXPIRED) {
234 glDeleteSync(read_fence_);
235 read_fence_ =
nullptr;
static void buf_free(GLuint buf_id)
uint16_t bound_ssbo_slots
static GLint max_ssbo_binds
static bool direct_state_access_support