Opengl es 2个计算着色器,1个glMemoryBarrier=OK?

Opengl es 2个计算着色器,1个glMemoryBarrier=OK?,opengl-es,glsl,compute-shader,opengl-es-3.1,Opengl Es,Glsl,Compute Shader,Opengl Es 3.1,设置(android设备上的OpenGL ES 3.1): 计算着色器清除(在程序中): Compute_shader_main(在程序中): 两个计算着色器都指向同一纹理 (绑定零=图像单元零) 应用程序调用代码: 此设置似乎可以正常工作,但此解释正确吗 屏障是必要的,因为两者都有可能 调度命令可以同时运行 屏障意味着不会在中执行imageStore 第二次分派,直到在第一次分派中调用所有imageStore 发送完毕 屏障是必要的,因为两个调度命令可能同时运行 从技术上说是的,但更恰当的理由

设置(android设备上的OpenGL ES 3.1):

计算着色器清除(在程序中): Compute_shader_main(在程序中): 两个计算着色器都指向同一纹理 (绑定零=图像单元零)

应用程序调用代码: 此设置似乎可以正常工作,但此解释正确吗
  • 屏障是必要的,因为两者都有可能 调度命令可以同时运行

  • 屏障意味着不会在中执行imageStore 第二次分派,直到在第一次分派中调用所有imageStore 发送完毕

  • 屏障是必要的,因为两个调度命令可能同时运行

    从技术上说是的,但更恰当的理由是“因为OpenGL ES规范说这是必要的。”

    屏障意味着在第一次分派中的所有imageStore调用完成之前,不会在第二次分派中执行imageStore

    屏障的意思是,如果以后有读/写操作试图访问以前写入的数据,这些读/写操作将读取/覆盖屏障之前的命令写入的数据


    如何实现是一个实现细节。可能有硬件可以通过某种方式的排序操作并发执行这些命令。诚然,大多数实现很有可能会像您所说的那样:在执行后续命令之前,请等待执行之前的命令并清除缓存。

    谢谢Nicol,非常感谢您的时间
    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));
    }
    
    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);
    ...