Note that there are some explanatory texts on larger screens.

plurals
  1. POCUDA/OpenGL interop, draw to OpenGL texture with CUDA
    primarykey
    data
    text
    <p>I am writing a rendering system in CUDA and want results to be quickly displayed via OpenGL, without touching main memory. I basically do the following:</p> <p>Create and initialize OpenGL texture, and register it in CUDA as cudaGraphicsResource</p> <pre><code>GLuint viewGLTexture; cudaGraphicsResource_t viewCudaResource; void initialize() { glEnable(GL_TEXTURE_2D); glGenTextures(1, &amp;viewGLTexture); glBindTexture(GL_TEXTURE_2D, viewGLTexture); { 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_RGBA, view.getWidth(), view.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); } glBindTexture(GL_TEXTURE_2D, 0); cudaGraphicsGLRegisterImage(&amp;viewCudaResource, viewGLTexture, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsWriteDiscard) } </code></pre> <p>Whenever view is resized I resize viewport and texture image appropriately:</p> <pre><code>void resize() { glViewport(0, 0, view.getWidth(), view.getHeight()); glBindTexture(GL_TEXTURE_2D, viewGLTexture); { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, view.getWidth(), view.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); } glBindTexture(GL_TEXTURE_2D, 0); } </code></pre> <p>And then each frame I map graphicsResource as a cudaSurfaceObject via cudaArray, call rendering kernel on it, unmap and synchronize to let OpenGL draw a fullscreen quad with this texture:</p> <pre><code>void renderFrame() { cudaGraphicsMapResources(1, &amp;viewCudaResource); { cudaArray_t viewCudaArray; cudaGraphicsSubResourceGetMappedArray(&amp;viewCudaArray, viewCudaResource, 0, 0); cudaResourceDesc viewCudaArrayResourceDesc; { viewCudaArrayResourceDesc.resType = cudaResourceTypeArray; viewCudaArrayResourceDesc.res.array.array = viewCudaArray; } cudaSurfaceObject_t viewCudaSurfaceObject; cudaCreateSurfaceObject(&amp;viewCudaSurfaceObject, &amp;viewCudaArrayResourceDesc); { invokeRenderingKernel(viewCudaSurfaceObject); } cudaDestroySurfaceObject(viewCudaSurfaceObject)); } cudaGraphicsUnmapResources(1, &amp;viewCudaResource); cudaStreamSynchronize(0); glBindTexture(GL_TEXTURE_2D, viewGLTexture); { glBegin(GL_QUADS); { glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex2f(+1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex2f(+1.0f, +1.0f); glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f, +1.0f); } glEnd(); } glBindTexture(GL_TEXTURE_2D, 0); glFinish(); } </code></pre> <p>The problem is: Whenever view is resized all CUDA calls start spewing out "unknown error"s and visually it looks like the texture is not in fact resized, just stretched across the whole view. Why is this happening and how do I fix it?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload