Fixed order of operations problem when tearing down the window
Make sure the window framebuffer is cleaned up before shutting down OpenGL, as it might be implemented using an OpenGL texture. Fixes this call stack: ``` (gdb) p _this $1 = (SDL_VideoDevice *) 0x42e360 (gdb) p _this->egl_data $2 = (struct SDL_EGL_VideoData *) 0x0 ```main
parent
b678a98024
commit
d305bc6d55
|
@ -1876,6 +1876,13 @@ int SDL_RecreateWindow(SDL_Window *window, Uint32 flags)
|
||||||
window->surface_valid = SDL_FALSE;
|
window->surface_valid = SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_this->checked_texture_framebuffer) { /* never checked? No framebuffer to destroy. Don't risk calling the wrong implementation. */
|
||||||
|
if (_this->DestroyWindowFramebuffer) {
|
||||||
|
_this->DestroyWindowFramebuffer(_this, window);
|
||||||
|
}
|
||||||
|
_this->checked_texture_framebuffer = SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if ((window->flags & SDL_WINDOW_OPENGL) != (flags & SDL_WINDOW_OPENGL)) {
|
if ((window->flags & SDL_WINDOW_OPENGL) != (flags & SDL_WINDOW_OPENGL)) {
|
||||||
if (flags & SDL_WINDOW_OPENGL) {
|
if (flags & SDL_WINDOW_OPENGL) {
|
||||||
need_gl_load = SDL_TRUE;
|
need_gl_load = SDL_TRUE;
|
||||||
|
@ -1906,12 +1913,6 @@ int SDL_RecreateWindow(SDL_Window *window, Uint32 flags)
|
||||||
SDL_Vulkan_UnloadLibrary();
|
SDL_Vulkan_UnloadLibrary();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_this->checked_texture_framebuffer) { /* never checked? No framebuffer to destroy. Don't risk calling the wrong implementation. */
|
|
||||||
if (_this->DestroyWindowFramebuffer) {
|
|
||||||
_this->DestroyWindowFramebuffer(_this, window);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_this->DestroyWindow && !(flags & SDL_WINDOW_FOREIGN)) {
|
if (_this->DestroyWindow && !(flags & SDL_WINDOW_FOREIGN)) {
|
||||||
_this->DestroyWindow(_this, window);
|
_this->DestroyWindow(_this, window);
|
||||||
}
|
}
|
||||||
|
@ -3084,30 +3085,32 @@ void SDL_DestroyWindow(SDL_Window *window)
|
||||||
SDL_SetMouseFocus(NULL);
|
SDL_SetMouseFocus(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make no context current if this is the current context window. */
|
|
||||||
if (window->flags & SDL_WINDOW_OPENGL) {
|
|
||||||
if (_this->current_glwin == window) {
|
|
||||||
SDL_GL_MakeCurrent(window, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window->surface) {
|
if (window->surface) {
|
||||||
window->surface->flags &= ~SDL_DONTFREE;
|
window->surface->flags &= ~SDL_DONTFREE;
|
||||||
SDL_FreeSurface(window->surface);
|
SDL_FreeSurface(window->surface);
|
||||||
window->surface = NULL;
|
window->surface = NULL;
|
||||||
window->surface_valid = SDL_FALSE;
|
window->surface_valid = SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_this->checked_texture_framebuffer) { /* never checked? No framebuffer to destroy. Don't risk calling the wrong implementation. */
|
||||||
|
if (_this->DestroyWindowFramebuffer) {
|
||||||
|
_this->DestroyWindowFramebuffer(_this, window);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make no context current if this is the current context window. */
|
||||||
|
if (window->flags & SDL_WINDOW_OPENGL) {
|
||||||
|
if (_this->current_glwin == window) {
|
||||||
|
SDL_GL_MakeCurrent(window, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (window->flags & SDL_WINDOW_OPENGL) {
|
if (window->flags & SDL_WINDOW_OPENGL) {
|
||||||
SDL_GL_UnloadLibrary();
|
SDL_GL_UnloadLibrary();
|
||||||
}
|
}
|
||||||
if (window->flags & SDL_WINDOW_VULKAN) {
|
if (window->flags & SDL_WINDOW_VULKAN) {
|
||||||
SDL_Vulkan_UnloadLibrary();
|
SDL_Vulkan_UnloadLibrary();
|
||||||
}
|
}
|
||||||
if (_this->checked_texture_framebuffer) { /* never checked? No framebuffer to destroy. Don't risk calling the wrong implementation. */
|
|
||||||
if (_this->DestroyWindowFramebuffer) {
|
|
||||||
_this->DestroyWindowFramebuffer(_this, window);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (_this->DestroyWindow) {
|
if (_this->DestroyWindow) {
|
||||||
_this->DestroyWindow(_this, window);
|
_this->DestroyWindow(_this, window);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue