Sincronización de invocaciones sucesivas de OpenGL Compute Shader

12

Tengo un par de sombreadores de cómputo que deben ejecutarse en un cierto orden y cuyas salidas dependen de entradas anteriores. Idealmente, nunca necesitaré copiar un búfer del lado del cliente y hacer todo mi trabajo en la GPU.

Considere que tengo dos sombreadores de cómputo compilados y vinculados como program_oney program_two. Supongamos que también tengo un GL_SHADER_STORAGE_BUFFERarchivo que contiene los datos escritos program_oney leídos por program_two. ¿Puedo simplemente hacer lo siguiente:

glUseProgram(program_one);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

glUseProgram(program_two);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

¿Se garantiza que todas las invocaciones del primer sombreador de cómputo terminarán antes de cualquier invocación del segundo (para evitar carreras de datos entre lectura y escritura buffer)? Si no, ¿cómo los sincronizo?

Mokosha
fuente

Respuestas:

12

No, no está garantizado, ya que la especificación OpenGL permite que dos Compute Shader se ejecuten simultáneamente o incluso en un orden diferente.

Debe llamar glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)antes del segundo glDispatchComputepara garantizar la visibilidad de las escrituras program_one.


Del artículo wiki de OpenGL.org sobre el modelo de memoria :

[...] las invocaciones entre etapas pueden ejecutarse en cualquier orden. Esto incluye invocaciones iniciadas por diferentes comandos de representación. Si bien es poco probable que dos sombreadores de vértices de diferentes operaciones de renderizado puedan ejecutarse al mismo tiempo, también es posible, por lo que OpenGL no ofrece garantías .

Del artículo wiki de Opengl.org sobre Shader Storage Buffer :

Las lecturas y escrituras de SSBO usan accesos de memoria incoherentes, por lo que necesitan las barreras apropiadas, al igual que las operaciones de Image Load Store.

Wumpf
fuente