Cuda et OpenGL Interop

J'ai lu à travers le CUDA de la documentation et il me semble que chaque mémoire tampon qui sert d'interface avec OpenGL doit être créé dans le glBuffer.

Selon la nvidia guide de programmation, ce qui doit être fait comme ceci:

GLuint positionsVBO;
struct cudaGraphicsResource* positionsVBO_CUDA;
int main() {
//Explicitly set device
cudaGLSetGLDevice(0);
//Initialize OpenGL and GLUT
...
glutDisplayFunc(display);
//Create buffer object and register it with CUDA
glGenBuffers(1, positionsVBO);
glBindBuffer(GL_ARRAY_BUFFER, &vbo);
unsigned int size = width * height * 4 * sizeof(float);
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
cudaGraphicsGLRegisterBuffer(&positionsVBO_CUDA, positionsVBO, cudaGraphicsMapFlagsWriteDiscard);
//Launch rendering loop
glutMainLoop();
}
void display() {
//Map buffer object for writing from CUDA
float4* positions;
cudaGraphicsMapResources(1, &positionsVBO_CUDA, 0);
size_t num_bytes;
cudaGraphicsResourceGetMappedPointer((void**)&positions, &num_bytes, positionsVBO_CUDA));
//Execute kernel
dim3 dimBlock(16, 16, 1);
dim3 dimGrid(width / dimBlock.x, height / dimBlock.y, 1);
createVertices<<<dimGrid, dimBlock>>>(positions, time, width, height);
//Unmap buffer object
cudaGraphicsUnmapResources(1, &positionsVBO_CUDA, 0);
//Render from buffer object
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindBuffer(GL_ARRAY_BUFFER, positionsVBO);
glVertexPointer(4, GL_FLOAT, 0, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_POINTS, 0, width * height);
glDisableClientState(GL_VERTEX_ARRAY);
//Swap buffers
glutSwapBuffers();
glutPostRedisplay();
}
void deleteVBO() {
cudaGraphicsUnregisterResource(positionsVBO_CUDA);
glDeleteBuffers(1, &positionsVBO);
}
__global__ void createVertices(float4* positions, float time, unsigned int width, unsigned int height) { 
//[....]
}

Est-il un moyen de donner le cudaMalloc créé de l'espace mémoire directement à OpenGL? J'ai déjà travailler le code écrit sur cuda et je veux mettre mon float4 tableau directement dans OpenGL.

Dire si avez déjà un code comme:

float4 *cd = (float4*) cudaMalloc(elements*sizeof(float4)). 
do_something<<<16,1>>>(cd);

Et je voulais afficher la sortie de faire_quelque_chose grâce à OpenGL.

Note de côté: pourquoi le cudaGraphicsResourceGetMappedPointer fonction exécuter sur chaque timestep?

InformationsquelleAutor Pascal | 2011-06-25