CUDA-OpenGL互操作

  • 在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()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章