【发布时间】:2019-10-06 04:34:18
【问题描述】:
OpenGL 红皮书版本 9 (OpenGL 4.5) 示例 11.13 是简单的每像素互斥体。它在do {} while() 循环中使用imageAtomicCompSwap 来获取每像素锁定,以防止在对应于相同像素坐标的像素着色器调用之间同时访问共享资源。
layout (binding = 0, r32ui) uniform volatile coherent uimage2D lock_image;
void main(void)
{
ivec2 pos = ivec2(gl_FragCoord.xy);
// spinlock - acquire
uint lock_available;
do {
lock_available = imageAtomicCompSwap(lock_image, pos, 0, 1);
} while (lock_available != 0);
// do some operations protected by the lock
do_something();
// spinlock - release
imageStore(lock_image, pos, uvec4(0));
}
此示例在 Nvidia 和 AMD GPU 上均导致 APPCRASH。我知道在这两个平台上,PS 职业无法相互独立地进行——一组线程同步执行,共享控制流(Nvidia 术语中的 32 个线程的“扭曲”)。所以可能会导致死锁。
然而,OpenGL 规范没有提到“以锁步方式执行的线程”。它只提到了“相同着色器类型的调用的相对顺序是未定义的。”。如本例,为什么不能使用原子操作imageAtomicCompSwap来保证不同PS调用之间的独占访问呢?这是否意味着 Nvidia 和 AMD GPU 不符合 OpenGL 规范?
【问题讨论】:
标签: opengl glsl mutex spinlock