void generateCUDAImage() { unsigned int* out_data = cuda_dest_resource; dim3 block(16, 16, 1); dim3 grid(image_width / block.x, image_height / block.y, 1); launch_cudaProcess(grid, block, 0, out_data, image_width); cudaArray *texture_ptr; cudaGraphicsMapResources(1, &cuda_tex_result_resource, 0); cudaGraphicsSubResourceGetMappedArray(&texture_ptr, cuda_tex_result_resource, 0, 0); int num_texels = image_width * image_height; int num_values = num_texels * 4; int size_tex_data = sizeof(GLubyte) * num_values; cudaMemcpyToArray(texture_ptr, 0, 0, cuda_dest_resource, size_tex_data, cudaMemcpyDeviceToDevice); }
//////////////////////////////////////////////////////////////////////////////// //! Run the Cuda part of the computation //////////////////////////////////////////////////////////////////////////////// void process(int width, int height, int radius) { cudaArray *in_array; unsigned int *out_data; #ifdef USE_TEXSUBIMAGE2D checkCudaErrors(cudaGraphicsMapResources(1, &cuda_pbo_dest_resource, 0)); size_t num_bytes; checkCudaErrors(cudaGraphicsResourceGetMappedPointer((void **)&out_data, &num_bytes, cuda_pbo_dest_resource)); //printf("CUDA mapped pointer of pbo_out: May access %ld bytes, expected %d\n", num_bytes, size_tex_data); #else out_data = cuda_dest_resource; #endif // map buffer objects to get CUDA device pointers checkCudaErrors(cudaGraphicsMapResources(1, &cuda_tex_screen_resource, 0)); //printf("Mapping tex_in\n"); checkCudaErrors(cudaGraphicsSubResourceGetMappedArray(&in_array, cuda_tex_screen_resource, 0, 0)); // calculate grid size dim3 block(16, 16, 1); //dim3 block(16, 16, 1); dim3 grid(width / block.x, height / block.y, 1); int sbytes = (block.x+(2*radius))*(block.y+(2*radius))*sizeof(unsigned int); // execute CUDA kernel launch_cudaProcess(grid, block, sbytes, in_array, out_data, width, height, block.x+(2*radius), radius, 0.8f, 4.0f); checkCudaErrors(cudaGraphicsUnmapResources(1, &cuda_tex_screen_resource, 0)); #ifdef USE_TEXSUBIMAGE2D checkCudaErrors(cudaGraphicsUnmapResources(1, &cuda_pbo_dest_resource, 0)); #endif }