Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ clEnqueueAcquireGLObjects上的资源不足_C++_Opengl_Opencl - Fatal编程技术网

C++ clEnqueueAcquireGLObjects上的资源不足

C++ clEnqueueAcquireGLObjects上的资源不足,c++,opengl,opencl,C++,Opengl,Opencl,重新排列一些OpenCL/GL互操作代码后,它停止工作,并在标题中给出了错误 我已经阅读了很多讨论这个问题的帖子,并将其归咎于(nvidia)驱动程序。但正如之前运行的代码一样,这不应该是我的问题 代码 正如我已经说过的,我有太多的代码来发布它。此外,到目前为止,我还无法在最少的示例中再现这种行为,因此我将用伪代码描述大部分程序,并从真实代码中摘录部分内容 我使用Qt,因此以下函数都是QGLWidget子类的成员: void initializeGL() { glewInit();

重新排列一些OpenCL/GL互操作代码后,它停止工作,并在标题中给出了错误

我已经阅读了很多讨论这个问题的帖子,并将其归咎于(nvidia)驱动程序。但正如之前运行的代码一样,这不应该是我的问题

代码

正如我已经说过的,我有太多的代码来发布它。此外,到目前为止,我还无法在最少的示例中再现这种行为,因此我将用伪代码描述大部分程序,并从真实代码中摘录部分内容

我使用Qt,因此以下函数都是QGLWidget子类的成员:

void initializeGL()
{
    glewInit();

    cl::Platform::get(&clPlatforms);
    cl_context_properties props[] = {
        CL_GL_CONTEXT_KHR, (cl_context_properties)glXGetCurrentContext(),
        CL_GLX_DISPLAY_KHR, (cl_context_properties)glXGetCurrentDisplay(),
        CL_CONTEXT_PLATFORM, (cl_context_properties)clPlatforms[0](),
        0
    };
    clContext = cl::Context(CL_DEVICE_TYPE_GPU, props, cl_notify, &err);
    std::vector<cl::Device> devices = clContext.getInfo<CL_CONTEXT_DEVICES>();
    clDevice = devices[0];
    clQueue = cl::CommandQueue(clContext, clDevice, 0, 0);
    clProgram = cl::Program(context, sources);
    clProgram.build();    
    clKernel = cl::Kernel(clProgram, "main");
    glGenBuffers(1, &vbo);
    glBindBuffers(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_DYNAMIC_DRAW);
    glBindBuffers(GL_ARRAY_BUFFER, 0);
    vboBuffer = cl::BufferGL(clContext, CL_MEM_READ_WRITE, vbo);
    clKernel.setArg(0, vboBuffer);
}

void paintGL()
{
    simulate();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //camera transformations ...
    glEnable(GL_VERTEX_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glVertexPointer(3, GL_FLOAT, sizeof(cl_float3), 0);
    glDrawElements(GL_TRIANGLES, 3 * numTriangles, GL_UNSIGNED_INT, triangleIdicesArray);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

void simulate()
{
    std::vector<cl::Memory> sharedObjects;
    sharedObjects.push_back(vboBuffer);
    clQueue.enqueueAcquireGLObjects(&sharedObjects); //this triggers the error
    clQueue.enqueNDRangKernel(clKernel, cl::NullRange, cl::NDRangle(numVertices), cl::NullRange);
    clQueue.enqueueReleaseGLObjects(&sharedObjects);
}
void initializeGL()
{
glewInit();
cl::Platform::get(&clPlatforms);
cl_上下文_属性道具[]={
CL_GL_CONTEXT_KHR,(CL_CONTEXT_属性)glXGetCurrentContext(),
CL_GLX_DISPLAY_KHR,(CL_context_属性)glXGetCurrentDisplay(),
CL_上下文_平台,(CL_上下文_属性)CL_平台[0](),
0
};
clContext=cl::Context(cl\u设备类型\u GPU、道具、cl\u通知和错误);
std::vector devices=clContext.getInfo();
clDevice=设备[0];
clQueue=cl::CommandQueue(clContext,clDevice,0,0);
clProgram=cl::程序(上下文、源);
clProgram.build();
clKernel=cl::Kernel(clProgram,“main”);
glGenBuffers(1,&vbo);
glBindBuffers(GL_数组_缓冲区,vbo);
glBufferData(GL\ U数组\ U缓冲区、缓冲区大小、缓冲区、GL\ U动态\ U绘图);
glbindbuffer(GL_数组_BUFFER,0);
vboBuffer=cl::BufferGL(clContext,cl\u MEM\u READ\u WRITE,vbo);
setArg(0,vboBuffer);
}
void paintGL()
{
模拟();
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//摄影机变换。。。
glEnable(GL_顶点_阵列);
glBindBuffer(GL_数组_BUFFER,vbo);
glvertexofinter(3,GL_浮动,sizeof(cl_浮动3),0);
gld元素(GL_三角形、3*numtriangle、GL_无符号INT、triangleIdicesArray);
glBindBuffer(GL_数组_BUFFER,0);
}
void模拟()
{
std::向量共享对象;
共享对象。推回(vboBuffer);
clQueue.EnqueueAcquireGlobObjects(&sharedObjects);//这会触发错误
enqueNDRangKernel(clKernel,cl::NullRange,cl::NDRangle(numVertices),cl::NullRange);
clQueue.EnqueueReleaseGlobObjects(&sharedObjects);
}

关于出现的问题的进一步调查(在备注部分):

在调用clEnqueueAcquireGLObjects之前,应用程序必须确保访问mem_对象中指定对象的任何挂起GL操作已完成。这可以通过在所有GL上下文上发出并等待glFinish命令的完成来实现,其中包含对这些对象的挂起引用

在acquire/release之前和之后在OpenCL命令队列上添加finish使我摆脱了这些错误


与其他错误一样,我发现错误代码有误导性,notify函数没有添加任何有价值的信息(它也这么说)。

我们能看到引发错误的代码吗?@GuntherFox:我可以给你,但它非常大(~10k行代码)。我还没有最起码的例子。此外,我只是想提出问题和(我的)解决方案,而不详细讨论我的代码,因为这似乎是一个常见的问题。(我必须承认,我只是把这篇文章贴在这里,以便在以后我再次遇到同一个问题并忘记了解决方法时找到它:)我以前有过这个错误。在我的例子(英特尔实现)中,问题是在调用clAcquireGLObjects之前必须将GL上下文设置为当前。(这是一个bug,CL规范没有提到这一点)。@sbabbi:只有当你使用多线程时才有必要这么做?你也可以加上这个作为答案,来创建一个可能原因的(检查)列表。@Nobody:“我还没有最简单的例子。”然后做一个。我们无法神奇地知道是什么导致了这个问题。