Opengl glFinish永远挂在clenqueurereaseglobjects之后

Opengl glFinish永远挂在clenqueurereaseglobjects之后,opengl,opencl,nvidia,Opengl,Opencl,Nvidia,以下代码在Nvidia驱动程序361.91(及更早版本)下运行良好(Windows 7,Nvidia GTX 750 Ti),但在更新版本(如364.72和368.69)下挂起。现在glFinish仅在调用了clEnqueueReleaseGLObjects之后才阻止程序的执行。在责怪驱动程序之前,我怀疑我的OpenCL/OpenGL互操作方式有问题,因此下面是一个小的完整程序的代码,它再现了问题,问题就在最后: #包括 #包括 #包括 #包括 #包括 #包括 #包括 #pragma注释(lib

以下代码在Nvidia驱动程序361.91(及更早版本)下运行良好(Windows 7,Nvidia GTX 750 Ti),但在更新版本(如364.72和368.69)下挂起。现在glFinish仅在调用了clEnqueueReleaseGLObjects之后才阻止程序的执行。在责怪驱动程序之前,我怀疑我的OpenCL/OpenGL互操作方式有问题,因此下面是一个小的完整程序的代码,它再现了问题,问题就在最后:

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“C:\\Program Files\\NVIDIA GPU计算工具包\\CUDA\\v7.5\\lib\\x64\\OpenCL.lib”)
#包括
#包括
cl_int init_cl_context(cl_context*context,cl_command_queue*command_queue)
{
cl_int i,ret,pf_指数=-1;
cl_平台_id平台_id[16];
cl_设备_id设备_id[16];
cl_uint ret_num_平台;
氯离子交换装置;
ret=clGetPlatformIDs(sizeof(platform\u id)/sizeof(*platform\u id)、platform\u id和ret\u num\u platforms);//获取所有平台
for(i=0;i 0)//找到合适的设备后停止尝试平台
{
pf_指数=i;
打破
}
}
cl_context_properties properties[]={cl_glu context_KHR,(cl_context_properties)wglGetCurrentContext(),cl_WGL_HDC_KHR,(cl_context_properties)wglGetCurrentDC(),cl_context_PLATFORM,(cl_context_properties)PLATFORM_id[pf_index],0};
*context=clCreateContextFromType(属性、CL\U设备类型\U GPU、NULL、NULL和ret);
*命令队列=clCreateCommandQueue(*上下文,设备id[0],0*CL\U队列超出顺序,执行模式启用,0*CL\U队列分析启用,&ret);
返回ret;
}
int main(int argc,char*argv[])
{
cl_int ret=0;
int w=800,h=600;
SDL_窗口*窗口;
SDL_渲染器*渲染器;
语境;
cl_命令_队列命令_队列;
cl_mem cltex;//指向GL纹理的image_2d_t类型的cl缓冲区
uint32\u t gltex;//cltex的GL纹理的ID
//****初始化SDL,OpenGL/glew****
SDL_Init(SDL_Init_计时器| SDL_Init_视频| SDL_Init_音频);
window=SDL_CreateWindow(“标题”,SDL_WINDOWPOS_未定义,SDL_WINDOWPOS_未定义,w,h,SDL_window_OPENGL);
SDL_getWindowsSize(窗口、w和h);
SDL_GL_CreateContext(窗口);
glewExperimental=1;
glewInit();
renderer=SDL\u CreateRenderer(窗口,-1,0*SDL\u renderer\u PRESENTVSYNC);
//-------------------------------
ret=init_cl_context(&context,&command_queue);//初始化cl上下文以匹配GL,从而实现互操作
//正常创建OpenGL 2D纹理
glEnable(GL_纹理_2D);
glGenTextures(1,&gltex);//生成纹理ID
glBindTexture(GL_TEXTURE_2D,gltex);//绑定纹理
glTexImage2D(GL_纹理_2D,0,GL_RGBA8,w,h,0,GL_RGBA,GL_无符号_字节,0);//指定纹理尺寸、格式等
cltex=clCreateFromGLTexture(上下文、CL_MEM_WRITE_ONLY、GL_TEXTURE_2D、0、gltex和&ret);//创建与纹理对应的OpenCL图像(一次)
ret=clFinish(命令队列);
//glFinish();//这很好用
ret=clEnqueueReleaseGLObjects(命令_queue,1,&cltex,0,0,NULL);//将所有权从CL释放回GL
clFinish(命令队列);
glFlush();
printf(“这将永远阻止执行:\n”);
glFinish();//这会阻止一切
printf(“这永远不会被打印\n”);
返回0;
}

在我的大得多的程序中(有完全相同的问题),在驱动程序更新之前,一切都运行得很好,现在甚至在更新之前编译的二进制文件也显示了上面演示的相同冻结。为了可读性,我删除了对返回代码的检查,但无论是在这个小程序中还是在它的大程序中,都没有报告任何问题。我看不出我在做什么明显的错误…

显然,我的问题来自于向后做事情,因为我试图在排队做事情之前从上一帧中得到结果


如果在第一帧中,我跳过该部分,直接进入第一个任务排队,那么它将不再阻塞。

作为旁注,从技术上讲,glFinish不会返回,除非之前调用了glFlush,以保证在“有限时间”内执行。只有少数供应商是假惺惺的,不会对每一道漆面都进行暗中冲洗。错误的代码可能从此过上幸福的生活……我终于再次尝试了最新的驱动程序并添加了glFlush(),但遗憾的是它仍然挂起。