在CUDA5.0前默認是無法與OpenGL交互的,爲了讓CUDA和OpenGL能夠通信,要調用
cudaError_t cudaGLSetGLDevice(int device)
OpenGL的資源需要與CUDA綁定才能被其訪問,用戶需要提供一個cudaGraphicsResource類型的指針,cuda負責對該指針寫入
//綁定texture或render buffer cudaError_t cudaGraphicsGLRegisterImage (struct cudaGraphicsResource **resource, GLuint image, GLenum target, unsigned int flags) //綁定buffer object cudaError_t cudaGraphicsGLRegisterBuffer(struct cudaGraphicsResource **resource, GLuint buffer, unsigned int flags)
資源被CUDA綁定後,還要進行映射,然後才能取得設備端指針。
//映射資源 __host__ cudaError_t cudaGraphicsMapResources (int count, cudaGraphicsResource_t* resources, cudaStream_t stream = 0) //獲取texture或render buffer的設備端指針 __host__ cudaError_t cudaGraphicsSubResourceGetMappedArray(cudaArray_t* array, cudaGraphicsResource_t resource, unsigned int arrayIndex, //對於單張紋理(非cubemap)該值指定爲0 unsigned int mipLevel ) //獲取buffer object的設備端指針 __host__ cudaError_t cudaGraphicsResourceGetMappedPointer(void** devPtr, size_t* size, cudaGraphicsResource_t resource )
映射到CUDA的資源無法被OpenGL訪問,所以當CUDA訪問完資源後,應立即解映射
__host__ cudaError_t cudaGraphicsUnmapResources(int count, cudaGraphicsResource_t* resources, cudaStream_t stream = 0)
互操作結束後,需要將OpenGL資源與CUDA解綁定
__host__ cudaError_t cudaGraphicsUnregisterResource (cudaGraphicsResource_t resource)
整體流程
void init() {
cudaGraphicsGLRegisterImage()
}
void update() {
cudaGraphicsMapResources()
cudaGraphicsSubResourceGetMappedArray()
...
cudaGraphicsUnmapResources()
}
void shutdown() {
cudaGraphicsUnregisterResource()
}