glClear перед XMapWindow (предотвратить неопределенный графический буфер) - PullRequest
0 голосов
/ 22 марта 2020

Я изо всех сил пытаюсь справиться со случаем, когда после XMapWindow с glX буфер не определен, и поэтому буфер glx будет показывать неопределенные данные до того, как будут нарисованы первые glXSwapBuffers.

Я смутно помню, что операции gl были бессмысленно до glXMakeCurrent, а glXMakeCurrent бессмысленно до XMapWindow. В соответствии с этими ограничениями, как управлять тем, что будет отображаться в окне X11 GLX, когда оно отображается?

Похоже, я бы хотел написать порядок так, но я все еще получаю неопределенные данные (это vga driver Speci c проблема, которую я должен просто игнорировать?)

glXMakeCurrent(d, w, ctx);

glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glXSwapBuffers(d, w);

XMapWindow(d, w);

1 Ответ

0 голосов
/ 24 марта 2020

Глядя на справочный пример Khronos , такое поведение происходит в их примере.

С помощью небольшого патча мы можем каждый раз запускать неопределенное поведение.

--- OpenGL 3.0 Context Creation (GLX).orig.cc   2020-03-23 22:32:41.421765953 -0700
+++ OpenGL 3.0 Context Creation (GLX).edit.cc   2020-03-23 22:32:46.113753021 -0700
@@ -163,6 +163,8 @@

   printf( "Mapping window\n" );
   XMapWindow( display, win );
+  XSync( display, win );
+  sleep(2);

   // Get the default screen's GLX extension list
   const char *glxExts = glXQueryExtensionsString( display,

Похоже, что между XMapWindow и glx ini для glXSwapBuffers существует просто условие гонки по факту; Лучшее, что можно сделать, это убедиться, что ваш первый кадр поменялся местами как можно скорее, и надеяться, что вы обычно бьете Х до удара.

...