У меня есть пара вычислительных шейдеров, которые должны быть выполнены в определенном порядке и чьи выходные данные зависят от предыдущих входных данных. В идеале мне никогда не понадобится копировать буфер на стороне клиента и выполнять всю мою работу на GPU.
Рассмотрим У меня есть два вычислительных шейдеров скомпилированы и связаны , как program_one
и program_two
. Предположим, у меня также есть, GL_SHADER_STORAGE_BUFFER
который содержит данные, которые записаны program_one
и прочитаны program_two
. Могу ли я просто сделать следующее:
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);
Гарантируется ли, что все вызовы первого вычислительного шейдера завершатся раньше, чем вызовы второго (чтобы избежать гонок данных между чтением и записью buffer
)? Если нет, как мне их синхронизировать?