воссоздать eglCreateWindowSurface с тем же родным окном - PullRequest
0 голосов
/ 28 января 2019

Я написал библиотеку с использованием API EGL.Эта библиотека имеет функции 'init' и 'deinit'.В функции 'init' идентификатор собственного окна, переданный пользователем, с использованием этого собственного идентификатора окна создается eglCreateWindowSurface.В функции 'deinit' поверхность уничтожается с помощью eglDestroySurface.

Теперь пользователь снова вызывает функцию init для создания другого eglCreateWindowSurface, но он передал тот же идентификатор окна, что и раньше (так как он не закрыл свое окно), здесь eglCreateWindowSurfaceошибка EGL_BAD_ALLOC.

Я читаю спецификации EGL

Если EGLSurface уже связан с win (в результате предыдущего вызова eglCreateWindowSurface), то генерируется ошибка EGL_BAD_ALLOC

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

Эта проблема может возникнуть при повторном использовании xserverранее закрытое окно идентификатора?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Ваш EGLSurface не может быть уничтожен даже после eglDestroySurface или eglTerminate.Вы, вероятно, назвали eglMakeCurrent( display, surface... context) - это связывает вашу поверхность со стандартным кадровым буфером контекста GL.Вам нужно открепить, чтобы поверхность действительно удалялась.Вызов eglMakeCurrent(display, EGL_NO_SURFACE... EGL_NO_CONTEXT) - это приводит к тому, что активный поток освобождает контекст и поверхность (и).Теперь вы обнаружите, что EGL забыл / удалил поверхность, и вы можете повторно использовать идентификатор окна.eglReleaseThread должен сделать то же самое.

eglMakeCurrent (display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);откроет вашу поверхность и позволит удалить ее, это не является немедленным, например, eglMakeCurrent вызовет glFlush в этом контексте.Таким образом, может потребоваться немного времени, чтобы завершить розыгрыши, которые вы вызвали, и преобразовать изображение в буфер.В противном случае графический процессор может дать сбой.Вызовите glFinish () перед eglMakeCurrent, чтобы обеспечить завершение, или создайте забор и дождитесь его.Не имеет значения, если вы вызываете eglDeleteSurface до или после eglMakeCurrent (... EGL_NO_SURFACE ...), но все команды gl должны выполняться до eglMakeCurrent (... EGL_NO_SURFACE ..., EGL_NO_CONTEXT).Поскольку это не делает контекст текущим, и команды gl не будут выполняться без текущего контекста.

Вы можете попробовать вызвать eglGetCurrentContext и eglGetCurrentSurface, чтобы проверить, существует ли еще поверхность - вы получите дескриптор, а не EGL_NO_SURFACE.Но дескриптор поверхности определенно бесполезен после eglDeleteSurface.См. Спецификацию EGL 1.5, раздел 3.7.4, но, как я сказал выше, он существует только потому, что связан с текущим контекстом.Смотрите раздел 3.7.3

0 голосов
/ 29 января 2019

Вернул ли eglDestroySurface значение EGL_TRUE?

Если нет, уничтожение может быть неудачным.

Обратите внимание, что EGL_BAD_ALLOC также может быть сгенерирован , если не хватает ресурсов длявыделить новую поверхность.

...