Mercurial > sdl-ios-xcode
annotate src/video/x11/SDL_x11gl.c @ 1029:f87f87efd45a
Date: Mon, 17 Jan 2005 20:54:50 +0200
From: Ville [snip]
Subject: [PATCH] SDL/DirectFB: remove Matrox CRTC2 flicker filter
Hi,
This patch removes the flicker filter option from the DirectFB backend's
Matrox CRTC2 code in SDL. I will be removing the option from DirectFB
(because it doesn't actually work) and that would cause the SDL code to
fail without this fix.
I was going to send this to some SDL list directly but libsdl.org is down
so I'm not sure what if any lists there are. Thomas Jarosch (the guy who
wrote the code) said you would accept SDL patches. Let me know if I should
send this somewhere else.
-- Ville Syrj�l� syrjala _at sci.fi http://www.sci.fi/~syrjala/
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Mon, 17 Jan 2005 19:38:28 +0000 |
parents | f7a8b0ca2ae3 |
children | 86885b40a53b |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
769
b8d311d90021
Updated copyright information for 2004 (Happy New Year!)
Sam Lantinga <slouken@libsdl.org>
parents:
667
diff
changeset
|
3 Copyright (C) 1997-2004 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
6 modify it under the terms of the GNU Library General Public | |
7 License as published by the Free Software Foundation; either | |
8 version 2 of the License, or (at your option) any later version. | |
9 | |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 Library General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU Library General Public | |
16 License along with this library; if not, write to the Free | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
180
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
22 | |
23 #ifdef SAVE_RCSID | |
24 static char rcsid = | |
25 "@(#) $Id$"; | |
26 #endif | |
27 | |
28 #include <stdlib.h> /* For getenv() prototype */ | |
29 #include <string.h> | |
30 | |
31 #include "SDL_events_c.h" | |
32 #include "SDL_error.h" | |
33 #include "SDL_x11video.h" | |
34 #include "SDL_x11dga_c.h" | |
35 #include "SDL_x11gl_c.h" | |
36 | |
862
f7a8b0ca2ae3
IRIX doesn't have a GL library versioning system
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
37 #if defined(sgi) |
f7a8b0ca2ae3
IRIX doesn't have a GL library versioning system
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
38 /* IRIX doesn't have a GL library versioning system */ |
f7a8b0ca2ae3
IRIX doesn't have a GL library versioning system
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
39 #define DEFAULT_OPENGL "libGL.so" |
f7a8b0ca2ae3
IRIX doesn't have a GL library versioning system
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
40 #else |
0 | 41 #define DEFAULT_OPENGL "libGL.so.1" |
862
f7a8b0ca2ae3
IRIX doesn't have a GL library versioning system
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
42 #endif |
0 | 43 |
667
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
44 #ifndef GLX_ARB_multisample |
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
45 #define GLX_ARB_multisample |
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
46 #define GLX_SAMPLE_BUFFERS_ARB 100000 |
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
47 #define GLX_SAMPLES_ARB 100001 |
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
48 #endif |
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
49 |
0 | 50 /* return the preferred visual to use for openGL graphics */ |
51 XVisualInfo *X11_GL_GetVisual(_THIS) | |
52 { | |
53 #ifdef HAVE_OPENGL | |
54 /* 64 seems nice. */ | |
55 int attribs[64]; | |
56 int i; | |
57 | |
58 /* load the gl driver from a default path */ | |
59 if ( ! this->gl_config.driver_loaded ) { | |
60 /* no driver has been loaded, use default (ourselves) */ | |
61 if ( X11_GL_LoadLibrary(this, NULL) < 0 ) { | |
62 return NULL; | |
63 } | |
64 } | |
65 | |
66 /* See if we already have a window which we must use */ | |
67 if ( SDL_windowid ) { | |
68 XWindowAttributes a; | |
69 XVisualInfo vi_in; | |
70 int out_count; | |
71 | |
72 XGetWindowAttributes(SDL_Display, SDL_Window, &a); | |
73 vi_in.screen = SDL_Screen; | |
74 vi_in.visualid = XVisualIDFromVisual(a.visual); | |
75 glx_visualinfo = XGetVisualInfo(SDL_Display, | |
76 VisualScreenMask|VisualIDMask, &vi_in, &out_count); | |
77 return glx_visualinfo; | |
78 } | |
79 | |
80 /* Setup our GLX attributes according to the gl_config. */ | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
81 i = 0; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
82 attribs[i++] = GLX_RGBA; |
0 | 83 attribs[i++] = GLX_RED_SIZE; |
84 attribs[i++] = this->gl_config.red_size; | |
85 attribs[i++] = GLX_GREEN_SIZE; | |
86 attribs[i++] = this->gl_config.green_size; | |
87 attribs[i++] = GLX_BLUE_SIZE; | |
88 attribs[i++] = this->gl_config.blue_size; | |
89 | |
90 if( this->gl_config.alpha_size ) { | |
91 attribs[i++] = GLX_ALPHA_SIZE; | |
92 attribs[i++] = this->gl_config.alpha_size; | |
93 } | |
94 | |
95 if( this->gl_config.buffer_size ) { | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
96 attribs[i++] = GLX_BUFFER_SIZE; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
97 attribs[i++] = this->gl_config.buffer_size; |
0 | 98 } |
99 | |
100 if( this->gl_config.double_buffer ) { | |
101 attribs[i++] = GLX_DOUBLEBUFFER; | |
102 } | |
103 | |
104 attribs[i++] = GLX_DEPTH_SIZE; | |
105 attribs[i++] = this->gl_config.depth_size; | |
106 | |
107 if( this->gl_config.stencil_size ) { | |
108 attribs[i++] = GLX_STENCIL_SIZE; | |
109 attribs[i++] = this->gl_config.stencil_size; | |
110 } | |
111 | |
112 if( this->gl_config.accum_red_size ) { | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
113 attribs[i++] = GLX_ACCUM_RED_SIZE; |
0 | 114 attribs[i++] = this->gl_config.accum_red_size; |
115 } | |
116 | |
117 if( this->gl_config.accum_green_size ) { | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
118 attribs[i++] = GLX_ACCUM_GREEN_SIZE; |
0 | 119 attribs[i++] = this->gl_config.accum_green_size; |
120 } | |
121 | |
122 if( this->gl_config.accum_blue_size ) { | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
123 attribs[i++] = GLX_ACCUM_BLUE_SIZE; |
0 | 124 attribs[i++] = this->gl_config.accum_blue_size; |
125 } | |
126 | |
127 if( this->gl_config.accum_alpha_size ) { | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
128 attribs[i++] = GLX_ACCUM_ALPHA_SIZE; |
0 | 129 attribs[i++] = this->gl_config.accum_alpha_size; |
130 } | |
131 | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
132 if( this->gl_config.stereo ) { |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
133 attribs[i++] = GLX_STEREO; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
134 attribs[i++] = this->gl_config.stereo; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
135 } |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
136 |
656
864e2d2a9a55
Merged in Ryan's multisample code for MacOS, and changed the constants to match.
Sam Lantinga <slouken@libsdl.org>
parents:
655
diff
changeset
|
137 if( this->gl_config.multisamplebuffers ) { |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
138 attribs[i++] = GLX_SAMPLE_BUFFERS_ARB; |
656
864e2d2a9a55
Merged in Ryan's multisample code for MacOS, and changed the constants to match.
Sam Lantinga <slouken@libsdl.org>
parents:
655
diff
changeset
|
139 attribs[i++] = this->gl_config.multisamplebuffers; |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
140 } |
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
141 |
656
864e2d2a9a55
Merged in Ryan's multisample code for MacOS, and changed the constants to match.
Sam Lantinga <slouken@libsdl.org>
parents:
655
diff
changeset
|
142 if( this->gl_config.multisamplesamples ) { |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
143 attribs[i++] = GLX_SAMPLES_ARB; |
656
864e2d2a9a55
Merged in Ryan's multisample code for MacOS, and changed the constants to match.
Sam Lantinga <slouken@libsdl.org>
parents:
655
diff
changeset
|
144 attribs[i++] = this->gl_config.multisamplesamples; |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
145 } |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
146 |
0 | 147 #ifdef GLX_DIRECT_COLOR /* Try for a DirectColor visual for gamma support */ |
148 attribs[i++] = GLX_X_VISUAL_TYPE; | |
149 attribs[i++] = GLX_DIRECT_COLOR; | |
150 #endif | |
151 attribs[i++] = None; | |
152 | |
153 glx_visualinfo = this->gl_data->glXChooseVisual(GFX_Display, | |
154 SDL_Screen, attribs); | |
155 #ifdef GLX_DIRECT_COLOR | |
156 if( !glx_visualinfo ) { /* No DirectColor visual? Try again.. */ | |
157 attribs[i-3] = None; | |
158 glx_visualinfo = this->gl_data->glXChooseVisual(GFX_Display, | |
159 SDL_Screen, attribs); | |
160 } | |
161 #endif | |
162 if( !glx_visualinfo ) { | |
163 SDL_SetError( "Couldn't find matching GLX visual"); | |
164 return NULL; | |
165 } | |
166 return glx_visualinfo; | |
167 #else | |
168 SDL_SetError("X11 driver not configured with OpenGL"); | |
169 return NULL; | |
170 #endif | |
171 } | |
172 | |
173 int X11_GL_CreateWindow(_THIS, int w, int h) | |
174 { | |
175 int retval; | |
176 #ifdef HAVE_OPENGL | |
177 XSetWindowAttributes attributes; | |
178 unsigned long mask; | |
179 unsigned long black; | |
180 | |
181 black = (glx_visualinfo->visual == DefaultVisual(SDL_Display, | |
182 SDL_Screen)) | |
183 ? BlackPixel(SDL_Display, SDL_Screen) : 0; | |
184 attributes.background_pixel = black; | |
185 attributes.border_pixel = black; | |
186 attributes.colormap = SDL_XColorMap; | |
187 mask = CWBackPixel | CWBorderPixel | CWColormap; | |
188 | |
189 SDL_Window = XCreateWindow(SDL_Display, WMwindow, | |
190 0, 0, w, h, 0, glx_visualinfo->depth, | |
191 InputOutput, glx_visualinfo->visual, | |
192 mask, &attributes); | |
193 if ( !SDL_Window ) { | |
194 SDL_SetError("Could not create window"); | |
195 return -1; | |
196 } | |
197 retval = 0; | |
198 #else | |
199 SDL_SetError("X11 driver not configured with OpenGL"); | |
200 retval = -1; | |
201 #endif | |
202 return(retval); | |
203 } | |
204 | |
205 int X11_GL_CreateContext(_THIS) | |
206 { | |
207 int retval; | |
208 #ifdef HAVE_OPENGL | |
209 /* We do this to create a clean separation between X and GLX errors. */ | |
210 XSync( SDL_Display, False ); | |
211 glx_context = this->gl_data->glXCreateContext(GFX_Display, | |
212 glx_visualinfo, NULL, True); | |
213 XSync( GFX_Display, False ); | |
214 | |
215 if (glx_context == NULL) { | |
216 SDL_SetError("Could not create GL context"); | |
217 return -1; | |
218 } | |
219 | |
220 gl_active = 1; | |
221 #else | |
222 SDL_SetError("X11 driver not configured with OpenGL"); | |
223 #endif | |
224 if ( gl_active ) { | |
225 retval = 0; | |
226 } else { | |
227 retval = -1; | |
228 } | |
229 return(retval); | |
230 } | |
231 | |
232 void X11_GL_Shutdown(_THIS) | |
233 { | |
234 #ifdef HAVE_OPENGL | |
235 /* Clean up OpenGL */ | |
236 if( glx_context ) { | |
237 this->gl_data->glXMakeCurrent(GFX_Display, None, NULL); | |
238 | |
239 if (glx_context != NULL) | |
240 this->gl_data->glXDestroyContext(GFX_Display, glx_context); | |
241 | |
242 if( this->gl_data->glXReleaseBuffersMESA ) { | |
243 this->gl_data->glXReleaseBuffersMESA(GFX_Display,SDL_Window); | |
244 } | |
245 glx_context = NULL; | |
246 } | |
247 gl_active = 0; | |
248 #endif /* HAVE_OPENGL */ | |
249 } | |
250 | |
251 #ifdef HAVE_OPENGL | |
252 | |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
253 static int ExtensionSupported(const char *extension) |
638
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
254 { |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
255 const GLubyte *extensions = NULL; |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
256 const GLubyte *start; |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
257 GLubyte *where, *terminator; |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
258 |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
259 /* Extension names should not have spaces. */ |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
260 where = (GLubyte *) strchr(extension, ' '); |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
261 if (where || *extension == '\0') |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
262 return 0; |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
263 |
643
564716cfb502
Removed direct dependency on OpenGL (call current_video->glGetString() instead
Ryan C. Gordon <icculus@icculus.org>
parents:
638
diff
changeset
|
264 extensions = current_video->glGetString(GL_EXTENSIONS); |
638
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
265 /* It takes a bit of care to be fool-proof about parsing the |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
266 * OpenGL extensions string. Don't be fooled by sub-strings, |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
267 * etc. */ |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
268 |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
269 start = extensions; |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
270 |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
271 for (;;) |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
272 { |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
273 where = (GLubyte *) strstr((const char *) start, extension); |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
274 if (!where) break; |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
275 |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
276 terminator = where + strlen(extension); |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
277 if (where == start || *(where - 1) == ' ') |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
278 if (*terminator == ' ' || *terminator == '\0') return 1; |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
279 |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
280 start = terminator; |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
281 } |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
282 |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
283 return 0; |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
284 } |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
285 |
0 | 286 /* Make the current context active */ |
287 int X11_GL_MakeCurrent(_THIS) | |
288 { | |
289 int retval; | |
638
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
290 |
0 | 291 retval = 0; |
292 if ( ! this->gl_data->glXMakeCurrent(GFX_Display, | |
293 SDL_Window, glx_context) ) { | |
294 SDL_SetError("Unable to make GL context current"); | |
295 retval = -1; | |
296 } | |
297 XSync( GFX_Display, False ); | |
298 | |
638
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
299 /* |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
300 * The context is now current, check for glXReleaseBuffersMESA() |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
301 * extension. If extension is _not_ supported, destroy the pointer |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
302 * (to make sure it will not be called in X11_GL_Shutdown() ). |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
303 * |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
304 * DRI/Mesa drivers include glXReleaseBuffersMESA() in the libGL.so, |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
305 * but there's no need to call it (is is only needed for some old |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
306 * non-DRI drivers). |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
307 * |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
308 * When using for example glew (http://glew.sf.net), dlsym() for |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
309 * glXReleaseBuffersMESA() returns the pointer from the glew library |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
310 * (namespace conflict). |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
311 * |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
312 * The glXReleaseBuffersMESA() pointer in the glew is NULL, if the |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
313 * driver doesn't support this extension. So blindly calling it will |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
314 * cause segfault with DRI/Mesa drivers! |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
315 * |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
316 */ |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
317 |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
318 if ( ! ExtensionSupported("glXReleaseBuffersMESA") ) { |
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
319 this->gl_data->glXReleaseBuffersMESA = NULL; |
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
320 } |
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
321 |
0 | 322 /* More Voodoo X server workarounds... Grr... */ |
323 SDL_Lock_EventThread(); | |
324 X11_CheckDGAMouse(this); | |
325 SDL_Unlock_EventThread(); | |
326 | |
327 return(retval); | |
328 } | |
329 | |
330 /* Get attribute data from glX. */ | |
331 int X11_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) | |
332 { | |
333 int retval; | |
334 int glx_attrib = None; | |
335 | |
336 switch( attrib ) { | |
337 case SDL_GL_RED_SIZE: | |
338 glx_attrib = GLX_RED_SIZE; | |
339 break; | |
340 case SDL_GL_GREEN_SIZE: | |
341 glx_attrib = GLX_GREEN_SIZE; | |
342 break; | |
343 case SDL_GL_BLUE_SIZE: | |
344 glx_attrib = GLX_BLUE_SIZE; | |
345 break; | |
346 case SDL_GL_ALPHA_SIZE: | |
347 glx_attrib = GLX_ALPHA_SIZE; | |
348 break; | |
349 case SDL_GL_DOUBLEBUFFER: | |
350 glx_attrib = GLX_DOUBLEBUFFER; | |
351 break; | |
352 case SDL_GL_BUFFER_SIZE: | |
353 glx_attrib = GLX_BUFFER_SIZE; | |
354 break; | |
355 case SDL_GL_DEPTH_SIZE: | |
356 glx_attrib = GLX_DEPTH_SIZE; | |
357 break; | |
358 case SDL_GL_STENCIL_SIZE: | |
359 glx_attrib = GLX_STENCIL_SIZE; | |
360 break; | |
361 case SDL_GL_ACCUM_RED_SIZE: | |
362 glx_attrib = GLX_ACCUM_RED_SIZE; | |
363 break; | |
364 case SDL_GL_ACCUM_GREEN_SIZE: | |
365 glx_attrib = GLX_ACCUM_GREEN_SIZE; | |
366 break; | |
367 case SDL_GL_ACCUM_BLUE_SIZE: | |
368 glx_attrib = GLX_ACCUM_BLUE_SIZE; | |
369 break; | |
370 case SDL_GL_ACCUM_ALPHA_SIZE: | |
371 glx_attrib = GLX_ACCUM_ALPHA_SIZE; | |
372 break; | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
373 case SDL_GL_STEREO: |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
374 glx_attrib = GLX_STEREO; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
375 break; |
656
864e2d2a9a55
Merged in Ryan's multisample code for MacOS, and changed the constants to match.
Sam Lantinga <slouken@libsdl.org>
parents:
655
diff
changeset
|
376 case SDL_GL_MULTISAMPLEBUFFERS: |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
377 glx_attrib = GLX_SAMPLE_BUFFERS_ARB; |
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
378 break; |
656
864e2d2a9a55
Merged in Ryan's multisample code for MacOS, and changed the constants to match.
Sam Lantinga <slouken@libsdl.org>
parents:
655
diff
changeset
|
379 case SDL_GL_MULTISAMPLESAMPLES: |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
380 glx_attrib = GLX_SAMPLES_ARB; |
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
381 break; |
0 | 382 default: |
383 return(-1); | |
384 } | |
385 | |
386 retval = this->gl_data->glXGetConfig(GFX_Display, glx_visualinfo, glx_attrib, value); | |
387 | |
388 return retval; | |
389 } | |
390 | |
391 void X11_GL_SwapBuffers(_THIS) | |
392 { | |
393 this->gl_data->glXSwapBuffers(GFX_Display, SDL_Window); | |
394 } | |
395 | |
396 #endif /* HAVE_OPENGL */ | |
397 | |
398 void X11_GL_UnloadLibrary(_THIS) | |
399 { | |
400 #ifdef HAVE_OPENGL | |
401 if ( this->gl_config.driver_loaded ) { | |
402 dlclose(this->gl_config.dll_handle); | |
403 | |
404 this->gl_data->glXGetProcAddress = NULL; | |
405 this->gl_data->glXChooseVisual = NULL; | |
406 this->gl_data->glXCreateContext = NULL; | |
407 this->gl_data->glXDestroyContext = NULL; | |
408 this->gl_data->glXMakeCurrent = NULL; | |
409 this->gl_data->glXSwapBuffers = NULL; | |
410 | |
411 this->gl_config.dll_handle = NULL; | |
412 this->gl_config.driver_loaded = 0; | |
413 } | |
414 #endif | |
415 } | |
416 | |
417 #ifdef HAVE_OPENGL | |
418 | |
419 /* Passing a NULL path means load pointers from the application */ | |
420 int X11_GL_LoadLibrary(_THIS, const char* path) | |
421 { | |
422 void* handle; | |
423 int dlopen_flags; | |
424 | |
425 if ( gl_active ) { | |
426 SDL_SetError("OpenGL context already created"); | |
427 return -1; | |
428 } | |
429 | |
430 #ifdef RTLD_GLOBAL | |
431 dlopen_flags = RTLD_LAZY | RTLD_GLOBAL; | |
432 #else | |
433 dlopen_flags = RTLD_LAZY; | |
434 #endif | |
435 handle = dlopen(path, dlopen_flags); | |
436 /* Catch the case where the application isn't linked with GL */ | |
437 if ( (dlsym(handle, "glXChooseVisual") == NULL) && (path == NULL) ) { | |
438 dlclose(handle); | |
439 path = getenv("SDL_VIDEO_GL_DRIVER"); | |
440 if ( path == NULL ) { | |
441 path = DEFAULT_OPENGL; | |
442 } | |
443 handle = dlopen(path, dlopen_flags); | |
444 } | |
445 if ( handle == NULL ) { | |
446 SDL_SetError("Could not load OpenGL library"); | |
447 return -1; | |
448 } | |
449 | |
450 /* Unload the old driver and reset the pointers */ | |
451 X11_GL_UnloadLibrary(this); | |
452 | |
453 /* Load new function pointers */ | |
180
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
454 this->gl_data->glXGetProcAddress = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
455 (void *(*)(const GLubyte *)) dlsym(handle, "glXGetProcAddressARB"); |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
456 this->gl_data->glXChooseVisual = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
457 (XVisualInfo *(*)(Display *, int, int *)) dlsym(handle, "glXChooseVisual"); |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
458 this->gl_data->glXCreateContext = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
459 (GLXContext (*)(Display *, XVisualInfo *, GLXContext, int)) dlsym(handle, "glXCreateContext"); |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
460 this->gl_data->glXDestroyContext = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
461 (void (*)(Display *, GLXContext)) dlsym(handle, "glXDestroyContext"); |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
462 this->gl_data->glXMakeCurrent = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
463 (int (*)(Display *, GLXDrawable, GLXContext)) dlsym(handle, "glXMakeCurrent"); |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
464 this->gl_data->glXSwapBuffers = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
465 (void (*)(Display *, GLXDrawable)) dlsym(handle, "glXSwapBuffers"); |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
466 this->gl_data->glXGetConfig = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
467 (int (*)(Display *, XVisualInfo *, int, int *)) dlsym(handle, "glXGetConfig"); |
638
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
468 this->gl_data->glXQueryExtensionsString = |
646
0f2029a70548
Fixed incorrect prototype for glXQueryExtensionsString()
Sam Lantinga <slouken@libsdl.org>
parents:
643
diff
changeset
|
469 (const char *(*)(Display *, int)) dlsym(handle, "glXQueryExtensionsString"); |
638
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
470 |
0 | 471 /* We don't compare below for this in case we're not using Mesa. */ |
180
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
472 this->gl_data->glXReleaseBuffersMESA = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
473 (void (*)(Display *, GLXDrawable)) dlsym( handle, "glXReleaseBuffersMESA" ); |
638
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
474 |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
475 |
0 | 476 if ( (this->gl_data->glXChooseVisual == NULL) || |
477 (this->gl_data->glXCreateContext == NULL) || | |
478 (this->gl_data->glXDestroyContext == NULL) || | |
479 (this->gl_data->glXMakeCurrent == NULL) || | |
480 (this->gl_data->glXSwapBuffers == NULL) || | |
638
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
481 (this->gl_data->glXGetConfig == NULL) || |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
482 (this->gl_data->glXQueryExtensionsString == NULL)) { |
0 | 483 SDL_SetError("Could not retrieve OpenGL functions"); |
484 return -1; | |
485 } | |
486 | |
487 this->gl_config.dll_handle = handle; | |
488 this->gl_config.driver_loaded = 1; | |
489 if ( path ) { | |
490 strncpy(this->gl_config.driver_path, path, | |
491 sizeof(this->gl_config.driver_path)-1); | |
492 } else { | |
493 strcpy(this->gl_config.driver_path, ""); | |
494 } | |
495 return 0; | |
496 } | |
497 | |
498 void *X11_GL_GetProcAddress(_THIS, const char* proc) | |
499 { | |
110
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
500 static char procname[1024]; |
0 | 501 void* handle; |
110
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
502 void* retval; |
0 | 503 |
504 handle = this->gl_config.dll_handle; | |
505 if ( this->gl_data->glXGetProcAddress ) { | |
566
d6e7d7006062
Enable the glXGetProcAddressARB code (fixes problems with NVidia drivers)
Sam Lantinga <slouken@libsdl.org>
parents:
450
diff
changeset
|
506 return this->gl_data->glXGetProcAddress(proc); |
0 | 507 } |
110
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
508 #if defined(__OpenBSD__) && !defined(__ELF__) |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
509 #undef dlsym(x,y); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
510 #endif |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
511 retval = dlsym(handle, proc); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
512 if (!retval && strlen(proc) <= 1022) { |
127
0bcae11eba14
Oops, that wasn't right...
Sam Lantinga <slouken@libsdl.org>
parents:
110
diff
changeset
|
513 procname[0] = '_'; |
110
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
514 strcpy(procname + 1, proc); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
515 retval = dlsym(handle, procname); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
516 } |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
517 return retval; |
0 | 518 } |
519 | |
520 #endif /* HAVE_OPENGL */ |