Ваш 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