@@ -31,6 +31,9 @@ namespace zephyr {
31
31
glCreateBuffers (1u , &m_gl_draw_count_ubo);
32
32
glNamedBufferStorage (m_gl_draw_count_ubo, sizeof (u32), nullptr , GL_DYNAMIC_STORAGE_BIT);
33
33
34
+ glCreateBuffers (1u , &m_gl_draw_count_out_ac);
35
+ glNamedBufferStorage (m_gl_draw_count_out_ac, sizeof (GLuint), nullptr , 0 );
36
+
34
37
glEnable (GL_DEPTH_TEST);
35
38
36
39
m_render_geometry_manager = std::make_unique<OpenGLRenderGeometryManager>();
@@ -113,6 +116,7 @@ namespace zephyr {
113
116
glBindBufferBase (GL_SHADER_STORAGE_BUFFER, 1u , m_gl_render_bundle_ssbo);
114
117
glBindBufferBase (GL_SHADER_STORAGE_BUFFER, 2u , m_gl_draw_list_ssbo);
115
118
glBindBufferBase (GL_UNIFORM_BUFFER, 0u , m_gl_draw_count_ubo);
119
+ glBindBufferBase (GL_ATOMIC_COUNTER_BUFFER, 0u , m_gl_draw_count_out_ac);
116
120
117
121
const GLuint workgroup_size = 32u ;
118
122
const GLuint workgroup_group_count = (number_of_draws + workgroup_size - 1u ) / workgroup_size;
@@ -122,6 +126,7 @@ namespace zephyr {
122
126
glBindBufferBase (GL_SHADER_STORAGE_BUFFER, 1u , 0u );
123
127
glBindBufferBase (GL_SHADER_STORAGE_BUFFER, 2u , 0u );
124
128
glBindBufferBase (GL_UNIFORM_BUFFER, 0u , 0u );
129
+ glBindBufferBase (GL_ATOMIC_COUNTER_BUFFER, 0u , 0u );
125
130
}
126
131
127
132
// 3. draw everything written to the Draw List SSBO
@@ -130,14 +135,17 @@ namespace zephyr {
130
135
131
136
glBindVertexArray (m_render_geometry_manager->GetVAOFromLayout (RenderGeometryLayout{key}));
132
137
glBindBuffer (GL_DRAW_INDIRECT_BUFFER, m_gl_draw_list_ssbo);
138
+ glBindBuffer (GL_PARAMETER_BUFFER, m_gl_draw_count_out_ac);
133
139
glBindBufferBase (GL_UNIFORM_BUFFER, 0u , m_gl_camera_ubo);
134
140
glBindBufferBase (GL_SHADER_STORAGE_BUFFER, 0u , m_gl_render_bundle_ssbo);
135
141
136
- glMemoryBarrier (GL_COMMAND_BARRIER_BIT);
137
- glMultiDrawElementsIndirect (GL_TRIANGLES, GL_UNSIGNED_INT, nullptr , (GLsizei)number_of_draws, sizeof (OpenGLDrawElementsIndirectCommand));
142
+ glMemoryBarrier (GL_COMMAND_BARRIER_BIT | GL_ATOMIC_COUNTER_BARRIER_BIT);
143
+ // glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, nullptr, (GLsizei)number_of_draws, sizeof(OpenGLDrawElementsIndirectCommand));
144
+ glMultiDrawElementsIndirectCount (GL_TRIANGLES, GL_UNSIGNED_INT, nullptr , 0u , (GLsizei)number_of_draws, sizeof (OpenGLDrawElementsIndirectCommand));
138
145
139
146
glBindVertexArray (0u );
140
147
glBindBuffer (GL_DRAW_INDIRECT_BUFFER, 0u );
148
+ glBindBuffer (GL_PARAMETER_BUFFER, 0u );
141
149
glBindBufferBase (GL_UNIFORM_BUFFER, 0u , 0u );
142
150
glBindBufferBase (GL_SHADER_STORAGE_BUFFER, 0u , 0u );
143
151
}
@@ -234,11 +242,19 @@ namespace zephyr {
234
242
uint u_draw_count;
235
243
};
236
244
245
+ layout(binding = 0) uniform atomic_uint u_draw_count_out;
246
+
237
247
void main() {
238
248
const uint draw_index = gl_GlobalInvocationID.x;
239
249
250
+ if(draw_index == 0u) {
251
+ atomicCounterExchange(u_draw_count_out, 0u);
252
+ }
253
+ barrier();
254
+
240
255
if(draw_index < u_draw_count) {
241
256
b_command_buffer[draw_index] = rb_geometry_commands[rb_render_bundle_items[draw_index].draw_command_id];
257
+ atomicCounterIncrement(u_draw_count_out);
242
258
}
243
259
}
244
260
)" , GL_COMPUTE_SHADER);
0 commit comments