如何在openGL纹理上使用Cuda NPP(NVIDIA Performance Primitives)

时间:2012-09-18 16:06:27

标签: opengl cuda textures

我目前正在开发一个项目,我会进行大量的视频处理。该项目使用C ++,openGL和glsl。最近我添加了一些CUDA例程,做了一些更高级的图像处理工作。我设法在cuda中使用openGL纹理,但是现在我试图使用一些cuda的npp函数和openGL纹理作为输入(没有更迭)。

例如,我想计算平均值和标准。预处理输入openGL纹理的偏差:

//I first connect the cudaGraphicsResource to a cudaArray 
//cudaGraphicsResource_t inputImage is input passed from openGL framework
cudaGraphicsMapResources(1,&inputImage);
cudaArray* inputImgArray = NULL;
cudaGraphicsSubResourceGetMappedArray(&inputArray, inputImage,0,0);

//Next I do some preparationwork and cast the cudaArray to a Npp8u* and give
//it as an input source imagebuffer to the npp routine.
NppiSize roi={imgwidth, imgheight};
int bufferSize = 0;
nppiMeanStdDev8uC1RGetBufferHostSize(roi,bufferSize);
double mean = 0;
double stdDev = 0;
Npp8u* scratch =  nppsMalloc_8f(bufferSize);
int stepSize = imgWidth * sizeof(unsigned char);
NppStatus status = nppiMean_stdDev_8u_C1R((Npp8u*)inputImgArray, stepSize, roi, scratch,&mean,&stdDev);

//cleanup
nppsFree(bufferSize);
cudaGraphicsUnmapresources(1,&inputImage);

nppiMean_stdDev_8u_C1R函数始终返回错误代码:NPP_MEMCPY_ERROR。 我在手册中随处可见,但我无法找到这是否是使用NPP和opengl纹理的正确方法。我也无法在互联网上找到任何相关信息。我无法相信我是第一个试图用NPP做这些事情的人。也许我只是错过了重要文件中的一个主要章节: - )。

1 个答案:

答案 0 :(得分:2)

您需要将设备指针传递给NPP,而不是CUDA数组。因此,在您的情况下,我认为您要使用cudaGraphicsResourceGetMappedPointer而不是cudaGraphicsSubResourceGetMappedArray

例如:(免责声明:此代码是在浏览器中编写的,未经测试,未经验证。)

//I first connect the cudaGraphicsResource to a cudaArray 
//cudaGraphicsResource_t inputImage is input passed from openGL framework
cudaGraphicsMapResources(1,&inputImage);
unsigned char* inputPtr = NULL; // to hold device pointer to input image
size_t inputSize;
cudaGraphicsResourceGetMappedPointer((void**)&inputPtr, &inputSize, inputImage);

//Next I do some preparation work and cast the device pointer to a Npp8u* and give
//it as an input source imagebuffer to the npp routine.
NppiSize roi={imgwidth, imgheight};
int bufferSize = 0;
nppiMeanStdDev8uC1RGetBufferHostSize(roi, &bufferSize); // note & missing from original!
double mean = 0;
double stdDev = 0;
Npp8u* scratch =  nppsMalloc_8f(bufferSize);
int stepSize = imgWidth * sizeof(unsigned char);
NppStatus status = nppiMean_stdDev_8u_C1R((Npp8u*)inputPtr, stepSize, roi, scratch, &mean, &stdDev);

//cleanup
nppsFree(bufferSize);
cudaGraphicsUnmapresources(1,&inputImage);