Согласованность памяти с вычислительными шейдерами и imageStore

Я хочу использовать imageStore а также imageLoad в нескольких вычислить шейдеры.

Это смешивается с «обычными» командами рендеринга (glDraw) на экран или в кадровые буферы, но они не используют imageStore или же imageLoad (только texture или же texelFetch).

У меня есть только один контекст OpenGL и поток.

Мои предположения следующие:

  • При выполнении imageStore, Мне нужно сделать glMemoryBarrier прежде чем делать imageLoad в более позднем вычислении шейдера или texture или же texelFetch в более позднем фрагменте шейдера.
  • Мне не нужно использовать coherent совсем.
  • Мне не нужно использовать glSync совсем.
  • Мне не нужно использовать glMemoryBarrier после записи в текстуру с использованием кадрового буфера, а затем читать его с imageLoad
  • OpenGL будет запускать вычислительные шейдеры и «обычные» операции рисования в том порядке, в котором они запрашиваются. Предполагая, что я использую glMemoryBarrier между вызовами нет «проблем с потоками».

Они правы?

2

Решение

Каждый из них является правильным, за исключением «возможного»:

Мне не нужно использовать coherent совсем.

Вам может понадобиться coherentв зависимости от того, что делает ваш вычислительный шейдер. Если ваш вычислительный шейдер записывает изображение, то читает данные, записанные другим вызов в пределах одной и той же отправки, тогда вам нужно coherent, Так что если вы делаете imageStore, выпустите вычислительный шейдер barrier() позвони, затем сделай imageLoad читать что-то другое вызовценность, то вам нужно coherent Классификатор.

coherent о обеспечении видимость в команде рендеринга (Отправки CS считаются «командами рендеринга» в OpenGL). Если вам не нужна внутренняя видимость, то вам не нужно coherent,


Я хочу уточнить это, потому что это общий источник путаницы:

Мне не нужно использовать glMemoryBarrier после записи в текстуру с использованием кадрового буфера, а затем читать его с imageLoad

Это абсолютно правильно. Барьеры памяти связаны с обеспечением видимости (и синхронизации) несогласованных записей в память. Рендеринг в фреймбуфер не бессвязная запись. Так что вы можете использовать imageLoad на таких данных без необходимости явной синхронизации.

Предполагая, конечно, что вы не рендеринг в этот кадровый буфер в той же операции, которую вы imageLoadисходя из этого. Это правило все еще применяется.

3

Другие решения

Других решений пока нет …