C++ CUDAEMCPY2DFROMARRAY导致cudaErrorInvalidValue
我在使用OpenGL CUDA Interopt时遇到一些问题 我的设置如下所示: 我正在使用FrameBufferObject进行纹理渲染(效果非常好),我是这样创建的:C++ CUDAEMCPY2DFROMARRAY导致cudaErrorInvalidValue,c++,opengl,cuda,C++,Opengl,Cuda,我在使用OpenGL CUDA Interopt时遇到一些问题 我的设置如下所示: 我正在使用FrameBufferObject进行纹理渲染(效果非常好),我是这样创建的: void createFrameBuffer(){ // Create the texture for the FBO glGenTextures(1, &tex_data); glBindTexture(GL_TEXTURE_2D, tex_data); SDK_CHECK_ERR
void createFrameBuffer(){
// Create the texture for the FBO
glGenTextures(1, &tex_data);
glBindTexture(GL_TEXTURE_2D, tex_data);
SDK_CHECK_ERROR_GL();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F , window_w, window_h, 0, GL_RGBA, GL_FLOAT, NULL);
// Create the frameBuffer
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
// Register the texture with cuda
checkCudaErrors(cudaGraphicsGLRegisterImage(&res_data, tex_data, GL_TEXTURE_2D, cudaGraphicsMapFlagsReadOnly));
SDK_CHECK_ERROR_GL();
// attach images
glGenRenderbuffersEXT(1, &depth_rb);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth_rb);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, window_w, window_h);
//-------------------------
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex_data, 0);
//Attach depth buffer to FBO
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb);
//glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, color);
//glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth);
// clean up
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
SDK_CHECK_ERROR_GL();
}
目前我没有内核,但我想将OpenGL中的纹理转换成可以与CUDA一起使用的东西。以下是我试图转换的内容:
void processImage(){
cudaArray *cuda_data = 0;
checkCudaErrors( cudaGraphicsGLRegisterImage(&res_data, tex_data, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsReadOnly));
float *dData; // Array holding the data
std::cout << "cudaMalloc " << std::endl;
checkCudaErrors( cudaMalloc(&dData, window_w * window_h*4*sizeof(float)));
std::cout << "Mapping Resource" << std::endl;
checkCudaErrors( cudaGraphicsMapResources(1, &res_data) );
std::cout << "cudaGraphicsSubResourceGetMappedArray" << std::endl;
checkCudaErrors( cudaGraphicsSubResourceGetMappedArray(&cuda_data, res_data, 0, 0));
std::cout << "cudaMemcpy2DFromArray" << std::endl;
// Copy from the texture to the graphic Card
checkCudaErrors( cudaMemcpy2DFromArray(dData, window_w*4*sizeof(float), cuda_data ,0 ,0, window_w*4*sizeof(float), window_h, cudaMemcpyDeviceToDevice));
std::cout << "cudaGraphicsUnmapResources" << std::endl;
// Unmap the resource
checkCudaErrors( cudaGraphicsUnmapResources(1, &res_data));
}
void processImage(){
cuda阵列*cuda_数据=0;
检查CUDAErrors(cudaGraphicsGLRegisterImage(&res_数据、tex_数据、GL_纹理_2D、cudaGraphicsRegisterFlagsReadOnly));
float*dData;//保存数据的数组
std::难道你还没有提供其他人可以编译和运行的复制案例,但我猜问题是你提供给cudaMemcpy2DFromArray
的cuda内存分配间距无效。你应该使用cudamaloc2d
分配内存以获得内存间距。cudamaloc2d
=>cudamalocp痒