void Renderer::render_disparity(const uint16_t* d_disp, int disp_size) { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, 0); // cuda-gl interop cudaGraphicsResource_t cuda_gl_tex_resource; cudaGraphicsGLRegisterImage(&cuda_gl_tex_resource, disp_texture_, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsSurfaceLoadStore); cudaGraphicsMapResources(1, &cuda_gl_tex_resource); cudaArray_t texture_array; cudaGraphicsSubResourceGetMappedArray(&texture_array, cuda_gl_tex_resource, 0, 0); cudaResourceDesc desc; desc.resType = cudaResourceTypeArray; desc.res.array.array = texture_array; cudaSurfaceObject_t write_surface; cudaCreateSurfaceObject(&write_surface, &desc); write_surface_U16_with_multiplication(write_surface, d_disp, width_, height_, 256); cudaDestroySurfaceObject(write_surface); cudaGraphicsUnmapResources(1, &cuda_gl_tex_resource); cudaGraphicsUnregisterResource(cuda_gl_tex_resource); // end cuda-gl interop glUseProgram(program_disp_); glBindTexture(GL_TEXTURE_2D, disp_texture_); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, vert_buffer_); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)0); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (float*)0 + 3); GLint loc; loc = glGetUniformLocation(program_disp_, "tex_sampler"); if (loc != -1) { glUniform1i(loc, 0); } loc = glGetUniformLocation(program_cdisp_, "inv_disp_size"); if (loc != -1) { glUniform1i(loc, 256 / disp_size); } glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glBindTexture(GL_TEXTURE_2D, 0); }
~CudaSurfaceObject() { CUDA_CALL(cudaDestroySurfaceObject(m_surfaceObject)); }