2015-03-26 5 views
1

Я написал программу, которая создает окно на WINCE и использует EGL для создания поверхности и контекста рисования. Когда эта программа завершает работу, у меня есть следующие очистки рутина:Правильное удаление EGL Opengles 2.0

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, которая не удаляется должным образом каждый раз, когда программа выходит, но не знает, что это может быть. Какие-либо предложения?

+0

Правильная реализация должна очистить все ресурсы, связанные с OpenGL, когда программа выйдет. Как вы говорите, вы тоже разрушаете поверхность? Возможно, стоит попробовать, если вы этого уже не делаете. Кроме того, указанная выше последовательность недействительна. Вызов 'glDelete *()' необходимо сделать, если у вас все еще есть действующий текущий контекст. –

+0

@RetoKoradi благодарит за советы. Я просмотрел чит-листы как для EGL, так и для Opengles 2.0 и внесены изменения в код для включения в деконструктор: 'glDeleteProgram (m_eglProgramObject); glReleaseShaderCompiler(); eglTerminate (m_eglDisplay); eglMakeCurrent (m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglDestroySurface (m_eglDisplay, m_eglSurface); eglDestroyContext (m_eglDisplay, m_eglContext); eglReleaseThread(); ' – CodingNinja

+0

Но тот же результат случается. В конце концов, для EGL есть плохое выделение памяти:/Можете ли вы быть достаточно любезными, чтобы указать, какова должна быть правильная последовательность вызовов glDelete? – CodingNinja

ответ

2

Чтобы правильно освободить ресурсы EGL и OpenGL 2.0, вам необходимо выполнить следующие действия;

glDeleteProgram(m_eglProgramObject); 

Удалить любые другие созданные ресурсы GL. Например, текстуры, фреймбуфер, вертексбуфер, пиксельные буферы и т. Д.

После этого вам нужно выполнить eglmakecurrent с нулевыми поверхностями и контекстом. Это будет де-ассоциировать EGLContext с текущим потоком (TLS)

eglMakeCurrent(m_eglDisplay,EGL_NO_SURFACE,EGL_NO_SURFACE, EGL_NO_CONTEXT); 

После этого вы должны освободить всех EGLResources созданных:

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

В конце концов сделать eglTerminate:

eglTerminate(m_eglDisplay); 

Если вы также создали какой-либо объект окна платформы, например XDisplay для X11, wl_display для Wayland или AWindow для Android. Вы также должны удалить/уничтожить.

Надеюсь, это поможет.

+0

Спасибо за предложения! Подумайте об этом Я не освобождаю контекст устройства, когда я создаю окно. Попробуй. – CodingNinja