Sincronizando sucessivas invocações do OpenGL Compute Shader

12

Eu tenho alguns shaders de computação que precisam ser executados em uma determinada ordem e cujas saídas dependem de entradas anteriores. Idealmente, nunca precisarei copiar um buffer do lado do cliente e fazer todo o meu trabalho na GPU.

Considere que eu tenho dois shaders de computação compilados e vinculados como program_onee program_two. Suponha que eu também tenha um GL_SHADER_STORAGE_BUFFERque contém os dados que são gravados program_onee lidos por program_two. Posso simplesmente fazer o seguinte:

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);

É garantido que todas as invocações do primeiro sombreador de computação terminem antes de qualquer invocação do segundo (para evitar corridas de dados entre leitura e gravação buffer)? Caso contrário, como os sincronizo?

Mokosha
fonte

Respostas:

12

Não, não é garantido, pois a especificação OpenGL permite que dois Compute Shader sejam executados simultaneamente ou mesmo em ordem diferente.

Você precisa ligar glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)antes do segundo glDispatchComputepara garantir a visibilidade das gravações deprogram_one .


No artigo wiki do OpenGL.org sobre o modelo de memória :

[...] invocações entre estágios podem ser executadas em qualquer ordem. Isso inclui chamadas iniciadas por diferentes comandos de renderização. Embora seja improvável que dois shaders de vértice de diferentes operações de renderização possam estar em execução ao mesmo tempo, também é possível, portanto o OpenGL não oferece garantias .

No artigo wiki do Opengl.org sobre Shader Storage Buffer :

As leituras e gravações de SSBOs usam acessos incoerentes à memória; portanto, eles precisam das barreiras apropriadas, assim como as operações do Image Load Store.

Wumpf
fonte