Synchronizacja kolejnych wywołań OpenGL Compute Shader

12

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ć?

Mokosha
źródło

Odpowiedzi:

12

Nie, nie jest to gwarantowane, ponieważ specyfikacja OpenGL pozwala dwóm modułom obliczeniowym działać jednocześnie lub nawet w innej kolejności.

Musisz zadzwonić glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)przed drugim, glDispatchComputeaby zapewnić widoczność zapisów z program_one.


Z artykułu wiki OpenGL.org na temat modelu pamięci :

[...] wywołania między etapami mogą być wykonywane w dowolnej kolejności. Obejmuje to wywołania uruchamiane przez różne polecenia renderowania. Chociaż być może jest mało prawdopodobne, aby dwa moduły cieniujące wierzchołki z różnych operacji renderowania działały w tym samym czasie, jest również możliwe, więc OpenGL nie daje żadnych gwarancji .

Z artykułu wiki Opengl.org na temat bufora pamięci Shader :

SSBO odczytuje i zapisuje wykorzystanie niespójnego dostępu do pamięci, więc potrzebują odpowiednich barier, podobnie jak operacje Image Load Store.

Wumpf
źródło