CUDA C Programming Guide
3.2.12 Graphics Interoperability
OpenGL和Direct3D中的 一些资源可以映射到CUDA的地址空间
CUDA能够读取OpenGL或Direct3D编写的数据,或者使CUDA能够编写数据供OpenGL或Direct3D使用。
在使用OpenGL互操作和Direct3D互操作功能 映射资源 之前,必须 将资源注册到CUDA 。
- 这些函数返回一个指向类型为 struct cudaGraphicsResource 的CUDA图形资源的指针。
- 注册资源是潜在的高开销,因此通常每个资源只调用一次。
使用cudaGraphicsUnRegierResource()注销CUDA图形资源。
每个打算使用该资源的CUDA上下文都需要单独注册。 - 一旦将资源注册到CUDA,就可以使用cudaGraphicsMapResources()和cudaGraphicsUnmapResources()将其映射和取消映射的必要次数。
- 可以调用cudaGraphicsResourceSetMapFlag()来指定使用提示(只写、只读),CUDA驱动程序可以使用这些提示来优化资源管理。
- 在映射资源时,通过OpenGL、Direct3D或其他CUDA上下文访问资源会产生未定义的结果。OpenGL互操作和Direct3D互操作给出了每个图形API和一些代码示例的具体说明。
OpenGL Interoperability【OpenGL互操作性】
-
可映射到CUDA地址空间的OpenGL资源有:
-
【OpenGL buffer、texture和renderbuffer对象】
-
使用 cudaGraphicsGLRegisterBuffer() 注册缓冲区对象。在CUDA中,它显示为一个设备指针,因此可以通过内核或cudamemcpy() 调用进行读写
-
【对于纹理】使用 cudaGraphicsGLRegisterImage() 注册texture或renderbuffer对象。
-
在CUDA中,它显示为 CUDA数组 。内核可以通过将数组绑定到纹理或表面引用来从数组中读取。
-
如果资源已使用cudaGraphicsRegisterFlagsSurfaceLoadStore标志注册,则还可以通过surface写入函数向其写入。还可以通过cudaMemcpy2D()调用读写数组。
-
cudaGraphicsGLRegisterImage()支持所有纹理格式,包括1、2或4个组件和内部浮动类型(例如GL_RGBA_FLOAT 32)、归一化整数(例如GL_RGBA8、GL_INTENSITY 16)和非规范化整数(例如GL_RGBA8UI)
(请注意,由于非规范化整数格式需要OpenGL 3.0,它们只能由着色器编写,而不能用固定的函数管道编写)。 -
资源共享的OpenGL上下文必须是当前的主机线程
,发出任何OpenGL互操作性API调用。