当你调用 RWByteAddressBuffer.InterlockedAdd 时会发生什么?
What happens when you call RWByteAddressBuffer.InterlockedAdd?
我通常在 OpenGL 中编程,但我需要从 HLSL 翻译一些代码。
我看过RWByteAddressBuffer, but I'm not sure how it works with InterlockedAdd的文档。
据推测,RWByteAddressBuffer
是按字节寻址的。但是,我认为 InterlockedAdd
适用于 uint
s,它们是 32 位无符号整数。
我的疑问是,当我这样做时会发生什么?
uint c;
buffer.InterlockedAdd(0, 1, c);
我是递增缓冲区的第一个字节,还是缓冲区的第一个 32 位字?如果我使用的偏移量不是 4 的倍数怎么办?
当你打电话时:
uint c;
uint location = 0;
buffer.InterlockedAdd(location, 1, c);
位置以字节为单位指定,但您确实在前 4 个字节(int 大小)上增加了 1。
根据文档,ByteAddressBuffer/RWByteAddressBuffer 内存偏移量需要是 4 的倍数,其他未定义。
参见(字节地址缓冲区部分):https://docs.microsoft.com/en-us/windows/win32/direct3d11/direct3d-11-advanced-stages-cs-resources
我通常在 OpenGL 中编程,但我需要从 HLSL 翻译一些代码。
我看过RWByteAddressBuffer, but I'm not sure how it works with InterlockedAdd的文档。
据推测,RWByteAddressBuffer
是按字节寻址的。但是,我认为 InterlockedAdd
适用于 uint
s,它们是 32 位无符号整数。
我的疑问是,当我这样做时会发生什么?
uint c;
buffer.InterlockedAdd(0, 1, c);
我是递增缓冲区的第一个字节,还是缓冲区的第一个 32 位字?如果我使用的偏移量不是 4 的倍数怎么办?
当你打电话时:
uint c;
uint location = 0;
buffer.InterlockedAdd(location, 1, c);
位置以字节为单位指定,但您确实在前 4 个字节(int 大小)上增加了 1。
根据文档,ByteAddressBuffer/RWByteAddressBuffer 内存偏移量需要是 4 的倍数,其他未定义。
参见(字节地址缓冲区部分):https://docs.microsoft.com/en-us/windows/win32/direct3d11/direct3d-11-advanced-stages-cs-resources