I am encountering some strange behaviour when working with atomic buffers.
If i’m only Writing to them while creating them with GL_DYNAMIC_DRAW and mapping them with GL_MAP_WRITE they work perfectly.
If i’m trying to also read what is in them, by creating them with GL_DYNAMIC_COPY and mapping with GL_MAP_READ | GL_MAP_WRITE i’m getting a varying mapping time. The time increases in a linear manner with the number of fragments that access the atomic counter gpu side.
App working fine, no gl errors.
I really don’t understand this difference in behaviour.
Buffer creation (once):
glGenBuffers(1, &atomicbuffer);
glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER,0, atomicbuffer);
glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint), 0, GL_DYNAMIC_COPY);
Buffer usage (per frame):
glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, atomicbuffer);
GLuint* ptr = (GLuint*)glMapBufferRange(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(GLuint),GL_MAP_WRITE_BIT | GL_MAP_READ_BIT); <------------------ not ok speed
//GLuint* ptr = (GLuint*)glMapBufferRange(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(GLuint),GL_MAP_WRITE_BIT); <------------------- OK speed, comment'd
memory_fragmentcount = ptr[0];
memory_necessary = memory_fragmentcount*FRAGMENTSIZE;
ptr[0] = 0;
glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);
glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, unit_atomic, atomicbuffer);
Btw, there is no difference whatsoever in using glMapBuffer on the entire buffer or glMapBufferRange.
Really, if it would be a sync problem (more fragments/hardware units/etc) modifying the same resource (the atomic buffer) shouldn’t the writing be more problematic/slow or at the very least equally bad?