OpenGL红皮书版本9(OpenGL 4.5)示例11.13是Simple Per-Pixel Mutex。它imageAtomicCompSwap在do {} while()循环中使用每个像素的锁定,以防止同时访问对应于同一像素坐标的像素着色器调用之间的共享资源。
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));
}
Run Code Online (Sandbox Code Playgroud)
此示例在Nvidia和AMD GPU上均产生APPCRASH。我知道在这两个平台上PS的职业无法彼此独立地进行-线程的子组以锁步的方式执行,共享控制流(Nvidia术语中的32个线程的“扭曲”)。因此可能导致死锁。
但是,OpenGL规范在任何地方都没有提到“以锁步执行的线程”。它仅提及“未定义相同着色器类型的调用的相对顺序”。。如本例所示,为什么我们不能使用原子操作imageAtomicCompSwap来确保不同PS调用之间的互斥访问?这是否意味着Nvidia和AMD GPU不符合OpenGL规范?
我在Visual C++内联汇编中使用了这个指令
lea eax, FS:[0]
Run Code Online (Sandbox Code Playgroud)
为什么eax得到零?
我如何获得线性地址FS:[0]?