Mercurial > sdl-ios-xcode
annotate src/video/x11/SDL_x11gl.c @ 1554:0ca607a5d173
Fixed bug #84
Date: Sun, 23 Oct 2005 16:39:03 +0200
From: "A. Schmid" <sahib@phreaker.net>
Subject: [SDL] no software surfaces with svgalib driver?
Hi,
I noticed that the SDL (1.2.9) svgalib driver only makes use of linear
addressable (framebuffer) video modes. On older systems (like one of
mine), linear addressable modes are often not available.
Especially for cards with VESA VBE < 2.0 the svgalib vesa driver is
unusable, since VESA only supports framebuffering for VBE 2.0 and later.
The changes necessary to add support for software surfaces seem to be
relatively small. I only had to hack src/video/svga/SDL_svgavideo.c (see
attached patch). The code worked fine for me, but it is no more than a
proof of concept and should be reviewed (probably has a memory leak when
switching modes). It also uses the vgagl library (included in the
svgalib package) and needs to be linked against it.
-Alex
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 19 Mar 2006 12:04:40 +0000 |
parents | d910939febfa |
children | 3ba88cb7eb1b |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1247
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1247
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1247
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 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 | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1247
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1247
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1247
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1247
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 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 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 #include "SDL_x11video.h" | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
25 #include "../../events/SDL_events_c.h" |
0 | 26 #include "SDL_x11dga_c.h" |
27 #include "SDL_x11gl_c.h" | |
28 | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
29 #if defined(__IRIX__) |
862
f7a8b0ca2ae3
IRIX doesn't have a GL library versioning system
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
30 /* 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
|
31 #define DEFAULT_OPENGL "libGL.so" |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
32 #elif defined(__MACOSX__) |
1191
2bd4cec0de63
Seperate glX from HAVE_OPENGL, for platforms that have both an X server and
Ryan C. Gordon <icculus@icculus.org>
parents:
1182
diff
changeset
|
33 #define DEFAULT_OPENGL "/usr/X11R6/lib/libGL.1.dylib" |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
34 #elif defined(__QNXNTO__) |
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
35 #define DEFAULT_OPENGL "libGL.so.3" |
862
f7a8b0ca2ae3
IRIX doesn't have a GL library versioning system
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
36 #else |
0 | 37 #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
|
38 #endif |
0 | 39 |
667
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
40 #ifndef GLX_ARB_multisample |
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
41 #define GLX_ARB_multisample |
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
42 #define GLX_SAMPLE_BUFFERS_ARB 100000 |
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
43 #define GLX_SAMPLES_ARB 100001 |
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
44 #endif |
adbed8d7a991
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
45 |
0 | 46 XVisualInfo *X11_GL_GetVisual(_THIS) |
47 { | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
48 #if SDL_VIDEO_OPENGL_GLX |
0 | 49 /* 64 seems nice. */ |
50 int attribs[64]; | |
51 int i; | |
52 | |
53 /* load the gl driver from a default path */ | |
54 if ( ! this->gl_config.driver_loaded ) { | |
55 /* no driver has been loaded, use default (ourselves) */ | |
56 if ( X11_GL_LoadLibrary(this, NULL) < 0 ) { | |
57 return NULL; | |
58 } | |
59 } | |
60 | |
61 /* See if we already have a window which we must use */ | |
62 if ( SDL_windowid ) { | |
63 XWindowAttributes a; | |
64 XVisualInfo vi_in; | |
65 int out_count; | |
66 | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
1060
diff
changeset
|
67 pXGetWindowAttributes(SDL_Display, SDL_Window, &a); |
0 | 68 vi_in.screen = SDL_Screen; |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
1060
diff
changeset
|
69 vi_in.visualid = pXVisualIDFromVisual(a.visual); |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
1060
diff
changeset
|
70 glx_visualinfo = pXGetVisualInfo(SDL_Display, |
0 | 71 VisualScreenMask|VisualIDMask, &vi_in, &out_count); |
72 return glx_visualinfo; | |
73 } | |
74 | |
75 /* 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
|
76 i = 0; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
77 attribs[i++] = GLX_RGBA; |
0 | 78 attribs[i++] = GLX_RED_SIZE; |
79 attribs[i++] = this->gl_config.red_size; | |
80 attribs[i++] = GLX_GREEN_SIZE; | |
81 attribs[i++] = this->gl_config.green_size; | |
82 attribs[i++] = GLX_BLUE_SIZE; | |
83 attribs[i++] = this->gl_config.blue_size; | |
84 | |
85 if( this->gl_config.alpha_size ) { | |
86 attribs[i++] = GLX_ALPHA_SIZE; | |
87 attribs[i++] = this->gl_config.alpha_size; | |
88 } | |
89 | |
90 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
|
91 attribs[i++] = GLX_BUFFER_SIZE; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
92 attribs[i++] = this->gl_config.buffer_size; |
0 | 93 } |
94 | |
95 if( this->gl_config.double_buffer ) { | |
96 attribs[i++] = GLX_DOUBLEBUFFER; | |
97 } | |
98 | |
99 attribs[i++] = GLX_DEPTH_SIZE; | |
100 attribs[i++] = this->gl_config.depth_size; | |
101 | |
102 if( this->gl_config.stencil_size ) { | |
103 attribs[i++] = GLX_STENCIL_SIZE; | |
104 attribs[i++] = this->gl_config.stencil_size; | |
105 } | |
106 | |
107 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
|
108 attribs[i++] = GLX_ACCUM_RED_SIZE; |
0 | 109 attribs[i++] = this->gl_config.accum_red_size; |
110 } | |
111 | |
112 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
|
113 attribs[i++] = GLX_ACCUM_GREEN_SIZE; |
0 | 114 attribs[i++] = this->gl_config.accum_green_size; |
115 } | |
116 | |
117 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
|
118 attribs[i++] = GLX_ACCUM_BLUE_SIZE; |
0 | 119 attribs[i++] = this->gl_config.accum_blue_size; |
120 } | |
121 | |
122 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
|
123 attribs[i++] = GLX_ACCUM_ALPHA_SIZE; |
0 | 124 attribs[i++] = this->gl_config.accum_alpha_size; |
125 } | |
126 | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
127 if( this->gl_config.stereo ) { |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
128 attribs[i++] = GLX_STEREO; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
129 attribs[i++] = this->gl_config.stereo; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
130 } |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
131 |
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
|
132 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
|
133 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
|
134 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
|
135 } |
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.multisamplesamples ) { |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
138 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
|
139 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
|
140 } |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
141 |
0 | 142 #ifdef GLX_DIRECT_COLOR /* Try for a DirectColor visual for gamma support */ |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1315
diff
changeset
|
143 if ( !SDL_getenv("SDL_VIDEO_X11_NODIRECTCOLOR") ) { |
1060
86885b40a53b
Support SDL_VIDEO_X11_NODIRECTCOLOR for OpenGL visuals
Sam Lantinga <slouken@libsdl.org>
parents:
862
diff
changeset
|
144 attribs[i++] = GLX_X_VISUAL_TYPE; |
86885b40a53b
Support SDL_VIDEO_X11_NODIRECTCOLOR for OpenGL visuals
Sam Lantinga <slouken@libsdl.org>
parents:
862
diff
changeset
|
145 attribs[i++] = GLX_DIRECT_COLOR; |
86885b40a53b
Support SDL_VIDEO_X11_NODIRECTCOLOR for OpenGL visuals
Sam Lantinga <slouken@libsdl.org>
parents:
862
diff
changeset
|
146 } |
0 | 147 #endif |
148 attribs[i++] = None; | |
149 | |
150 glx_visualinfo = this->gl_data->glXChooseVisual(GFX_Display, | |
151 SDL_Screen, attribs); | |
152 #ifdef GLX_DIRECT_COLOR | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1315
diff
changeset
|
153 if( !glx_visualinfo && !SDL_getenv("SDL_VIDEO_X11_NODIRECTCOLOR") ) { /* No DirectColor visual? Try again.. */ |
0 | 154 attribs[i-3] = None; |
155 glx_visualinfo = this->gl_data->glXChooseVisual(GFX_Display, | |
156 SDL_Screen, attribs); | |
157 } | |
158 #endif | |
159 if( !glx_visualinfo ) { | |
160 SDL_SetError( "Couldn't find matching GLX visual"); | |
161 return NULL; | |
162 } | |
1315
e94b0d7c33bc
Merged useful fixes from 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
163 /* |
e94b0d7c33bc
Merged useful fixes from 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
164 printf("Found GLX visual 0x%x\n", glx_visualinfo->visualid); |
e94b0d7c33bc
Merged useful fixes from 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
165 */ |
0 | 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; | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
176 #if SDL_VIDEO_OPENGL_GLX |
0 | 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 | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
1060
diff
changeset
|
189 SDL_Window = pXCreateWindow(SDL_Display, WMwindow, |
0 | 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; | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
208 #if SDL_VIDEO_OPENGL_GLX |
0 | 209 /* We do this to create a clean separation between X and GLX errors. */ |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
1060
diff
changeset
|
210 pXSync( SDL_Display, False ); |
0 | 211 glx_context = this->gl_data->glXCreateContext(GFX_Display, |
212 glx_visualinfo, NULL, True); | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
1060
diff
changeset
|
213 pXSync( GFX_Display, False ); |
0 | 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 { | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
234 #if SDL_VIDEO_OPENGL_GLX |
0 | 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 glx_context = NULL; | |
243 } | |
244 gl_active = 0; | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
245 #endif /* SDL_VIDEO_OPENGL_GLX */ |
0 | 246 } |
247 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
248 #if SDL_VIDEO_OPENGL_GLX |
0 | 249 |
250 /* Make the current context active */ | |
251 int X11_GL_MakeCurrent(_THIS) | |
252 { | |
253 int retval; | |
638
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
254 |
0 | 255 retval = 0; |
256 if ( ! this->gl_data->glXMakeCurrent(GFX_Display, | |
257 SDL_Window, glx_context) ) { | |
258 SDL_SetError("Unable to make GL context current"); | |
259 retval = -1; | |
260 } | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
1060
diff
changeset
|
261 pXSync( GFX_Display, False ); |
0 | 262 |
263 /* More Voodoo X server workarounds... Grr... */ | |
264 SDL_Lock_EventThread(); | |
265 X11_CheckDGAMouse(this); | |
266 SDL_Unlock_EventThread(); | |
267 | |
268 return(retval); | |
269 } | |
270 | |
271 /* Get attribute data from glX. */ | |
272 int X11_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) | |
273 { | |
274 int retval; | |
275 int glx_attrib = None; | |
276 | |
277 switch( attrib ) { | |
278 case SDL_GL_RED_SIZE: | |
279 glx_attrib = GLX_RED_SIZE; | |
280 break; | |
281 case SDL_GL_GREEN_SIZE: | |
282 glx_attrib = GLX_GREEN_SIZE; | |
283 break; | |
284 case SDL_GL_BLUE_SIZE: | |
285 glx_attrib = GLX_BLUE_SIZE; | |
286 break; | |
287 case SDL_GL_ALPHA_SIZE: | |
288 glx_attrib = GLX_ALPHA_SIZE; | |
289 break; | |
290 case SDL_GL_DOUBLEBUFFER: | |
291 glx_attrib = GLX_DOUBLEBUFFER; | |
292 break; | |
293 case SDL_GL_BUFFER_SIZE: | |
294 glx_attrib = GLX_BUFFER_SIZE; | |
295 break; | |
296 case SDL_GL_DEPTH_SIZE: | |
297 glx_attrib = GLX_DEPTH_SIZE; | |
298 break; | |
299 case SDL_GL_STENCIL_SIZE: | |
300 glx_attrib = GLX_STENCIL_SIZE; | |
301 break; | |
302 case SDL_GL_ACCUM_RED_SIZE: | |
303 glx_attrib = GLX_ACCUM_RED_SIZE; | |
304 break; | |
305 case SDL_GL_ACCUM_GREEN_SIZE: | |
306 glx_attrib = GLX_ACCUM_GREEN_SIZE; | |
307 break; | |
308 case SDL_GL_ACCUM_BLUE_SIZE: | |
309 glx_attrib = GLX_ACCUM_BLUE_SIZE; | |
310 break; | |
311 case SDL_GL_ACCUM_ALPHA_SIZE: | |
312 glx_attrib = GLX_ACCUM_ALPHA_SIZE; | |
313 break; | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
314 case SDL_GL_STEREO: |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
315 glx_attrib = GLX_STEREO; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
316 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
|
317 case SDL_GL_MULTISAMPLEBUFFERS: |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
318 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
|
319 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
|
320 case SDL_GL_MULTISAMPLESAMPLES: |
655
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
321 glx_attrib = GLX_SAMPLES_ARB; |
9c42ee1b7d77
Date: Thu, 24 Apr 2003 15:13:47 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
646
diff
changeset
|
322 break; |
0 | 323 default: |
324 return(-1); | |
325 } | |
326 | |
327 retval = this->gl_data->glXGetConfig(GFX_Display, glx_visualinfo, glx_attrib, value); | |
328 | |
329 return retval; | |
330 } | |
331 | |
332 void X11_GL_SwapBuffers(_THIS) | |
333 { | |
334 this->gl_data->glXSwapBuffers(GFX_Display, SDL_Window); | |
335 } | |
336 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
337 #endif /* SDL_VIDEO_OPENGL_GLX */ |
0 | 338 |
339 void X11_GL_UnloadLibrary(_THIS) | |
340 { | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
341 #if SDL_VIDEO_OPENGL_GLX |
0 | 342 if ( this->gl_config.driver_loaded ) { |
1191
2bd4cec0de63
Seperate glX from HAVE_OPENGL, for platforms that have both an X server and
Ryan C. Gordon <icculus@icculus.org>
parents:
1182
diff
changeset
|
343 |
2bd4cec0de63
Seperate glX from HAVE_OPENGL, for platforms that have both an X server and
Ryan C. Gordon <icculus@icculus.org>
parents:
1182
diff
changeset
|
344 SDL_UnloadObject(this->gl_config.dll_handle); |
0 | 345 |
346 this->gl_data->glXGetProcAddress = NULL; | |
347 this->gl_data->glXChooseVisual = NULL; | |
348 this->gl_data->glXCreateContext = NULL; | |
349 this->gl_data->glXDestroyContext = NULL; | |
350 this->gl_data->glXMakeCurrent = NULL; | |
351 this->gl_data->glXSwapBuffers = NULL; | |
352 | |
353 this->gl_config.dll_handle = NULL; | |
354 this->gl_config.driver_loaded = 0; | |
355 } | |
356 #endif | |
357 } | |
358 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
359 #if SDL_VIDEO_OPENGL_GLX |
1182
e8e8dcb68e7a
X11 driver now chooses "libGL.so.1" as a default when a NULL is passed to
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
360 |
0 | 361 /* Passing a NULL path means load pointers from the application */ |
362 int X11_GL_LoadLibrary(_THIS, const char* path) | |
363 { | |
1191
2bd4cec0de63
Seperate glX from HAVE_OPENGL, for platforms that have both an X server and
Ryan C. Gordon <icculus@icculus.org>
parents:
1182
diff
changeset
|
364 void* handle = NULL; |
0 | 365 |
1182
e8e8dcb68e7a
X11 driver now chooses "libGL.so.1" as a default when a NULL is passed to
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
366 if ( gl_active ) { |
e8e8dcb68e7a
X11 driver now chooses "libGL.so.1" as a default when a NULL is passed to
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
367 SDL_SetError("OpenGL context already created"); |
e8e8dcb68e7a
X11 driver now chooses "libGL.so.1" as a default when a NULL is passed to
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
368 return -1; |
e8e8dcb68e7a
X11 driver now chooses "libGL.so.1" as a default when a NULL is passed to
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
369 } |
e8e8dcb68e7a
X11 driver now chooses "libGL.so.1" as a default when a NULL is passed to
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
370 |
e8e8dcb68e7a
X11 driver now chooses "libGL.so.1" as a default when a NULL is passed to
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
371 if ( path == NULL ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1315
diff
changeset
|
372 path = SDL_getenv("SDL_VIDEO_GL_DRIVER"); |
0 | 373 if ( path == NULL ) { |
374 path = DEFAULT_OPENGL; | |
375 } | |
1191
2bd4cec0de63
Seperate glX from HAVE_OPENGL, for platforms that have both an X server and
Ryan C. Gordon <icculus@icculus.org>
parents:
1182
diff
changeset
|
376 } |
2bd4cec0de63
Seperate glX from HAVE_OPENGL, for platforms that have both an X server and
Ryan C. Gordon <icculus@icculus.org>
parents:
1182
diff
changeset
|
377 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
378 handle = SDL_LoadObject(path); |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
379 if ( handle == NULL ) { |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
380 /* SDL_LoadObject() will call SDL_SetError() for us. */ |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
381 return -1; |
0 | 382 } |
383 | |
384 /* Unload the old driver and reset the pointers */ | |
385 X11_GL_UnloadLibrary(this); | |
386 | |
387 /* Load new function pointers */ | |
180
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
388 this->gl_data->glXGetProcAddress = |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
389 (void *(*)(const GLubyte *)) SDL_LoadFunction(handle, "glXGetProcAddressARB"); |
180
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
390 this->gl_data->glXChooseVisual = |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
391 (XVisualInfo *(*)(Display *, int, int *)) SDL_LoadFunction(handle, "glXChooseVisual"); |
180
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
392 this->gl_data->glXCreateContext = |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
393 (GLXContext (*)(Display *, XVisualInfo *, GLXContext, int)) SDL_LoadFunction(handle, "glXCreateContext"); |
180
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
394 this->gl_data->glXDestroyContext = |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
395 (void (*)(Display *, GLXContext)) SDL_LoadFunction(handle, "glXDestroyContext"); |
180
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
396 this->gl_data->glXMakeCurrent = |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
397 (int (*)(Display *, GLXDrawable, GLXContext)) SDL_LoadFunction(handle, "glXMakeCurrent"); |
180
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
398 this->gl_data->glXSwapBuffers = |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
399 (void (*)(Display *, GLXDrawable)) SDL_LoadFunction(handle, "glXSwapBuffers"); |
180
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
400 this->gl_data->glXGetConfig = |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
401 (int (*)(Display *, XVisualInfo *, int, int *)) SDL_LoadFunction(handle, "glXGetConfig"); |
638
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
402 this->gl_data->glXQueryExtensionsString = |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
403 (const char *(*)(Display *, int)) SDL_LoadFunction(handle, "glXQueryExtensionsString"); |
638
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
404 |
1315
e94b0d7c33bc
Merged useful fixes from 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
405 |
0 | 406 if ( (this->gl_data->glXChooseVisual == NULL) || |
407 (this->gl_data->glXCreateContext == NULL) || | |
408 (this->gl_data->glXDestroyContext == NULL) || | |
409 (this->gl_data->glXMakeCurrent == NULL) || | |
410 (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
|
411 (this->gl_data->glXGetConfig == NULL) || |
b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
566
diff
changeset
|
412 (this->gl_data->glXQueryExtensionsString == NULL)) { |
0 | 413 SDL_SetError("Could not retrieve OpenGL functions"); |
414 return -1; | |
415 } | |
416 | |
417 this->gl_config.dll_handle = handle; | |
418 this->gl_config.driver_loaded = 1; | |
419 if ( path ) { | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
420 SDL_strlcpy(this->gl_config.driver_path, path, |
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
421 SDL_arraysize(this->gl_config.driver_path)); |
0 | 422 } else { |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
423 *this->gl_config.driver_path = '\0'; |
0 | 424 } |
425 return 0; | |
426 } | |
427 | |
428 void *X11_GL_GetProcAddress(_THIS, const char* proc) | |
429 { | |
430 void* handle; | |
431 | |
432 handle = this->gl_config.dll_handle; | |
433 if ( this->gl_data->glXGetProcAddress ) { | |
1196
b81f54c3963f
Fixed compile warnings with gcc 4
Sam Lantinga <slouken@libsdl.org>
parents:
1191
diff
changeset
|
434 return this->gl_data->glXGetProcAddress((const GLubyte *)proc); |
0 | 435 } |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
436 return SDL_LoadFunction(handle, proc); |
0 | 437 } |
438 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
439 #endif /* SDL_VIDEO_OPENGL_GLX */ |