Mam kilka shaderów obliczeniowych, które należy wykonać w określonej kolejności i których wyniki zależą od poprzednich danych wejściowych. Idealnie, nigdy nie będę musiał kopiować bufora po stronie klienta i wykonywać całej mojej pracy na GPU.
Rozważ, że mam dwa shadery obliczeniowe skompilowane i połączone jako program_onei program_two. Załóżmy, że mam również plik, GL_SHADER_STORAGE_BUFFERktóry zawiera dane, które są zapisywane program_onei czytane przez program_two. Czy mogę po prostu wykonać następujące czynności:
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);
Czy jest zagwarantowane, że wszystkie wywołania pierwszego modułu obliczeniowego zakończą się przed wywołaniem drugiego (aby uniknąć wyścigów danych między odczytem a zapisem buffer)? Jeśli nie, jak je zsynchronizować?