diff options
Diffstat (limited to 'source/blender/gpu/opengl')
-rw-r--r-- | source/blender/gpu/opengl/gl_backend.hh | 13 | ||||
-rw-r--r-- | source/blender/gpu/opengl/gl_compute.cc | 2 | ||||
-rw-r--r-- | source/blender/gpu/opengl/gl_storage_buffer.cc | 7 | ||||
-rw-r--r-- | source/blender/gpu/opengl/gl_storage_buffer.hh | 3 |
4 files changed, 23 insertions, 2 deletions
diff --git a/source/blender/gpu/opengl/gl_backend.hh b/source/blender/gpu/opengl/gl_backend.hh index d7edd162f33..e72726d9c7b 100644 --- a/source/blender/gpu/opengl/gl_backend.hh +++ b/source/blender/gpu/opengl/gl_backend.hh @@ -123,6 +123,19 @@ class GLBackend : public GPUBackend { GLCompute::dispatch(groups_x_len, groups_y_len, groups_z_len); } + void compute_dispatch_indirect(StorageBuf *indirect_buf) override + { + GLContext::get()->state_manager_active_get()->apply_state(); + + dynamic_cast<GLStorageBuf *>(indirect_buf)->bind_as(GL_DISPATCH_INDIRECT_BUFFER); + /* This barrier needs to be here as it only work on the currently bound indirect buffer. */ + glMemoryBarrier(GL_DRAW_INDIRECT_BUFFER); + + glDispatchComputeIndirect((GLintptr)0); + /* Unbind. */ + glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0); + } + private: static void platform_init(); static void platform_exit(); diff --git a/source/blender/gpu/opengl/gl_compute.cc b/source/blender/gpu/opengl/gl_compute.cc index 1913174eaef..2fbf23c227d 100644 --- a/source/blender/gpu/opengl/gl_compute.cc +++ b/source/blender/gpu/opengl/gl_compute.cc @@ -16,8 +16,6 @@ void GLCompute::dispatch(int group_x_len, int group_y_len, int group_z_len) { GL_CHECK_RESOURCES("Compute"); - GLContext::get()->state_manager->apply_state(); - glDispatchCompute(group_x_len, group_y_len, group_z_len); } diff --git a/source/blender/gpu/opengl/gl_storage_buffer.cc b/source/blender/gpu/opengl/gl_storage_buffer.cc index 9cdde0b5734..a461d834790 100644 --- a/source/blender/gpu/opengl/gl_storage_buffer.cc +++ b/source/blender/gpu/opengl/gl_storage_buffer.cc @@ -100,6 +100,13 @@ void GLStorageBuf::bind(int slot) #endif } +void GLStorageBuf::bind_as(GLenum target) +{ + BLI_assert_msg(ssbo_id_ != 0, + "Trying to use storage buf as indirect buffer but buffer was never filled."); + glBindBuffer(target, ssbo_id_); +} + void GLStorageBuf::unbind() { #ifdef DEBUG diff --git a/source/blender/gpu/opengl/gl_storage_buffer.hh b/source/blender/gpu/opengl/gl_storage_buffer.hh index d657a4de09c..c808a0bdda1 100644 --- a/source/blender/gpu/opengl/gl_storage_buffer.hh +++ b/source/blender/gpu/opengl/gl_storage_buffer.hh @@ -37,6 +37,9 @@ class GLStorageBuf : public StorageBuf { void unbind() override; void clear(eGPUTextureFormat internal_format, eGPUDataFormat data_format, void *data) override; + /* Special internal function to bind SSBOs to indirect argument targets. */ + void bind_as(GLenum target); + private: void init(); |