//----------------------------------------------------------------------------- void QGLImageGpuWidget::fillPbo(iu::ImageGpu_8u_C4* output) { // map GL <-> CUDA resource uchar4 *d_dst = NULL; size_t start; cudaGraphicsMapResources(1, &cuda_pbo_resource_, 0); cudaGraphicsResourceGetMappedPointer((void**)&d_dst, &start, cuda_pbo_resource_); // get image data iuprivate::cuCopyImageToPbo(image_, num_channels_, bit_depth_, d_dst, min_, max_); cudaThreadSynchronize(); // get overlays iuprivate::OverlayList::iterator it; for ( it=overlay_list_.begin() ; it != overlay_list_.end(); it++ ) if ((*it)->isActive()) cuCopyOverlayToPbo((*it), d_dst, image_->size()); cudaThreadSynchronize(); if (output != NULL) { // copy final pbo to output iu::ImageGpu_8u_C4 temp(d_dst, image_->width(), image_->height(), image_->width()*sizeof(uchar4), true); iu::copy(&temp, output); } // unmap GL <-> CUDA resource cudaGraphicsUnmapResources(1, &cuda_pbo_resource_, 0); }
//----------------------------------------------------------------------------- bool QGLImageGpuWidget::fillPbo(iu::ImageGpu_8u_C4* output) { // map GL <-> CUDA resource uchar4 *d_dst = NULL; size_t start; cudaError_t err = cudaGraphicsMapResources(1, &cuda_pbo_resource_); if (err != cudaSuccess) { printf("Error: Can't map OpenGL resource to CUDA\n"); return false; } err = cudaGraphicsResourceGetMappedPointer((void**)&d_dst, &start, cuda_pbo_resource_); if (err != cudaSuccess) { printf("Error: Can't get CUDA pointer from mapped GL resource\n"); return false; } // get image data iuprivate::cuCopyImageToPbo(image_, num_channels_, bit_depth_, d_dst, min_, max_); // get overlays iuprivate::OverlayList::iterator it; for ( it=overlay_list_.begin() ; it != overlay_list_.end(); it++ ) if ((*it)->isActive()) cuCopyOverlayToPbo((*it), d_dst, image_->size()); if (output != NULL) { // copy final pbo to output iu::ImageGpu_8u_C4 temp(d_dst, image_->width(), image_->height(), image_->width()*sizeof(uchar4), true); iu::copy(&temp, output); } // unmap GL <-> CUDA resource cudaGraphicsUnmapResources(1, &cuda_pbo_resource_); return true; }