正确删除EGL Opengles 2.0

Deleting EGL Opengles 2.0 properly

本文关键字:Opengles EGL 删除      更新时间:2023-10-16

我编写了一个程序,在WINCE上创建一个窗口,并使用EGL创建绘图表面和上下文。当这个程序退出时,我有以下清理程序:

eglMakeCurrent(m_eglDisplay,EGL_NO_SURFACE,EGL_NO_SURFACE,m_eglContext);
eglDestroyContext(m_eglDisplay,m_eglContext);       
glDeleteProgram(m_eglProgramObject);
glReleaseShaderCompiler();
delete m_eglDisplay;
delete m_eglSurface;
delete m_eglContext;
delete m_eglConfig;

如果我不重新启动目标系统,最终这个程序的打开和关闭会导致以下行失败:

m_eglContext = eglCreateContext(m_eglDisplay,m_eglConfig,EGL_NO_CONTEXT,arrContextAttrib);

EGL错误12291,这显然意味着EGL_BAD_ALLOC。我认为有一些与EGL相关的内存没有在每次程序退出时正确删除,但不知道这可能是什么。有什么建议吗?

要正确释放EGL和OpenGL 2.0资源,您必须执行以下操作;

glDeleteProgram(m_eglProgramObject);

删除创建的任何其他总账资源。例如纹理、帧缓冲区、顶点缓冲区、像素缓冲区等

在此之后,您必须使用null曲面和上下文执行eglmakecurrent。这将取消您的EGLContext与当前线程(TLS)的关联

eglMakeCurrent(m_eglDisplay,EGL_NO_SURFACE,EGL_NO_SURFACE, EGL_NO_CONTEXT );

在此之后,您必须释放所有创建的EGL资源:

eglDestroySurface(m_eglDisplay,m_eglSurface); 
eglDestroyContext(m_eglDisplay,m_eglContext); 

最后执行eglTerminate:

eglTerminate(m_eglDisplay);

如果您还创建了任何平台窗口对象,例如X11的XDisplay、Wayland的wl_display或Android的AWindow。你也必须删除/销毁它。

我希望它能有所帮助。