CUDA C Programming Guide | Graphics Interoperability【圖形互動性】
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呼叫。