2 Вычислить шейдеры, 1 glMemoryBarrier = OK?

Настройка (OpenGL ES 3.1 на устройстве Android):

Compute_shader_clear (в PROGRAM_A):

layout (local_size_x = 8, local_size_y = 8) in;
layout(rgba32f, binding=0) writeonly uniform mediump image2D write00;
void main() {
 ...
 imageStore(write00, pixel, vec4(0.0));
}

Compute_shader_main (в PROGRAM_B):

layout (local_size_x = 8, local_size_y = 8) in;
layout(rgba32f, binding=0) writeonly uniform mediump image2D write00;
void main() {
 ...
 imageStore(write00, pixel, final_color);
}

Оба вычислительных шейдера указывают на одну и ту же текстуру (ноль привязки = ноль единицы изображения)

Код вызова приложения:

glUseProgram(PROGRAM_A);
glDispatchCompute(90, 160, 1);
glUseProgram(PROGRAM_B);
GLES31.glMemoryBarrier(GLES31.GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
glDispatchCompute(3, 160, 1);
...

Эта настройка, кажется, работает без проблем, но правильна ли эта интерпретация?:

  1. Барьер необходим, поскольку возможно, что обе команды диспетчеризации могут выполняться одновременно.

  2. Барьер означает, что ни один imageStore не будет выполнен во второй диспетчеризации, пока ВСЕ вызовы imageStore в первой диспетчеризации не будут завершены.

1 ответ

Решение

Барьер необходим, поскольку возможно, что обе команды диспетчеризации могут выполняться одновременно.

Технически да, но более правильная причина - "потому что спецификация OpenGL ES говорит, что это необходимо".

Барьер означает, что ни один imageStore не будет выполнен во второй диспетчеризации, пока ВСЕ вызовы imageStore в первой диспетчеризации не будут завершены.

Что означает барьер, так это то, что, если позже существуют операции чтения / записи, которые пытаются получить доступ к ранее записанным данным, эти операции чтения / записи будут считывать / перезаписывать данные, записанные командами до барьера.

Как это будет реализовано - это деталь реализации. Может быть аппаратное обеспечение, которое может одновременно выполнять такие команды, используя какую-то операцию упорядочения. Конечно, шансы хороши тем, что большинство реализаций будут делать то, что вы сказали: дождитесь выполнения предыдущих команд и очистите кеши, прежде чем выполнять последующие команды.

Другие вопросы по тегам