2012-02-23 102 views
2

我創建一個OpenGL紋理像這樣:cudaGraphicsResourceGetMappedPointer返回「未知錯誤」

glGenTextures(1, &boardTex); 
glBindTexture(GL_TEXTURE_2D, boardTex); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL); 

我得到board一個手柄,所以我認爲紋理的創建成功。我想分享這個紋理與CUDA,所以我註冊並映射資源:

cudaGLSetGLDevice(0); 
cudaGraphicsGLRegisterImage(&boardImage, boardTex, GL_TEXTURE_2D, cudaGraphicsMapFlagsNone); 
cudaGraphicsMapResources(1, &boardImage, 0); 

然後我試圖讓映射的指示器這樣的:

float4* mappedPointer; 
size_t mappedSize; 
cudaGraphicsResourceGetMappedPointer((void**)&mappedPointer, &mappedSize, boardImage); 

不幸的是這個調用返回一個錯誤並拒絕工作。爲了以防萬一,我確保紋理不受OpenGL環境的限制。還是行不通。 cudaGetErrorString收益率「未知錯誤」所以我很困在這裏。我會很感激任何想法。

+0

'board'和'boardTex'具有相同的值嗎? – harrism 2012-02-23 04:47:55

+0

@harrism是的,我的不好(板子在某些功能上是本地的)。編輯它。 – kaoD 2012-02-23 04:54:40

回答

3

好吧,我發現了這一點,我自己:

cudaGraphicsSubResourceGetMappedArray (&array, resource, 0, 0);返回cudaArray的工作。我還沒有圍繞cudaArray的工作(我可能最終使用PBO),但至少它沒有崩潰。

編輯:

從CUDA參考指南條目cudaGraphicsResourceGetMappedPointer()

如果資源是不是一個緩衝區,它無法通過指針 訪問和返回cudaErrorUnknown。

從CUDA參考指南條目cudaGraphicsSubResourceGetMappedArray()

如果資源不是質地話,就無法通過陣列 訪問和返回cudaErrorUnknown。

換句話說,使用GetMappedPointer來映射緩衝區對象。爲映射的紋理對象使用GetMappedArray。