Mercurial > sdl-ios-xcode
annotate src/video/x11/SDL_x11gl.c @ 571:8e3ce997621c
Date: Thu, 16 Jan 2003 13:48:31 +0200
From: "Mike Gorchak"
Subject: All QNX patches
whole patches concerning QNX. Almost all code has been rewritten by Julian
and me. Added initial support for hw overlays in QNX and many many others
fixes.
P.S. This patches has been reviewed by Dave Rempel from QSSL and included in
SDL 1.2.5 distribution, which coming on 3rd party CD for newest 6.2.1
version of QNX, which will be available soon.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 20 Jan 2003 01:38:37 +0000 |
parents | d6e7d7006062 |
children | b0108e9dea53 |
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 ( this->gl_data->glXGetProcAddress ) { | |
566
d6e7d7006062
Enable the glXGetProcAddressARB code (fixes problems with NVidia drivers)
Sam Lantinga <slouken@libsdl.org>
parents:
450
diff
changeset
|
418 return this->gl_data->glXGetProcAddress(proc); |
0 | 419 } |
110
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
420 #if defined(__OpenBSD__) && !defined(__ELF__) |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
421 #undef dlsym(x,y); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
422 #endif |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
423 retval = dlsym(handle, proc); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
424 if (!retval && strlen(proc) <= 1022) { |
127
0bcae11eba14
Oops, that wasn't right...
Sam Lantinga <slouken@libsdl.org>
parents:
110
diff
changeset
|
425 procname[0] = '_'; |
110
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
426 strcpy(procname + 1, proc); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
427 retval = dlsym(handle, procname); |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
428 } |
7edee9f0f2cc
SDL GL dynamic loading fix for OpenBSD
Sam Lantinga <slouken@lokigames.com>
parents:
29
diff
changeset
|
429 return retval; |
0 | 430 } |
431 | |
432 #endif /* HAVE_OPENGL */ |