Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
	~CudaSurfaceObject()
	{
		CUDA_CALL(cudaDestroySurfaceObject(m_surfaceObject));
	}