Mercurial > sdl-ios-xcode
annotate src/video/x11/SDL_x11gl.c @ 563:04dcaf3da918
Massive Quartz input enhancements from Darrell Walisser. His email:
Enclosed is a patch that addresses the following:
--Various minor cleanups.
Removed dead/obsolete code, made some style cleanups
--Mouse Events
Now keep track of what button(s) were pressed so we know when to send
the mouse up event. This fixes the case where the mouse is dragged
outside of the game window and released (in which case we want to send
the mouse up event even though the mouse is outside the game window).
--Input Grabbing
Here is my take on the grabbing situation, which is the basis for the
new implementation.
There are 3 grab states, ungrabbed (UG), visible (VG), and invisible
(IG). Both VG and IG keep the mouse constrained to the window and
produce relative motion events. In VG the cursor is visible (duh), in
IG it is not. In VG, absolute motion events also work.
There are 6 actions that can affect grabbing:
1. Set Fullscreen/Window (F/W). In fullscreen, a visible grab should do
nothing. However, a fullscreen visible grab can be treated just like a
windowed visible grab, which is what I have done to help simplify
things.
2. Cursor hide/show (H/S). If the cursor is hidden when grabbing, the
grab is an invisible grab. If the cursor is visible, the grab should
just constrain the mouse to the window.
3. Input grab/ungrab(G/U). If grabbed, the cursor should be confined to
the window as should the keyboard input. On Mac OS X, the keyboard
input is implicitly grabbed by confining the cursor, except for
command-tab which can switch away from the application. Should the
window come to the foreground if the application is deactivated and
grab input is called? This isn't necessary in this implementation
because the grab state will be asserted upon activation.
Using my notation, these are all the cases that need to be handled
(state + action = new state).
UG+U = UG
UG+G = VG or IG, if cursor is visible or not
UG+H = UG
UG+S = UG
VG+U = UG
VG+G = VG
VG+H = IG
VG+S = VG
IG+U = UG
IG+G = IG
IG+H = IG
IG+S = VG
The cases that result in the same state can be ignored in the code,
which cuts it down to just 5 cases.
Another issue is what happens when the app loses/gains input focus from
deactivate/activate or iconify/deiconify. I think that if input focus
is ever lost (outside of SDL's control), the grab state should be
suspended and the cursor should become visible and active again. When
regained, the cursor should reappear in its original location and/or
grab state. This way, when reactivating the cursor is still in the same
position as before so apps shouldn't get confused when the next motion
event comes in. This is what I've done in this patch.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Fri, 27 Dec 2002 20:52:41 +0000 |
parents | 8a43e0cbf02f |
children | d6e7d7006062 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
297
f6ffac90895c
Updated copyright information for 2002
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 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 | |
37 #define DEFAULT_OPENGL "libGL.so.1" | |
38 | |
39 /* return the preferred visual to use for openGL graphics */ | |
40 XVisualInfo *X11_GL_GetVisual(_THIS) | |
41 { | |
42 #ifdef HAVE_OPENGL | |
43 /* 64 seems nice. */ | |
44 int attribs[64]; | |
45 int i; | |
46 | |
47 /* load the gl driver from a default path */ | |
48 if ( ! this->gl_config.driver_loaded ) { | |
49 /* no driver has been loaded, use default (ourselves) */ | |
50 if ( X11_GL_LoadLibrary(this, NULL) < 0 ) { | |
51 return NULL; | |
52 } | |
53 } | |
54 | |
55 /* See if we already have a window which we must use */ | |
56 if ( SDL_windowid ) { | |
57 XWindowAttributes a; | |
58 XVisualInfo vi_in; | |
59 int out_count; | |
60 | |
61 XGetWindowAttributes(SDL_Display, SDL_Window, &a); | |
62 vi_in.screen = SDL_Screen; | |
63 vi_in.visualid = XVisualIDFromVisual(a.visual); | |
64 glx_visualinfo = XGetVisualInfo(SDL_Display, | |
65 VisualScreenMask|VisualIDMask, &vi_in, &out_count); | |
66 return glx_visualinfo; | |
67 } | |
68 | |
69 /* 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
|
70 i = 0; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
71 attribs[i++] = GLX_RGBA; |
0 | 72 attribs[i++] = GLX_RED_SIZE; |
73 attribs[i++] = this->gl_config.red_size; | |
74 attribs[i++] = GLX_GREEN_SIZE; | |
75 attribs[i++] = this->gl_config.green_size; | |
76 attribs[i++] = GLX_BLUE_SIZE; | |
77 attribs[i++] = this->gl_config.blue_size; | |
78 | |
79 if( this->gl_config.alpha_size ) { | |
80 attribs[i++] = GLX_ALPHA_SIZE; | |
81 attribs[i++] = this->gl_config.alpha_size; | |
82 } | |
83 | |
84 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
|
85 attribs[i++] = GLX_BUFFER_SIZE; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
86 attribs[i++] = this->gl_config.buffer_size; |
0 | 87 } |
88 | |
89 if( this->gl_config.double_buffer ) { | |
90 attribs[i++] = GLX_DOUBLEBUFFER; | |
91 } | |
92 | |
93 attribs[i++] = GLX_DEPTH_SIZE; | |
94 attribs[i++] = this->gl_config.depth_size; | |
95 | |
96 if( this->gl_config.stencil_size ) { | |
97 attribs[i++] = GLX_STENCIL_SIZE; | |
98 attribs[i++] = this->gl_config.stencil_size; | |
99 } | |
100 | |
101 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
|
102 attribs[i++] = GLX_ACCUM_RED_SIZE; |
0 | 103 attribs[i++] = this->gl_config.accum_red_size; |
104 } | |
105 | |
106 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
|
107 attribs[i++] = GLX_ACCUM_GREEN_SIZE; |
0 | 108 attribs[i++] = this->gl_config.accum_green_size; |
109 } | |
110 | |
111 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
|
112 attribs[i++] = GLX_ACCUM_BLUE_SIZE; |
0 | 113 attribs[i++] = this->gl_config.accum_blue_size; |
114 } | |
115 | |
116 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
|
117 attribs[i++] = GLX_ACCUM_ALPHA_SIZE; |
0 | 118 attribs[i++] = this->gl_config.accum_alpha_size; |
119 } | |
120 | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
121 if( this->gl_config.stereo ) { |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
122 attribs[i++] = GLX_STEREO; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
123 attribs[i++] = this->gl_config.stereo; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
124 } |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
125 |
0 | 126 #ifdef GLX_DIRECT_COLOR /* Try for a DirectColor visual for gamma support */ |
127 attribs[i++] = GLX_X_VISUAL_TYPE; | |
128 attribs[i++] = GLX_DIRECT_COLOR; | |
129 #endif | |
130 attribs[i++] = None; | |
131 | |
132 glx_visualinfo = this->gl_data->glXChooseVisual(GFX_Display, | |
133 SDL_Screen, attribs); | |
134 #ifdef GLX_DIRECT_COLOR | |
135 if( !glx_visualinfo ) { /* No DirectColor visual? Try again.. */ | |
136 attribs[i-3] = None; | |
137 glx_visualinfo = this->gl_data->glXChooseVisual(GFX_Display, | |
138 SDL_Screen, attribs); | |
139 } | |
140 #endif | |
141 if( !glx_visualinfo ) { | |
142 SDL_SetError( "Couldn't find matching GLX visual"); | |
143 return NULL; | |
144 } | |
145 return glx_visualinfo; | |
146 #else | |
147 SDL_SetError("X11 driver not configured with OpenGL"); | |
148 return NULL; | |
149 #endif | |
150 } | |
151 | |
152 int X11_GL_CreateWindow(_THIS, int w, int h) | |
153 { | |
154 int retval; | |
155 #ifdef HAVE_OPENGL | |
156 XSetWindowAttributes attributes; | |
157 unsigned long mask; | |
158 unsigned long black; | |
159 | |
160 black = (glx_visualinfo->visual == DefaultVisual(SDL_Display, | |
161 SDL_Screen)) | |
162 ? BlackPixel(SDL_Display, SDL_Screen) : 0; | |
163 attributes.background_pixel = black; | |
164 attributes.border_pixel = black; | |
165 attributes.colormap = SDL_XColorMap; | |
166 mask = CWBackPixel | CWBorderPixel | CWColormap; | |
167 | |
168 SDL_Window = XCreateWindow(SDL_Display, WMwindow, | |
169 0, 0, w, h, 0, glx_visualinfo->depth, | |
170 InputOutput, glx_visualinfo->visual, | |
171 mask, &attributes); | |
172 if ( !SDL_Window ) { | |
173 SDL_SetError("Could not create window"); | |
174 return -1; | |
175 } | |
176 retval = 0; | |
177 #else | |
178 SDL_SetError("X11 driver not configured with OpenGL"); | |
179 retval = -1; | |
180 #endif | |
181 return(retval); | |
182 } | |
183 | |
184 int X11_GL_CreateContext(_THIS) | |
185 { | |
186 int retval; | |
187 #ifdef HAVE_OPENGL | |
188 /* We do this to create a clean separation between X and GLX errors. */ | |
189 XSync( SDL_Display, False ); | |
190 glx_context = this->gl_data->glXCreateContext(GFX_Display, | |
191 glx_visualinfo, NULL, True); | |
192 XSync( GFX_Display, False ); | |
193 | |
194 if (glx_context == NULL) { | |
195 SDL_SetError("Could not create GL context"); | |
196 return -1; | |
197 } | |
198 | |
199 gl_active = 1; | |
200 #else | |
201 SDL_SetError("X11 driver not configured with OpenGL"); | |
202 #endif | |
203 if ( gl_active ) { | |
204 retval = 0; | |
205 } else { | |
206 retval = -1; | |
207 } | |
208 return(retval); | |
209 } | |
210 | |
211 void X11_GL_Shutdown(_THIS) | |
212 { | |
213 #ifdef HAVE_OPENGL | |
214 /* Clean up OpenGL */ | |
215 if( glx_context ) { | |
216 this->gl_data->glXMakeCurrent(GFX_Display, None, NULL); | |
217 | |
218 if (glx_context != NULL) | |
219 this->gl_data->glXDestroyContext(GFX_Display, glx_context); | |
220 | |
221 if( this->gl_data->glXReleaseBuffersMESA ) { | |
222 this->gl_data->glXReleaseBuffersMESA(GFX_Display,SDL_Window); | |
223 } | |
224 glx_context = NULL; | |
225 } | |
226 gl_active = 0; | |
227 #endif /* HAVE_OPENGL */ | |
228 } | |
229 | |
230 #ifdef HAVE_OPENGL | |
231 | |
232 /* Make the current context active */ | |
233 int X11_GL_MakeCurrent(_THIS) | |
234 { | |
235 int retval; | |
236 | |
237 retval = 0; | |
238 if ( ! this->gl_data->glXMakeCurrent(GFX_Display, | |
239 SDL_Window, glx_context) ) { | |
240 SDL_SetError("Unable to make GL context current"); | |
241 retval = -1; | |
242 } | |
243 XSync( GFX_Display, False ); | |
244 | |
245 /* More Voodoo X server workarounds... Grr... */ | |
246 SDL_Lock_EventThread(); | |
247 X11_CheckDGAMouse(this); | |
248 SDL_Unlock_EventThread(); | |
249 | |
250 return(retval); | |
251 } | |
252 | |
253 /* Get attribute data from glX. */ | |
254 int X11_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) | |
255 { | |
256 int retval; | |
257 int glx_attrib = None; | |
258 | |
259 switch( attrib ) { | |
260 case SDL_GL_RED_SIZE: | |
261 glx_attrib = GLX_RED_SIZE; | |
262 break; | |
263 case SDL_GL_GREEN_SIZE: | |
264 glx_attrib = GLX_GREEN_SIZE; | |
265 break; | |
266 case SDL_GL_BLUE_SIZE: | |
267 glx_attrib = GLX_BLUE_SIZE; | |
268 break; | |
269 case SDL_GL_ALPHA_SIZE: | |
270 glx_attrib = GLX_ALPHA_SIZE; | |
271 break; | |
272 case SDL_GL_DOUBLEBUFFER: | |
273 glx_attrib = GLX_DOUBLEBUFFER; | |
274 break; | |
275 case SDL_GL_BUFFER_SIZE: | |
276 glx_attrib = GLX_BUFFER_SIZE; | |
277 break; | |
278 case SDL_GL_DEPTH_SIZE: | |
279 glx_attrib = GLX_DEPTH_SIZE; | |
280 break; | |
281 case SDL_GL_STENCIL_SIZE: | |
282 glx_attrib = GLX_STENCIL_SIZE; | |
283 break; | |
284 case SDL_GL_ACCUM_RED_SIZE: | |
285 glx_attrib = GLX_ACCUM_RED_SIZE; | |
286 break; | |
287 case SDL_GL_ACCUM_GREEN_SIZE: | |
288 glx_attrib = GLX_ACCUM_GREEN_SIZE; | |
289 break; | |
290 case SDL_GL_ACCUM_BLUE_SIZE: | |
291 glx_attrib = GLX_ACCUM_BLUE_SIZE; | |
292 break; | |
293 case SDL_GL_ACCUM_ALPHA_SIZE: | |
294 glx_attrib = GLX_ACCUM_ALPHA_SIZE; | |
295 break; | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
296 case SDL_GL_STEREO: |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
297 glx_attrib = GLX_STEREO; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
298 break; |
0 | 299 default: |
300 return(-1); | |
301 } | |
302 | |
303 retval = this->gl_data->glXGetConfig(GFX_Display, glx_visualinfo, glx_attrib, value); | |
304 | |
305 return retval; | |
306 } | |
307 | |
308 void X11_GL_SwapBuffers(_THIS) | |
309 { | |
310 this->gl_data->glXSwapBuffers(GFX_Display, SDL_Window); | |
311 } | |
312 | |
313 #endif /* HAVE_OPENGL */ | |
314 | |
315 void X11_GL_UnloadLibrary(_THIS) | |
316 { | |
317 #ifdef HAVE_OPENGL | |
318 if ( this->gl_config.driver_loaded ) { | |
319 dlclose(this->gl_config.dll_handle); | |
320 | |
321 this->gl_data->glXGetProcAddress = NULL; | |
322 this->gl_data->glXChooseVisual = NULL; | |
323 this->gl_data->glXCreateContext = NULL; | |
324 this->gl_data->glXDestroyContext = NULL; | |
325 this->gl_data->glXMakeCurrent = NULL; | |
326 this->gl_data->glXSwapBuffers = NULL; | |
327 | |
328 this->gl_config.dll_handle = NULL; | |
329 this->gl_config.driver_loaded = 0; | |
330 } | |
331 #endif | |
332 } | |
333 | |
334 #ifdef HAVE_OPENGL | |
335 | |
336 /* Passing a NULL path means load pointers from the application */ | |
337 int X11_GL_LoadLibrary(_THIS, const char* path) | |
338 { | |
339 void* handle; | |
340 int dlopen_flags; | |
341 | |
342 if ( gl_active ) { | |
343 SDL_SetError("OpenGL context already created"); | |
344 return -1; | |
345 } | |
346 | |
347 #ifdef RTLD_GLOBAL | |
348 dlopen_flags = RTLD_LAZY | RTLD_GLOBAL; | |
349 #else | |
350 dlopen_flags = RTLD_LAZY; | |
351 #endif | |
352 handle = dlopen(path, dlopen_flags); | |
353 /* Catch the case where the application isn't linked with GL */ | |
354 if ( (dlsym(handle, "glXChooseVisual") == NULL) && (path == NULL) ) { | |
355 dlclose(handle); | |
356 path = getenv("SDL_VIDEO_GL_DRIVER"); | |
357 if ( path == NULL ) { | |
358 path = DEFAULT_OPENGL; | |
359 } | |
360 handle = dlopen(path, dlopen_flags); | |
361 } | |
362 if ( handle == NULL ) { | |
363 SDL_SetError("Could not load OpenGL library"); | |
364 return -1; | |
365 } | |
366 | |
367 /* Unload the old driver and reset the pointers */ | |
368 X11_GL_UnloadLibrary(this); | |
369 | |
370 /* Load new function pointers */ | |
180
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
371 this->gl_data->glXGetProcAddress = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
372 (void *(*)(const GLubyte *)) dlsym(handle, "glXGetProcAddressARB"); |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
373 this->gl_data->glXChooseVisual = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
374 (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
|
375 this->gl_data->glXCreateContext = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
376 (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
|
377 this->gl_data->glXDestroyContext = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
378 (void (*)(Display *, GLXContext)) dlsym(handle, "glXDestroyContext"); |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
379 this->gl_data->glXMakeCurrent = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
380 (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
|
381 this->gl_data->glXSwapBuffers = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
382 (void (*)(Display *, GLXDrawable)) dlsym(handle, "glXSwapBuffers"); |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
383 this->gl_data->glXGetConfig = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
384 (int (*)(Display *, XVisualInfo *, int, int *)) dlsym(handle, "glXGetConfig"); |
0 | 385 /* 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
|
386 this->gl_data->glXReleaseBuffersMESA = |
578815880307
Do proper typecasting so this compiles on IRIX
Sam Lantinga <slouken@libsdl.org>
parents:
127
diff
changeset
|
387 (void (*)(Display *, GLXDrawable)) dlsym( handle, "glXReleaseBuffersMESA" ); |
0 | 388 |
389 if ( (this->gl_data->glXChooseVisual == NULL) || | |
390 (this->gl_data->glXCreateContext == NULL) || | |
391 (this->gl_data->glXDestroyContext == NULL) || | |
392 (this->gl_data->glXMakeCurrent == NULL) || | |
393 (this->gl_data->glXSwapBuffers == NULL) || | |
394 (this->gl_data->glXGetConfig == NULL) ) { | |
395 SDL_SetError("Could not retrieve OpenGL functions"); | |
396 return -1; | |
397 } | |
398 | |
399 this->gl_config.dll_handle = handle; | |
400 this->gl_config.driver_loaded = 1; | |
401 if ( path ) { | |
402 strncpy(this->gl_config.driver_path, path, | |
403 sizeof(this->gl_config.driver_path)-1); | |
404 } else { | |
405 strcpy(this->gl_config.driver_path, ""); | |
406 } | |
407 return 0; | |
408 } | |
409 | |
410 void *X11_GL_GetProcAddress(_THIS, const char* proc) | |
411 { | |
110
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
412 static char procname[1024]; |
0 | 413 void* handle; |
110
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
414 void* retval; |
0 | 415 |
416 handle = this->gl_config.dll_handle; | |
417 #if 0 /* This doesn't work correctly yet */ | |
418 if ( this->gl_data->glXGetProcAddress ) { | |
419 void *func, *func2; | |
420 func = this->gl_data->glXGetProcAddress(proc); | |
421 func2 = dlsym(handle, proc); | |
422 if ( func != func2 ) { | |
423 fprintf(stderr, "glXGetProcAddress returned %p and dlsym returned %p for %s\n", func, func2, proc); | |
424 } | |
425 return this->gl_data->glXGetProcAddress(proc); | |
426 } | |
427 #endif | |
110
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
428 #if defined(__OpenBSD__) && !defined(__ELF__) |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
429 #undef dlsym(x,y); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
430 #endif |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
431 retval = dlsym(handle, proc); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
432 if (!retval && strlen(proc) <= 1022) { |
127
0bcae11eba14
Oops, that wasn't right...
Sam Lantinga <slouken@libsdl.org>
parents:
110
diff
changeset
|
433 procname[0] = '_'; |
110
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
434 strcpy(procname + 1, proc); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
435 retval = dlsym(handle, procname); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
436 } |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
437 return retval; |
0 | 438 } |
439 | |
440 #endif /* HAVE_OPENGL */ |