Commit 3a3a919d authored by Sam Lantinga's avatar Sam Lantinga

Merged useful fixes from 1.3 branch

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401318
parent 4c392943
...@@ -56,7 +56,7 @@ SDL_PROC_UNUSED(void,glColorMask,(GLboolean red, GLboolean green, GLboolean blue ...@@ -56,7 +56,7 @@ SDL_PROC_UNUSED(void,glColorMask,(GLboolean red, GLboolean green, GLboolean blue
SDL_PROC_UNUSED(void,glColorMaterial,(GLenum face, GLenum mode)) SDL_PROC_UNUSED(void,glColorMaterial,(GLenum face, GLenum mode))
SDL_PROC_UNUSED(void,glColorPointer,(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) SDL_PROC_UNUSED(void,glColorPointer,(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer))
SDL_PROC_UNUSED(void,glCopyPixels,(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)) SDL_PROC_UNUSED(void,glCopyPixels,(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type))
SDL_PROC(void,glCopyTexImage1D,(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border)) SDL_PROC_UNUSED(void,glCopyTexImage1D,(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border))
SDL_PROC_UNUSED(void,glCopyTexImage2D,(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)) SDL_PROC_UNUSED(void,glCopyTexImage2D,(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border))
SDL_PROC_UNUSED(void,glCopyTexSubImage1D,(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)) SDL_PROC_UNUSED(void,glCopyTexSubImage1D,(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width))
SDL_PROC_UNUSED(void,glCopyTexSubImage2D,(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)) SDL_PROC_UNUSED(void,glCopyTexSubImage2D,(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height))
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
slouken@libsdl.org slouken@libsdl.org
*/ */
#include <stdlib.h>
#include <string.h> #include <string.h>
/* WGL implementation of SDL OpenGL support */ /* WGL implementation of SDL OpenGL support */
...@@ -73,6 +74,41 @@ static int WIN_GL_ResetWindow(_THIS) ...@@ -73,6 +74,41 @@ static int WIN_GL_ResetWindow(_THIS)
} }
#ifdef HAVE_OPENGL #ifdef HAVE_OPENGL
static int ExtensionSupported(const char *extension, const char *extensions)
{
const char *start;
const char *where, *terminator;
/* Extension names should not have spaces. */
where = strchr(extension, ' ');
if ( where || *extension == '\0' )
return 0;
if ( ! extensions )
return 0;
/* It takes a bit of care to be fool-proof about parsing the
* OpenGL extensions string. Don't be fooled by sub-strings,
* etc. */
start = extensions;
for (;;)
{
where = strstr(start, extension);
if (!where) break;
terminator = where + strlen(extension);
if (where == start || *(where - 1) == ' ')
if (*terminator == ' ' || *terminator == '\0') return 1;
start = terminator;
}
return 0;
}
static void Init_WGL_ARB_extensions(_THIS) static void Init_WGL_ARB_extensions(_THIS)
{ {
HWND hwnd; HWND hwnd;
...@@ -80,10 +116,11 @@ static void Init_WGL_ARB_extensions(_THIS) ...@@ -80,10 +116,11 @@ static void Init_WGL_ARB_extensions(_THIS)
HGLRC hglrc; HGLRC hglrc;
int pformat; int pformat;
const char * (WINAPI *wglGetExtensionsStringARB)(HDC) = 0; const char * (WINAPI *wglGetExtensionsStringARB)(HDC) = 0;
const char *extensions;
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);
hdc = GetDC(hwnd); hdc = GetDC(hwnd);
pformat = ChoosePixelFormat(hdc, &GL_pfd); pformat = ChoosePixelFormat(hdc, &GL_pfd);
...@@ -97,7 +134,14 @@ static void Init_WGL_ARB_extensions(_THIS) ...@@ -97,7 +134,14 @@ static void Init_WGL_ARB_extensions(_THIS)
wglGetExtensionsStringARB = (const char * (WINAPI *)(HDC)) wglGetExtensionsStringARB = (const char * (WINAPI *)(HDC))
this->gl_data->wglGetProcAddress("wglGetExtensionsStringARB"); this->gl_data->wglGetProcAddress("wglGetExtensionsStringARB");
if(wglGetExtensionsStringARB && strstr(wglGetExtensionsStringARB(hdc),"WGL_ARB_pixel_format")) { if( wglGetExtensionsStringARB ) {
extensions = wglGetExtensionsStringARB(hdc);
} else {
extensions = NULL;
}
this->gl_data->WGL_ARB_pixel_format = 0;
if( ExtensionSupported("WGL_ARB_pixel_format", extensions) ) {
this->gl_data->wglChoosePixelFormatARB = this->gl_data->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");
...@@ -106,12 +150,9 @@ static void Init_WGL_ARB_extensions(_THIS) ...@@ -106,12 +150,9 @@ static void Init_WGL_ARB_extensions(_THIS)
this->gl_data->wglGetProcAddress("wglGetPixelFormatAttribivARB"); this->gl_data->wglGetProcAddress("wglGetPixelFormatAttribivARB");
if( (this->gl_data->wglChoosePixelFormatARB != NULL) && if( (this->gl_data->wglChoosePixelFormatARB != NULL) &&
(this->gl_data->wglGetPixelFormatAttribivARB != NULL) ) (this->gl_data->wglGetPixelFormatAttribivARB != NULL) ) {
this->gl_data->wgl_arb_pixel_format = 1; this->gl_data->WGL_ARB_pixel_format = 1;
else }
this->gl_data->wgl_arb_pixel_format = 0;
} else {
this->gl_data->wgl_arb_pixel_format = 0;
} }
if ( hglrc ) { if ( hglrc ) {
...@@ -121,7 +162,8 @@ static void Init_WGL_ARB_extensions(_THIS) ...@@ -121,7 +162,8 @@ static void Init_WGL_ARB_extensions(_THIS)
ReleaseDC(hwnd, hdc); ReleaseDC(hwnd, hdc);
DestroyWindow(hwnd); DestroyWindow(hwnd);
} }
#endif /* !HAVE_OPENGL */
#endif /* HAVE_OPENGL */
int WIN_GL_SetupWindow(_THIS) int WIN_GL_SetupWindow(_THIS)
{ {
...@@ -198,10 +240,8 @@ int WIN_GL_SetupWindow(_THIS) ...@@ -198,10 +240,8 @@ int WIN_GL_SetupWindow(_THIS)
*iAttr++ = this->gl_config.alpha_size; *iAttr++ = this->gl_config.alpha_size;
} }
if ( this->gl_config.double_buffer ) { *iAttr++ = WGL_DOUBLE_BUFFER_ARB;
*iAttr ++ = WGL_DOUBLE_BUFFER_ARB; *iAttr++ = this->gl_config.double_buffer;
*iAttr ++ = GL_TRUE;
}
*iAttr++ = WGL_DEPTH_BITS_ARB; *iAttr++ = WGL_DEPTH_BITS_ARB;
*iAttr++ = this->gl_config.depth_size; *iAttr++ = this->gl_config.depth_size;
...@@ -233,7 +273,7 @@ int WIN_GL_SetupWindow(_THIS) ...@@ -233,7 +273,7 @@ int WIN_GL_SetupWindow(_THIS)
if ( this->gl_config.stereo ) { if ( this->gl_config.stereo ) {
*iAttr++ = WGL_STEREO_ARB; *iAttr++ = WGL_STEREO_ARB;
*iAttr++ = this->gl_config.stereo; *iAttr++ = GL_TRUE;
} }
if ( this->gl_config.multisamplebuffers ) { if ( this->gl_config.multisamplebuffers ) {
...@@ -249,11 +289,11 @@ int WIN_GL_SetupWindow(_THIS) ...@@ -249,11 +289,11 @@ int WIN_GL_SetupWindow(_THIS)
*iAttr = 0; *iAttr = 0;
/* Choose and set the closest available pixel format */ /* Choose and set the closest available pixel format */
if ( !this->gl_data->wgl_arb_pixel_format || if ( !this->gl_data->WGL_ARB_pixel_format ||
!this->gl_data->wglChoosePixelFormatARB(GL_hdc, iAttribs, fAttribs, 1, &pixel_format, &matching) || !this->gl_data->wglChoosePixelFormatARB(GL_hdc, iAttribs, fAttribs, 1, &pixel_format, &matching) ||
!matching ) { !matching ) {
pixel_format = ChoosePixelFormat(GL_hdc, &GL_pfd); pixel_format = ChoosePixelFormat(GL_hdc, &GL_pfd);
this->gl_data->wgl_arb_pixel_format = 0; 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");
...@@ -331,7 +371,7 @@ int WIN_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) ...@@ -331,7 +371,7 @@ int WIN_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value)
{ {
int retval; int retval;
if ( this->gl_data->wgl_arb_pixel_format ) { if ( this->gl_data->WGL_ARB_pixel_format ) {
int wgl_attrib; int wgl_attrib;
switch(attrib) { switch(attrib) {
......
...@@ -33,7 +33,7 @@ struct SDL_PrivateGLData { ...@@ -33,7 +33,7 @@ struct SDL_PrivateGLData {
HDC GL_hdc; HDC GL_hdc;
HGLRC GL_hrc; HGLRC GL_hrc;
int pixel_format; int pixel_format;
int wgl_arb_pixel_format; int WGL_ARB_pixel_format;
void * (WINAPI *wglGetProcAddress)(const char *proc); void * (WINAPI *wglGetProcAddress)(const char *proc);
......
...@@ -44,7 +44,6 @@ ...@@ -44,7 +44,6 @@
#define GLX_SAMPLES_ARB 100001 #define GLX_SAMPLES_ARB 100001
#endif #endif
/* return the preferred visual to use for openGL graphics */
XVisualInfo *X11_GL_GetVisual(_THIS) XVisualInfo *X11_GL_GetVisual(_THIS)
{ {
#ifdef HAVE_OPENGL_X11 #ifdef HAVE_OPENGL_X11
...@@ -162,6 +161,9 @@ XVisualInfo *X11_GL_GetVisual(_THIS) ...@@ -162,6 +161,9 @@ XVisualInfo *X11_GL_GetVisual(_THIS)
SDL_SetError( "Couldn't find matching GLX visual"); SDL_SetError( "Couldn't find matching GLX visual");
return NULL; return NULL;
} }
/*
printf("Found GLX visual 0x%x\n", glx_visualinfo->visualid);
*/
return glx_visualinfo; return glx_visualinfo;
#else #else
SDL_SetError("X11 driver not configured with OpenGL"); SDL_SetError("X11 driver not configured with OpenGL");
...@@ -238,9 +240,6 @@ void X11_GL_Shutdown(_THIS) ...@@ -238,9 +240,6 @@ void X11_GL_Shutdown(_THIS)
if (glx_context != NULL) if (glx_context != NULL)
this->gl_data->glXDestroyContext(GFX_Display, glx_context); this->gl_data->glXDestroyContext(GFX_Display, glx_context);
if( this->gl_data->glXReleaseBuffersMESA ) {
this->gl_data->glXReleaseBuffersMESA(GFX_Display,SDL_Window);
}
glx_context = NULL; glx_context = NULL;
} }
gl_active = 0; gl_active = 0;
...@@ -249,39 +248,6 @@ void X11_GL_Shutdown(_THIS) ...@@ -249,39 +248,6 @@ void X11_GL_Shutdown(_THIS)
#ifdef HAVE_OPENGL_X11 #ifdef HAVE_OPENGL_X11
static int ExtensionSupported(const char *extension)
{
const GLubyte *extensions = NULL;
const GLubyte *start;
GLubyte *where, *terminator;
/* Extension names should not have spaces. */
where = (GLubyte *) strchr(extension, ' ');
if (where || *extension == '\0')
return 0;
extensions = current_video->glGetString(GL_EXTENSIONS);
/* It takes a bit of care to be fool-proof about parsing the
* OpenGL extensions string. Don't be fooled by sub-strings,
* etc. */
start = extensions;
for (;;)
{
where = (GLubyte *) strstr((const char *) start, extension);
if (!where) break;
terminator = where + strlen(extension);
if (where == start || *(where - 1) == ' ')
if (*terminator == ' ' || *terminator == '\0') return 1;
start = terminator;
}
return 0;
}
/* Make the current context active */ /* Make the current context active */
int X11_GL_MakeCurrent(_THIS) int X11_GL_MakeCurrent(_THIS)
{ {
...@@ -295,29 +261,6 @@ int X11_GL_MakeCurrent(_THIS) ...@@ -295,29 +261,6 @@ int X11_GL_MakeCurrent(_THIS)
} }
pXSync( GFX_Display, False ); pXSync( GFX_Display, False );
/*
* The context is now current, check for glXReleaseBuffersMESA()
* extension. If extension is _not_ supported, destroy the pointer
* (to make sure it will not be called in X11_GL_Shutdown() ).
*
* DRI/Mesa drivers include glXReleaseBuffersMESA() in the libGL.so,
* but there's no need to call it (is is only needed for some old
* non-DRI drivers).
*
* When using for example glew (http://glew.sf.net), dlsym() for
* glXReleaseBuffersMESA() returns the pointer from the glew library
* (namespace conflict).
*
* The glXReleaseBuffersMESA() pointer in the glew is NULL, if the
* driver doesn't support this extension. So blindly calling it will
* cause segfault with DRI/Mesa drivers!
*
*/
if ( ! ExtensionSupported("glXReleaseBuffersMESA") ) {
this->gl_data->glXReleaseBuffersMESA = NULL;
}
/* More Voodoo X server workarounds... Grr... */ /* More Voodoo X server workarounds... Grr... */
SDL_Lock_EventThread(); SDL_Lock_EventThread();
X11_CheckDGAMouse(this); X11_CheckDGAMouse(this);
...@@ -496,11 +439,7 @@ int X11_GL_LoadLibrary(_THIS, const char* path) ...@@ -496,11 +439,7 @@ int X11_GL_LoadLibrary(_THIS, const char* path)
this->gl_data->glXQueryExtensionsString = this->gl_data->glXQueryExtensionsString =
(const char *(*)(Display *, int)) do_dlsym(handle, "glXQueryExtensionsString"); (const char *(*)(Display *, int)) do_dlsym(handle, "glXQueryExtensionsString");
/* We don't compare below for this in case we're not using Mesa. */
this->gl_data->glXReleaseBuffersMESA =
(void (*)(Display *, GLXDrawable)) do_dlsym( handle, "glXReleaseBuffersMESA" );
if ( (this->gl_data->glXChooseVisual == NULL) || if ( (this->gl_data->glXChooseVisual == NULL) ||
(this->gl_data->glXCreateContext == NULL) || (this->gl_data->glXCreateContext == NULL) ||
(this->gl_data->glXDestroyContext == NULL) || (this->gl_data->glXDestroyContext == NULL) ||
......
...@@ -43,13 +43,13 @@ struct SDL_PrivateGLData { ...@@ -43,13 +43,13 @@ struct SDL_PrivateGLData {
XVisualInfo* (*glXChooseVisual) XVisualInfo* (*glXChooseVisual)
( Display* dpy, ( Display* dpy,
int screen, int screen,
int* attribList ); int* attribList );
GLXContext (*glXCreateContext) GLXContext (*glXCreateContext)
( Display* dpy, ( Display* dpy,
XVisualInfo* vis, XVisualInfo* vis,
GLXContext shareList, GLXContext shareList,
Bool direct ); Bool direct );
void (*glXDestroyContext) void (*glXDestroyContext)
( Display* dpy, ( Display* dpy,
...@@ -70,13 +70,9 @@ struct SDL_PrivateGLData { ...@@ -70,13 +70,9 @@ struct SDL_PrivateGLData {
int attrib, int attrib,
int* value ); int* value );
void (*glXReleaseBuffersMESA)
( Display* dpy,
GLXDrawable drawable );
const char *(*glXQueryExtensionsString) const char *(*glXQueryExtensionsString)
( Display* dpy, ( Display* dpy,
int screen); int screen );
#endif /* HAVE_OPENGL_X11 */ #endif /* HAVE_OPENGL_X11 */
......
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