Commit 7cfdd8ef authored by Sam Lantinga's avatar Sam Lantinga

I think this fixes bug #261

Make sure that you don't use a wgl function after the context is deleted.

--HG--
branch : SDL-1.2
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/branches/SDL-1.2%402476
parent 35308146
...@@ -109,15 +109,16 @@ static int ExtensionSupported(const char *extension, const char *extensions) ...@@ -109,15 +109,16 @@ static int ExtensionSupported(const char *extension, const char *extensions)
return 0; return 0;
} }
static void Init_WGL_ARB_extensions(_THIS) static int ChoosePixelFormatARB(_THIS, const int *iAttribs, const FLOAT *fAttribs)
{ {
HWND hwnd; HWND hwnd;
HDC hdc; HDC hdc;
HGLRC hglrc; HGLRC hglrc;
int pformat;
const char * (WINAPI *wglGetExtensionsStringARB)(HDC) = 0; const char * (WINAPI *wglGetExtensionsStringARB)(HDC) = 0;
const char *extensions; const char *extensions;
int pformat = 0;
UINT matches = 0;
hwnd = CreateWindow(SDL_Appname, SDL_Appname, WS_POPUP | WS_DISABLED, hwnd = CreateWindow(SDL_Appname, SDL_Appname, WS_POPUP | WS_DISABLED,
0, 0, 10, 10, 0, 0, 10, 10,
NULL, NULL, SDL_Instance, NULL); NULL, NULL, SDL_Instance, NULL);
...@@ -125,8 +126,7 @@ static void Init_WGL_ARB_extensions(_THIS) ...@@ -125,8 +126,7 @@ static void Init_WGL_ARB_extensions(_THIS)
hdc = GetDC(hwnd); hdc = GetDC(hwnd);
pformat = ChoosePixelFormat(hdc, &GL_pfd); SetPixelFormat(hdc, ChoosePixelFormat(hdc, &GL_pfd), &GL_pfd);
SetPixelFormat(hdc, pformat, &GL_pfd);
hglrc = this->gl_data->wglCreateContext(hdc); hglrc = this->gl_data->wglCreateContext(hdc);
if ( hglrc ) { if ( hglrc ) {
...@@ -144,15 +144,12 @@ static void Init_WGL_ARB_extensions(_THIS) ...@@ -144,15 +144,12 @@ static void Init_WGL_ARB_extensions(_THIS)
this->gl_data->WGL_ARB_pixel_format = 0; this->gl_data->WGL_ARB_pixel_format = 0;
if( ExtensionSupported("WGL_ARB_pixel_format", extensions) ) { if( ExtensionSupported("WGL_ARB_pixel_format", extensions) ) {
this->gl_data->wglChoosePixelFormatARB = BOOL (WINAPI *wglChoosePixelFormatARB)(HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
wglChoosePixelFormatARB =
(BOOL (WINAPI *)(HDC, const int *, const FLOAT *, UINT, int *, UINT *)) (BOOL (WINAPI *)(HDC, const int *, const FLOAT *, UINT, int *, UINT *))
this->gl_data->wglGetProcAddress("wglChoosePixelFormatARB"); this->gl_data->wglGetProcAddress("wglChoosePixelFormatARB");
this->gl_data->wglGetPixelFormatAttribivARB = if( wglChoosePixelFormatARB &&
(BOOL (WINAPI *)(HDC, int, int, UINT, const int *, int *)) wglChoosePixelFormatARB(hdc, iAttribs, fAttribs, 1, &pformat, &matches) && pformat ) {
this->gl_data->wglGetProcAddress("wglGetPixelFormatAttribivARB");
if( (this->gl_data->wglChoosePixelFormatARB != NULL) &&
(this->gl_data->wglGetPixelFormatAttribivARB != NULL) ) {
this->gl_data->WGL_ARB_pixel_format = 1; this->gl_data->WGL_ARB_pixel_format = 1;
} }
} }
...@@ -164,6 +161,8 @@ static void Init_WGL_ARB_extensions(_THIS) ...@@ -164,6 +161,8 @@ static void Init_WGL_ARB_extensions(_THIS)
ReleaseDC(hwnd, hdc); ReleaseDC(hwnd, hdc);
DestroyWindow(hwnd); DestroyWindow(hwnd);
WIN_FlushMessageQueue(); WIN_FlushMessageQueue();
return pformat;
} }
#endif /* SDL_VIDEO_OPENGL */ #endif /* SDL_VIDEO_OPENGL */
...@@ -188,122 +187,117 @@ int WIN_GL_SetupWindow(_THIS) ...@@ -188,122 +187,117 @@ int WIN_GL_SetupWindow(_THIS)
} }
} }
for ( i=0; ; ++i ) { /* Set up the pixel format descriptor with our needed format */
/* Get the window device context for our OpenGL drawing */ SDL_memset(&GL_pfd, 0, sizeof(GL_pfd));
GL_hdc = GetDC(SDL_Window); GL_pfd.nSize = sizeof(GL_pfd);
if ( GL_hdc == NULL ) { GL_pfd.nVersion = 1;
SDL_SetError("Unable to get DC for SDL_Window"); GL_pfd.dwFlags = (PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL);
return(-1); if ( this->gl_config.double_buffer ) {
} GL_pfd.dwFlags |= PFD_DOUBLEBUFFER;
}
if ( this->gl_config.stereo ) {
GL_pfd.dwFlags |= PFD_STEREO;
}
GL_pfd.iPixelType = PFD_TYPE_RGBA;
GL_pfd.cColorBits = this->gl_config.buffer_size;
GL_pfd.cRedBits = this->gl_config.red_size;
GL_pfd.cGreenBits = this->gl_config.green_size;
GL_pfd.cBlueBits = this->gl_config.blue_size;
GL_pfd.cAlphaBits = this->gl_config.alpha_size;
GL_pfd.cAccumRedBits = this->gl_config.accum_red_size;
GL_pfd.cAccumGreenBits = this->gl_config.accum_green_size;
GL_pfd.cAccumBlueBits = this->gl_config.accum_blue_size;
GL_pfd.cAccumAlphaBits = this->gl_config.accum_alpha_size;
GL_pfd.cAccumBits =
(GL_pfd.cAccumRedBits + GL_pfd.cAccumGreenBits +
GL_pfd.cAccumBlueBits + GL_pfd.cAccumAlphaBits);
GL_pfd.cDepthBits = this->gl_config.depth_size;
GL_pfd.cStencilBits = this->gl_config.stencil_size;
/* setup WGL_ARB_pixel_format attribs */
iAttr = &iAttribs[0];
*iAttr++ = WGL_DRAW_TO_WINDOW_ARB;
*iAttr++ = GL_TRUE;
*iAttr++ = WGL_ACCELERATION_ARB;
*iAttr++ = WGL_FULL_ACCELERATION_ARB;
*iAttr++ = WGL_RED_BITS_ARB;
*iAttr++ = this->gl_config.red_size;
*iAttr++ = WGL_GREEN_BITS_ARB;
*iAttr++ = this->gl_config.green_size;
*iAttr++ = WGL_BLUE_BITS_ARB;
*iAttr++ = this->gl_config.blue_size;
if ( this->gl_config.alpha_size ) {
*iAttr++ = WGL_ALPHA_BITS_ARB;
*iAttr++ = this->gl_config.alpha_size;
}
/* Set up the pixel format descriptor with our needed format */ *iAttr++ = WGL_DOUBLE_BUFFER_ARB;
SDL_memset(&GL_pfd, 0, sizeof(GL_pfd)); *iAttr++ = this->gl_config.double_buffer;
GL_pfd.nSize = sizeof(GL_pfd);
GL_pfd.nVersion = 1;
GL_pfd.dwFlags = (PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL);
if ( this->gl_config.double_buffer ) {
GL_pfd.dwFlags |= PFD_DOUBLEBUFFER;
}
if ( this->gl_config.stereo ) {
GL_pfd.dwFlags |= PFD_STEREO;
}
GL_pfd.iPixelType = PFD_TYPE_RGBA;
GL_pfd.cColorBits = this->gl_config.buffer_size;
GL_pfd.cRedBits = this->gl_config.red_size;
GL_pfd.cGreenBits = this->gl_config.green_size;
GL_pfd.cBlueBits = this->gl_config.blue_size;
GL_pfd.cAlphaBits = this->gl_config.alpha_size;
GL_pfd.cAccumRedBits = this->gl_config.accum_red_size;
GL_pfd.cAccumGreenBits = this->gl_config.accum_green_size;
GL_pfd.cAccumBlueBits = this->gl_config.accum_blue_size;
GL_pfd.cAccumAlphaBits = this->gl_config.accum_alpha_size;
GL_pfd.cAccumBits =
(GL_pfd.cAccumRedBits + GL_pfd.cAccumGreenBits +
GL_pfd.cAccumBlueBits + GL_pfd.cAccumAlphaBits);
GL_pfd.cDepthBits = this->gl_config.depth_size;
GL_pfd.cStencilBits = this->gl_config.stencil_size;
/* initialize WGL_ARB_pixel_format */
Init_WGL_ARB_extensions(this);
/* setup WGL_ARB_pixel_format attribs */
iAttr = &iAttribs[0];
*iAttr++ = WGL_DRAW_TO_WINDOW_ARB;
*iAttr++ = GL_TRUE;
*iAttr++ = WGL_ACCELERATION_ARB;
*iAttr++ = WGL_FULL_ACCELERATION_ARB;
*iAttr++ = WGL_RED_BITS_ARB;
*iAttr++ = this->gl_config.red_size;
*iAttr++ = WGL_GREEN_BITS_ARB;
*iAttr++ = this->gl_config.green_size;
*iAttr++ = WGL_BLUE_BITS_ARB;
*iAttr++ = this->gl_config.blue_size;
if ( this->gl_config.alpha_size ) {
*iAttr++ = WGL_ALPHA_BITS_ARB;
*iAttr++ = this->gl_config.alpha_size;
}
*iAttr++ = WGL_DOUBLE_BUFFER_ARB; *iAttr++ = WGL_DEPTH_BITS_ARB;
*iAttr++ = this->gl_config.double_buffer; *iAttr++ = this->gl_config.depth_size;
*iAttr++ = WGL_DEPTH_BITS_ARB; if ( this->gl_config.stencil_size ) {
*iAttr++ = this->gl_config.depth_size; *iAttr++ = WGL_STENCIL_BITS_ARB;
*iAttr++ = this->gl_config.stencil_size;
}
if ( this->gl_config.stencil_size ) { if ( this->gl_config.accum_red_size ) {
*iAttr++ = WGL_STENCIL_BITS_ARB; *iAttr++ = WGL_ACCUM_RED_BITS_ARB;
*iAttr++ = this->gl_config.stencil_size; *iAttr++ = this->gl_config.accum_red_size;
} }
if ( this->gl_config.accum_red_size ) { if ( this->gl_config.accum_green_size ) {
*iAttr++ = WGL_ACCUM_RED_BITS_ARB; *iAttr++ = WGL_ACCUM_GREEN_BITS_ARB;
*iAttr++ = this->gl_config.accum_red_size; *iAttr++ = this->gl_config.accum_green_size;
} }
if ( this->gl_config.accum_green_size ) { if ( this->gl_config.accum_blue_size ) {
*iAttr++ = WGL_ACCUM_GREEN_BITS_ARB; *iAttr++ = WGL_ACCUM_BLUE_BITS_ARB;
*iAttr++ = this->gl_config.accum_green_size; *iAttr++ = this->gl_config.accum_blue_size;
} }
if ( this->gl_config.accum_blue_size ) { if ( this->gl_config.accum_alpha_size ) {
*iAttr++ = WGL_ACCUM_BLUE_BITS_ARB; *iAttr++ = WGL_ACCUM_ALPHA_BITS_ARB;
*iAttr++ = this->gl_config.accum_blue_size; *iAttr++ = this->gl_config.accum_alpha_size;
} }
if ( this->gl_config.accum_alpha_size ) { if ( this->gl_config.stereo ) {
*iAttr++ = WGL_ACCUM_ALPHA_BITS_ARB; *iAttr++ = WGL_STEREO_ARB;
*iAttr++ = this->gl_config.accum_alpha_size; *iAttr++ = GL_TRUE;
} }
if ( this->gl_config.stereo ) { if ( this->gl_config.multisamplebuffers ) {
*iAttr++ = WGL_STEREO_ARB; *iAttr++ = WGL_SAMPLE_BUFFERS_ARB;
*iAttr++ = GL_TRUE; *iAttr++ = this->gl_config.multisamplebuffers;
} }
if ( this->gl_config.multisamplebuffers ) { if ( this->gl_config.multisamplesamples ) {
*iAttr++ = WGL_SAMPLE_BUFFERS_ARB; *iAttr++ = WGL_SAMPLES_ARB;
*iAttr++ = this->gl_config.multisamplebuffers; *iAttr++ = this->gl_config.multisamplesamples;
} }
if ( this->gl_config.multisamplesamples ) { if ( this->gl_config.accelerated >= 0 ) {
*iAttr++ = WGL_SAMPLES_ARB; *iAttr++ = WGL_ACCELERATION_ARB;
*iAttr++ = this->gl_config.multisamplesamples; *iAttr++ = (this->gl_config.accelerated ? WGL_GENERIC_ACCELERATION_ARB : WGL_NO_ACCELERATION_ARB);
} }
if ( this->gl_config.accelerated >= 0 ) { *iAttr = 0;
*iAttr++ = WGL_ACCELERATION_ARB;
*iAttr++ = (this->gl_config.accelerated ? WGL_GENERIC_ACCELERATION_ARB : WGL_NO_ACCELERATION_ARB);
}
*iAttr = 0; for ( i=0; ; ++i ) {
/* Get the window device context for our OpenGL drawing */
GL_hdc = GetDC(SDL_Window);
if ( GL_hdc == NULL ) {
SDL_SetError("Unable to get DC for SDL_Window");
return(-1);
}
/* Choose and set the closest available pixel format */ /* Choose and set the closest available pixel format */
if ( !this->gl_data->WGL_ARB_pixel_format || pixel_format = ChoosePixelFormatARB(this, iAttribs, fAttribs);
!this->gl_data->wglChoosePixelFormatARB(GL_hdc, iAttribs, fAttribs, 1, &pixel_format, &matching) || if ( !pixel_format ) {
!matching ) {
pixel_format = ChoosePixelFormat(GL_hdc, &GL_pfd); pixel_format = ChoosePixelFormat(GL_hdc, &GL_pfd);
this->gl_data->WGL_ARB_pixel_format = 0;
} }
if ( !pixel_format ) { if ( !pixel_format ) {
SDL_SetError("No matching GL pixel format available"); SDL_SetError("No matching GL pixel format available");
...@@ -335,6 +329,15 @@ int WIN_GL_SetupWindow(_THIS) ...@@ -335,6 +329,15 @@ int WIN_GL_SetupWindow(_THIS)
} }
gl_active = 1; gl_active = 1;
/* Get the wglGetPixelFormatAttribivARB pointer for the context */
if ( this->gl_data->WGL_ARB_pixel_format ) {
this->gl_data->wglGetPixelFormatAttribivARB =
(BOOL (WINAPI *)(HDC, int, int, UINT, const int *, int *))
this->gl_data->wglGetProcAddress("wglGetPixelFormatAttribivARB");
} else {
this->gl_data->wglGetPixelFormatAttribivARB = NULL;
}
/* Vsync control under Windows. Checking glGetString here is /* Vsync control under Windows. Checking glGetString here is
* somewhat a documented and reliable hack - it was originally * somewhat a documented and reliable hack - it was originally
* as a feature added by mistake, but since so many people rely * as a feature added by mistake, but since so many people rely
...@@ -416,7 +419,7 @@ int WIN_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) ...@@ -416,7 +419,7 @@ int WIN_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value)
return -1; return -1;
} }
if ( this->gl_data->WGL_ARB_pixel_format ) { if ( this->gl_data->wglGetPixelFormatAttribivARB ) {
int wgl_attrib; int wgl_attrib;
switch(attrib) { switch(attrib) {
...@@ -566,7 +569,6 @@ void WIN_GL_UnloadLibrary(_THIS) ...@@ -566,7 +569,6 @@ void WIN_GL_UnloadLibrary(_THIS)
this->gl_data->wglCreateContext = NULL; this->gl_data->wglCreateContext = NULL;
this->gl_data->wglDeleteContext = NULL; this->gl_data->wglDeleteContext = NULL;
this->gl_data->wglMakeCurrent = NULL; this->gl_data->wglMakeCurrent = NULL;
this->gl_data->wglChoosePixelFormatARB = NULL;
this->gl_data->wglGetPixelFormatAttribivARB = NULL; this->gl_data->wglGetPixelFormatAttribivARB = NULL;
this->gl_data->wglSwapIntervalEXT = NULL; this->gl_data->wglSwapIntervalEXT = NULL;
this->gl_data->wglGetSwapIntervalEXT = NULL; this->gl_data->wglGetSwapIntervalEXT = NULL;
......
...@@ -44,10 +44,6 @@ struct SDL_PrivateGLData { ...@@ -44,10 +44,6 @@ struct SDL_PrivateGLData {
BOOL (WINAPI *wglMakeCurrent)(HDC hdc, HGLRC hglrc); BOOL (WINAPI *wglMakeCurrent)(HDC hdc, HGLRC hglrc);
BOOL (WINAPI *wglChoosePixelFormatARB)(HDC hdc, const int *piAttribIList,
const FLOAT *pfAttribFList,
UINT nMaxFormats, int *piFormats,
UINT *nNumFormats);
BOOL (WINAPI *wglGetPixelFormatAttribivARB)(HDC hdc, int iPixelFormat, BOOL (WINAPI *wglGetPixelFormatAttribivARB)(HDC hdc, int iPixelFormat,
int iLayerPlane, int iLayerPlane,
UINT nAttributes, UINT nAttributes,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment