opengl 在初始化SSBO存储和填充它之间是否需要内存屏障?

brtdzjyr  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(144)

我有一个代码,看起来像这样:

uint ssboId;
glGenBuffers(1, &ssboId);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssboId);

//initialize
glBufferData(GL_SHADER_STORAGE_BUFFER, size, 0, GL_STATIC_DRAW);

// memory barrier here?
// glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);

//start writes
glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset1, sourceSize1, data1);
glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset2, sourceSize2, data2);
...

// Ensure changes are applied before shader grabs it.
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);

字符集
我是否需要取消注解glBufferData和glBufferSubData之间对glMemoryBarrier的调用?如果SSBO内容不一致,glBufferSubData是否有可能在glBufferData之前通过,从而崩溃?
我的应用程序正在工作,但我不确定它是否只是侥幸工作。

plicqrtu

plicqrtu1#

glMemoryBarrier的两个调用都不是必需的。几乎所有OpenGL函数(包括glBufferDataglBufferSubData)都遵循传统的OpenGL内存模型,其中自动保证同步。
仅在少数情况下需要手动同步。例如,当着色器写入SSBO以保证所有进一步操作都将看到此写入时:

//Init SSBO
glBufferData(...);
glBufferSubData(...);

//No sync needed here

glDispatchCompute(...); //Shader which writes to the SSBO

//Sync here to make writes visible
glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);

//Read back SSBO memory
glMapBuffer(...);
...

字符集

相关问题