Я хочу использовать imageStore
а также imageLoad
в нескольких вычислить шейдеры.
Это смешивается с «обычными» командами рендеринга (glDraw) на экран или в кадровые буферы, но они не используют imageStore
или же imageLoad
(только texture
или же texelFetch
).
У меня есть только один контекст OpenGL и поток.
Мои предположения следующие:
imageStore
, Мне нужно сделать glMemoryBarrier
прежде чем делать imageLoad
в более позднем вычислении шейдера или texture
или же texelFetch
в более позднем фрагменте шейдера.coherent
совсем.glSync
совсем.glMemoryBarrier
после записи в текстуру с использованием кадрового буфера, а затем читать его с imageLoad
glMemoryBarrier
между вызовами нет «проблем с потоками».Они правы?
Каждый из них является правильным, за исключением «возможного»:
Мне не нужно использовать
coherent
совсем.
Вам может понадобиться coherent
в зависимости от того, что делает ваш вычислительный шейдер. Если ваш вычислительный шейдер записывает изображение, то читает данные, записанные другим вызов в пределах одной и той же отправки, тогда вам нужно coherent
, Так что если вы делаете imageStore
, выпустите вычислительный шейдер barrier()
позвони, затем сделай imageLoad
читать что-то другое вызовценность, то вам нужно coherent
Классификатор.
coherent
о обеспечении видимость в команде рендеринга (Отправки CS считаются «командами рендеринга» в OpenGL). Если вам не нужна внутренняя видимость, то вам не нужно coherent
,
Я хочу уточнить это, потому что это общий источник путаницы:
Мне не нужно использовать
glMemoryBarrier
после записи в текстуру с использованием кадрового буфера, а затем читать его сimageLoad
Это абсолютно правильно. Барьеры памяти связаны с обеспечением видимости (и синхронизации) несогласованных записей в память. Рендеринг в фреймбуфер не бессвязная запись. Так что вы можете использовать imageLoad
на таких данных без необходимости явной синхронизации.
Предполагая, конечно, что вы не рендеринг в этот кадровый буфер в той же операции, которую вы imageLoad
исходя из этого. Это правило все еще применяется.
Других решений пока нет …