确保现代缓冲区的端序



我正在尝试学习现代Python,我想知道是否有一种方法可以确保当我读/写缓冲区(统一或着色器存储)时,客户机和主机设备之间的端序一致。我有以下最小程序:

import moderngl as gl
import struct
context = gl.create_context(require=430, standalone=True)
comp = context.compute_shader('''
#version 430
layout (local_size_x=2) in;
layout (std140, binding=0) buffer mem {
ivec4 vfs[];
};
void main() {
uvec3 id = gl_GlobalInvocationID;
vfs[id.x] = ivec4(id.x, gl_LocalInvocationID.x, gl_WorkGroupID.x, 0);
}
''')
output = context.buffer(None, reserve=4*4*8)
output.bind_to_storage_buffer(0)
comp.run(8)
buf = output.read()
buf = struct.unpack('32i', (buf)) # Unpacks using the default of native endianness
print(buf)

当我运行它时,正如我所期望的那样,我看到了输出:

(0, 0, 0, 0, 1, 1, 0, 0, 2, 0, 1, 0, 3, 1, 1, 0, 4, 0, 2, 0, 5, 1, 2, 0, 6, 0, 3, 0, 7, 1, 3, 0)

但是,当在另一台机器上或使用另一个显卡运行时,情况总是这样吗?在某些机器上,这个程序是否可能对输出数组中的每个元素进行字节反转?如果是这样,是否有一种跨系统的方法来确保端序是正确的,而不是在程序开始时运行某种测试着色器来检测端序并纠正它,如果它是不正确的?

这对于一般的OpenGL来说可能是一样的;我不知道是否有任何特定于moderngl的实用程序,或者它缺少的实用程序来实现这一点。

Vulkan明确要求主机和设备共享相同的端字节顺序。OpenGL没有明确地有这样的要求,但是OpenGL进程如何解释它从内存读/写到内存的字节的隐式定义需要这一点。

所以没有什么可检查的

相关内容

  • 没有找到相关文章

最新更新