私はOpenGL interopでOpenCLを使用しようとしています。 GPU上のパストレースアルゴリズムを計算し、GLテクスチャを四角に描画します。 Intel CPU上で動作するように動作しますが、GTX 970で動作させようとすると、GLテクスチャのロックを解除する際にsegfaultが発生します。それが原因か実行中のカーネルであればDunno。私はコードがそれ自体のために話すようにします。私はOpenCL C++ラッパーbtwを使用しています。OpenCL/OpenGL相互運用性テクスチャsegfault
GLテクスチャの作成
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, framebuffer);
glBindTexture(GL_TEXTURE_2D, 0); //Unbind texture
CLテクスチャの割り当て
m_textureCL = cl::ImageGL(m_context,
CL_MEM_READ_WRITE,
GL_TEXTURE_2D,
0,
texture,
&errCode);
RunKernel機能
//-----------------------------------------------------------------------------
// Lock texture
//-----------------------------------------------------------------------------
std::vector<cl::Memory> glObjects; //Create vector of GL objects to lock
glObjects.push_back(m_textureCL); //Add created CL texture buffer
glFlush(); //Flush GL queue
errCode = m_cmdQueue.enqueueAcquireGLObjects(&glObjects, NULL, NULL);
if(errCode != CL_SUCCESS) {
std::cerr << "Error locking texture" << errCode << std::endl;
return errCode;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Run queue
//-----------------------------------------------------------------------------
errCode = m_cmdQueue.enqueueNDRangeKernel(
m_kernel,
cl::NullRange,
cl::NDRange(height*width),
cl::NullRange,
NULL,
NULL);
if(errCode != CL_SUCCESS) {
std::cerr << "Error running queue: " << errCode << std::endl;
return errCode;
}
//---------------------------------------
//-----------------------------------------------------------------------------
// Unlock
//-----------------------------------------------------------------------------
errCode = m_cmdQueue.enqueueReleaseGLObjects(&glObjects, NULL, NULL);
if(errCode != CL_SUCCESS) {
std::cerr << "Error unlocking texture: " << errCode << std::endl;
return errCode;
} <<------ Here's where segfault occurs, can't get past this point
カーネル関数のデフ。
カーネルでテクスチャへの書き込み__kernel void RadianceGPU (
__write_only image2d_t texture,
other_stuff...)
write_imagef(
texture,
(int2)(x, height-y-1),
(float4)(
clamp(framebuffer[id].x, 0.0f, 1.0f),
clamp(framebuffer[id].y, 0.0f, 1.0f),
clamp(framebuffer[id].z, 0.0f, 1.0f),
1.0f) * 1.0f);
興味深いwrite_imagefは()UNSIGNED_BYTEされたテクスチャにもかかわらず動作することです。
編集: 最後に、問題の原因を突き止めました。 CLプロパティの作成中に間違った表示を設定していました。私はGLFWのウィンドウをペーストしました。これはNVIDIAドライバに問題を引き起こします。 glxGetCurrentDisplayまたはglfwGetX11Displayを使用する必要があります。これにより、segfaultが修正されます。
のOpenCLのどのバージョンを使用していますか? – Andreas
Nvidia CUDA 1.2 – Nixx