glClientWaitSync导致窗口上的分段错误

时间:2012-09-17 06:50:52

标签: windows opengl synchronization

更具体地说,我有两个主题。

第一个:

ev_wait_vsync = CreateEvent(NULL, FALSE, FALSE, "wait_vsync");
...
printf("paint\n");
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
SetEvent(ev_wait_vsync);

第二个,由第一个创建:

WaitForSingleObject(ev_wait_vsync, INFINITE);
printf("start vsync\n");
glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, UINT64_MAX);
printf("end sync\n");

这会导致段错误。输出是:

paint
start vsync

所以问题在于glClientWaitSync,但为什么呢?

1 个答案:

答案 0 :(得分:1)

  

所以问题出在glClientWaitSync上,但为什么呢?

因为OpenGL上下文一次只能在一个线程中激活。多线程OpenGL操作是一件微妙的事情,应该尽可能避免。

在你的情况下,glClientWaitSync必须通过wglGetProcAddress获得,并且此函数产生的函数指针仅在上下文和线程中有效。检索函数指针时激活(这是WGL的警告,而不是OpenGL)。其他上下文,其他线程,你需要获得一个新的/不同的函数指针。此外,OpenGL同步对象仅适用于已从。

创建的上下文

旁注:GL_SYNC_FLUSH_COMMANDS_BIT 没有与V-Sync有关!当glReadPixelsglCopyTexImage2D出现时,它也可能发生,这会导致隐式刷新。