From 16e9d328391db75cd2722b9303cb0f59613e7886 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 12 Mar 2008 22:01:48 +0000 Subject: [PATCH] Don't recreate the GL content in windib target if SDL_SetVideoMode() is being called in response to a window resize event...prevents loss of GL state and objects. --- src/video/windib/SDL_dibvideo.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/video/windib/SDL_dibvideo.c b/src/video/windib/SDL_dibvideo.c index f264891ac..d87ca9625 100644 --- a/src/video/windib/SDL_dibvideo.c +++ b/src/video/windib/SDL_dibvideo.c @@ -512,6 +512,36 @@ SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current, int x, y; Uint32 Rmask, Gmask, Bmask; + /* + * Special case for OpenGL windows...since the app needs to call + * SDL_SetVideoMode() in response to resize events to continue to + * function, but WGL handles the GL context details behind the scenes, + * there's no sense in tearing the context down just to rebuild it + * to what it already was...tearing it down sacrifices your GL state + * and uploaded textures. So if we're requesting the same video mode + * attributes and the width/height matches the physical window, just + * return immediately. + */ + if ( (SDL_Window != NULL) && + (current != NULL) && + (current->flags == flags) && + (current->format->BitsPerPixel == bpp) && + ((flags & SDL_FULLSCREEN) == 0) ) { /* probably not safe for fs */ + int curwidth, curheight; + RECT size; + + /* Get the current position of our window */ + GetClientRect(SDL_Window, &size); + + curwidth = (size.right - size.left); + curheight = (size.bottom - size.top); + if ((width == curwidth) && (height == curheight)) { + current->w = width; + current->h = height; + return current; /* we're already good to go. */ + } + } + prev_flags = current->flags; /* Clean up any GL context that may be hanging around */