CUDA OpenGL互操作,资源映射混淆缓冲区
问题描述:
我最近开始编码CUDA OpenGL互操作性。大部分时间我都在Linux环境下开发。想我的代码转移到我碰到下面的问题就来了我的MacBook Pro运行OS X:CUDA OpenGL互操作,资源映射混淆缓冲区
每当我从映射OpenGL的顶点缓冲区对象作为一种资源来CUDA它搅乱了存储在相应的缓冲区中的数据。
这是我的代码:
// OpenGL and window handler includes
#include <GL/glew.h>
#include <SDL/SDL.h>
#include <OpenGL/GL.h>
// OpenGL/CUDA interop
#include <cuda_runtime.h>
#include <cuda_gl_interop.h>
// C libraries
#include <iostream>
int main(int argc, char* argv[])
{
GLuint vbo;
struct cudaGraphicsResource *cuda_vbo_resource;
// create OpenGL context with SDL
SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_SetVideoMode(400, 200, 16, SDL_OPENGL);
// initialize extension wrangler
glewInit();
// set cuda/GL device
cudaGLSetGLDevice(0);
// generate buffer
glGenBuffers(1, &vbo);
// fill buffer with data (1, 2, 3)
glBindBuffer(GL_ARRAY_BUFFER, vbo);
int inData[] = {1,2,3};
glBufferData(GL_ARRAY_BUFFER, 3*sizeof(int), inData, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// Register buffer with cuda
cudaGraphicsGLRegisterBuffer(&cuda_vbo_resource, vbo,
cudaGraphicsMapFlagsWriteDiscard);
// let's have a look at the buffer
glBindBuffer(GL_ARRAY_BUFFER, vbo);
int* mappedBuffer = (int *) glMapBuffer(GL_ARRAY_BUFFER,GL_READ_ONLY);
printf("\tbefore mapping: %d, %d, %d\n",mappedBuffer[0], mappedBuffer[1],
mappedBuffer[2]);
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// map and unmap the cuda resource
if (cudaGraphicsMapResources(1, &cuda_vbo_resource, 0) != cudaSuccess)
printf("Resource mapping failed...\n");
if (cudaGraphicsUnmapResources(1, &cuda_vbo_resource, 0) != cudaSuccess)
printf("Resource unmapping failed...\n");
// let's have a look at the buffer again
glBindBuffer(GL_ARRAY_BUFFER, vbo);
mappedBuffer = (int *) glMapBuffer(GL_ARRAY_BUFFER,GL_READ_ONLY);
printf("\tafter mapping: %d, %d, %d\n",mappedBuffer[0], mappedBuffer[1],
mappedBuffer[2]);
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// unregister the cuda resource
cudaGraphicsUnregisterResource(cuda_vbo_resource);
// delete the buffer
glBindBuffer(1, vbo);
glDeleteBuffers(1, &vbo);
return 0;
}
与编译后:
g++ -o resourceMapping resourceMapping.cpp `sdl-config --cflags --libs` -lglew
-framework OpenGL -I /usr/local/cuda/include -L /usr/local/cuda/lib -lcudart
我得到
before mapping: 1, 2, 3
after mapping: 0, 33554432, 32
有谁知道为什么映射改变缓冲区中的数据?这对我来说尤其令人困惑,因为这在Linux机器上不会发生。
感谢您的任何意见或提示!
答
我注意到你用cudaGraphicsMapFlagsWriteDiscard注册了vbo。
从here“指定CUDA不会从该资源读取数据,并将写入资源的全部内容,因此以前存储在资源中的数据都不会保留。”
也许尝试cudaGraphicsMapFlagsNone或cudaGraphicsMapFlagsReadOnly?
非常感谢!这解决了问题。 – nils 2013-04-21 05:23:56