Mercurial > sdl-ios-xcode
annotate src/video/wincommon/SDL_wingl.c @ 610:95433459fbd2
Date: Mon, 14 Apr 2003 22:08:27 +0100
From: Patrice Mandin
Subject: [SDL][PATCH] 2 patches for sdl
Here are 2 patches for SDL:
- One is to put the dummy video drivers at the end of the
video drivers list. It gave me problems, when
SDL_VIDEODRIVER is not set, and the dummy driver is used
instead of the platform's driver, just because it is
always available. So the dummy driver must always be at
the end of the list. I suppose picogui and dc video
drivers also don't work.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 15 Apr 2003 15:46:56 +0000 |
parents | a6fa62b1be09 |
children | 9c42ee1b7d77 |
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:
0
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
22 | |
23 #ifdef SAVE_RCSID | |
24 static char rcsid = | |
25 "@(#) $Id$"; | |
26 #endif | |
27 | |
28 /* WGL implementation of SDL OpenGL support */ | |
29 | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
450
diff
changeset
|
30 #ifdef HAVE_OPENGL |
327
13fc64213765
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
31 #include "SDL_opengl.h" |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
450
diff
changeset
|
32 #endif |
0 | 33 #include "SDL_error.h" |
34 #include "SDL_lowvideo.h" | |
35 #include "SDL_wingl_c.h" | |
36 | |
37 #ifdef HAVE_OPENGL | |
38 #define DEFAULT_GL_DRIVER_PATH "OPENGL32.DLL" | |
39 #endif | |
40 | |
373
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
41 /* If setting the HDC fails, we may need to recreate the window (MSDN) */ |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
42 static int WIN_GL_ResetWindow(_THIS) |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
43 { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
44 int status = 0; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
45 int can_reset = 1; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
46 |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
47 /* If we were passed a window, then we can't create a new one */ |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
48 if ( SDL_windowid ) { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
49 can_reset = 0; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
50 } |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
51 #ifndef _WIN32_WCE /* FIXME WinCE needs the UNICODE version of CreateWindow() */ |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
52 if ( can_reset ) { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
53 /* Save the existing window attributes */ |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
54 LONG style; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
55 RECT rect = { 0, 0, 0, 0 }; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
56 style = GetWindowLong(SDL_Window, GWL_STYLE); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
57 GetWindowRect(SDL_Window, &rect); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
58 DestroyWindow(SDL_Window); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
59 SDL_Window = CreateWindow(SDL_Appname, SDL_Appname, |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
60 style, |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
61 rect.left, rect.top, |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
62 (rect.right-rect.left)+1, |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
63 (rect.top-rect.bottom)+1, |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
64 NULL, NULL, SDL_Instance, NULL); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
65 if ( SDL_Window ) { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
66 this->SetCaption(this, this->wm_title, this->wm_icon); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
67 } else { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
68 SDL_SetError("Couldn't create window"); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
69 status = -1; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
70 } |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
71 } else |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
72 #endif /* !_WIN32_WCE */ |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
73 { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
74 SDL_SetError("Unable to reset window for OpenGL context"); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
75 status = -1; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
76 } |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
77 return(status); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
78 } |
0 | 79 |
80 int WIN_GL_SetupWindow(_THIS) | |
81 { | |
82 int retval; | |
83 #ifdef HAVE_OPENGL | |
373
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
84 int i; |
0 | 85 int pixel_format; |
86 | |
87 /* load the gl driver from a default path */ | |
88 if ( ! this->gl_config.driver_loaded ) { | |
89 /* no driver has been loaded, use default (ourselves) */ | |
90 if ( WIN_GL_LoadLibrary(this, NULL) < 0 ) { | |
91 return(-1); | |
92 } | |
93 } | |
94 | |
373
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
95 for ( i=0; ; ++i ) { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
96 /* Get the window device context for our OpenGL drawing */ |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
97 GL_hdc = GetDC(SDL_Window); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
98 if ( GL_hdc == NULL ) { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
99 SDL_SetError("Unable to get DC for SDL_Window"); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
100 return(-1); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
101 } |
0 | 102 |
373
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
103 /* Set up the pixel format descriptor with our needed format */ |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
104 memset(&GL_pfd, 0, sizeof(GL_pfd)); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
105 GL_pfd.nSize = sizeof(GL_pfd); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
106 GL_pfd.nVersion = 1; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
107 GL_pfd.dwFlags = (PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
108 if ( this->gl_config.double_buffer ) { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
109 GL_pfd.dwFlags |= PFD_DOUBLEBUFFER; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
110 } |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
373
diff
changeset
|
111 if ( this->gl_config.stereo ) { |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
373
diff
changeset
|
112 GL_pfd.dwFlags |= PFD_STEREO; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
373
diff
changeset
|
113 } |
373
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
114 GL_pfd.iPixelType = PFD_TYPE_RGBA; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
115 GL_pfd.cColorBits = this->gl_config.buffer_size; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
116 GL_pfd.cRedBits = this->gl_config.red_size; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
117 GL_pfd.cGreenBits = this->gl_config.green_size; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
118 GL_pfd.cBlueBits = this->gl_config.blue_size; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
119 GL_pfd.cAlphaBits = this->gl_config.alpha_size; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
120 GL_pfd.cAccumRedBits = this->gl_config.accum_red_size; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
121 GL_pfd.cAccumGreenBits = this->gl_config.accum_green_size; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
122 GL_pfd.cAccumBlueBits = this->gl_config.accum_blue_size; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
123 GL_pfd.cAccumAlphaBits = this->gl_config.accum_alpha_size; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
124 GL_pfd.cAccumBits = |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
125 (GL_pfd.cAccumRedBits + GL_pfd.cAccumGreenBits + |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
126 GL_pfd.cAccumBlueBits + GL_pfd.cAccumAlphaBits); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
127 GL_pfd.cDepthBits = this->gl_config.depth_size; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
128 GL_pfd.cStencilBits = this->gl_config.stencil_size; |
0 | 129 |
373
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
130 /* Choose and set the closest available pixel format */ |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
131 pixel_format = ChoosePixelFormat(GL_hdc, &GL_pfd); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
132 if ( !pixel_format ) { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
133 SDL_SetError("No matching GL pixel format available"); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
134 return(-1); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
135 } |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
136 if( !SetPixelFormat(GL_hdc, pixel_format, &GL_pfd) ) { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
137 if ( i == 0 ) { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
138 /* First time through, try resetting the window */ |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
139 if ( WIN_GL_ResetWindow(this) < 0 ) { |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
140 return(-1); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
141 } |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
142 continue; |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
143 } |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
144 SDL_SetError("Unable to set HDC pixel format"); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
145 return(-1); |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
146 } |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
147 /* We either succeeded or failed by this point */ |
c638fde8a824
Fixed setting OpenGL mode multiple times on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
327
diff
changeset
|
148 break; |
0 | 149 } |
150 DescribePixelFormat(GL_hdc, pixel_format, sizeof(GL_pfd), &GL_pfd); | |
151 | |
152 GL_hrc = this->gl_data->wglCreateContext(GL_hdc); | |
153 if( GL_hrc == NULL ) { | |
154 SDL_SetError("Unable to create GL context"); | |
155 return(-1); | |
156 } | |
157 gl_active = 1; | |
158 #else | |
159 SDL_SetError("WIN driver not configured with OpenGL"); | |
160 #endif | |
161 if ( gl_active ) { | |
162 retval = 0; | |
163 } else { | |
164 retval = -1; | |
165 } | |
166 return(retval); | |
167 } | |
168 | |
169 void WIN_GL_ShutDown(_THIS) | |
170 { | |
171 #ifdef HAVE_OPENGL | |
172 /* Clean up OpenGL */ | |
173 if ( GL_hrc ) { | |
174 this->gl_data->wglMakeCurrent(NULL, NULL); | |
175 this->gl_data->wglDeleteContext(GL_hrc); | |
176 GL_hrc = NULL; | |
177 } | |
178 if ( GL_hdc ) { | |
179 ReleaseDC(SDL_Window, GL_hdc); | |
180 GL_hdc = NULL; | |
181 } | |
182 gl_active = 0; | |
183 | |
184 WIN_GL_UnloadLibrary(this); | |
185 #endif /* HAVE_OPENGL */ | |
186 } | |
187 | |
188 #ifdef HAVE_OPENGL | |
189 | |
190 /* Make the current context active */ | |
191 int WIN_GL_MakeCurrent(_THIS) | |
192 { | |
193 int retval; | |
194 | |
195 retval = 0; | |
196 if ( ! this->gl_data->wglMakeCurrent(GL_hdc, GL_hrc) ) { | |
197 SDL_SetError("Unable to make GL context current"); | |
198 retval = -1; | |
199 } | |
200 return(retval); | |
201 } | |
202 | |
203 /* Get attribute data from glX. */ | |
204 int WIN_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) | |
205 { | |
206 int retval; | |
207 | |
208 retval = 0; | |
209 switch( attrib ) { | |
210 case SDL_GL_RED_SIZE: | |
211 *value = GL_pfd.cRedBits; | |
212 break; | |
213 case SDL_GL_GREEN_SIZE: | |
214 *value = GL_pfd.cGreenBits; | |
215 break; | |
216 case SDL_GL_BLUE_SIZE: | |
217 *value = GL_pfd.cBlueBits; | |
218 break; | |
219 case SDL_GL_ALPHA_SIZE: | |
220 *value = GL_pfd.cAlphaBits; | |
221 break; | |
222 case SDL_GL_DOUBLEBUFFER: | |
223 if ( GL_pfd.dwFlags & PFD_DOUBLEBUFFER ) { | |
224 *value = 1; | |
225 } else { | |
226 *value = 0; | |
227 } | |
228 break; | |
229 case SDL_GL_BUFFER_SIZE: | |
230 *value = GL_pfd.cColorBits; | |
231 break; | |
232 case SDL_GL_DEPTH_SIZE: | |
233 *value = GL_pfd.cDepthBits; | |
234 break; | |
235 case SDL_GL_STENCIL_SIZE: | |
236 *value = GL_pfd.cStencilBits; | |
237 break; | |
238 case SDL_GL_ACCUM_RED_SIZE: | |
239 *value = GL_pfd.cAccumRedBits; | |
240 break; | |
241 case SDL_GL_ACCUM_GREEN_SIZE: | |
242 *value = GL_pfd.cAccumGreenBits; | |
243 break; | |
244 case SDL_GL_ACCUM_BLUE_SIZE: | |
245 *value = GL_pfd.cAccumBlueBits; | |
246 break; | |
247 case SDL_GL_ACCUM_ALPHA_SIZE: | |
248 *value = GL_pfd.cAccumAlphaBits; | |
249 break; | |
450
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
373
diff
changeset
|
250 case SDL_GL_STEREO: |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
373
diff
changeset
|
251 if ( GL_pfd.dwFlags & PFD_STEREO ) { |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
373
diff
changeset
|
252 *value = 1; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
373
diff
changeset
|
253 } else { |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
373
diff
changeset
|
254 *value = 0; |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
373
diff
changeset
|
255 } |
8a43e0cbf02f
Added SDL_GL_STEREO for stereoscopic OpenGL contexts
Sam Lantinga <slouken@libsdl.org>
parents:
373
diff
changeset
|
256 break; |
0 | 257 default: |
258 retval = -1; | |
259 break; | |
260 } | |
261 return retval; | |
262 } | |
263 | |
264 void WIN_GL_SwapBuffers(_THIS) | |
265 { | |
266 SwapBuffers(GL_hdc); | |
267 } | |
268 | |
269 void WIN_GL_UnloadLibrary(_THIS) | |
270 { | |
271 if ( this->gl_config.driver_loaded ) { | |
272 FreeLibrary((HMODULE)this->gl_config.dll_handle); | |
273 | |
274 this->gl_data->wglGetProcAddress = NULL; | |
275 this->gl_data->wglCreateContext = NULL; | |
276 this->gl_data->wglDeleteContext = NULL; | |
277 this->gl_data->wglMakeCurrent = NULL; | |
278 | |
279 this->gl_config.dll_handle = NULL; | |
280 this->gl_config.driver_loaded = 0; | |
281 } | |
282 } | |
283 | |
284 /* Passing a NULL path means load pointers from the application */ | |
285 int WIN_GL_LoadLibrary(_THIS, const char* path) | |
286 { | |
287 HMODULE handle; | |
288 | |
289 if ( gl_active ) { | |
290 SDL_SetError("OpenGL context already created"); | |
291 return -1; | |
292 } | |
293 | |
294 if ( path == NULL ) { | |
295 path = DEFAULT_GL_DRIVER_PATH; | |
296 } | |
297 handle = LoadLibrary(path); | |
298 if ( handle == NULL ) { | |
299 SDL_SetError("Could not load OpenGL library"); | |
300 return -1; | |
301 } | |
302 | |
303 /* Unload the old driver and reset the pointers */ | |
304 WIN_GL_UnloadLibrary(this); | |
305 | |
306 /* Load new function pointers */ | |
307 this->gl_data->wglGetProcAddress = (void * (WINAPI *)(const char *)) | |
308 GetProcAddress(handle, "wglGetProcAddress"); | |
309 this->gl_data->wglCreateContext = (HGLRC (WINAPI *)(HDC)) | |
310 GetProcAddress(handle, "wglCreateContext"); | |
311 this->gl_data->wglDeleteContext = (BOOL (WINAPI *)(HGLRC)) | |
312 GetProcAddress(handle, "wglDeleteContext"); | |
313 this->gl_data->wglMakeCurrent = (BOOL (WINAPI *)(HDC, HGLRC)) | |
314 GetProcAddress(handle, "wglMakeCurrent"); | |
315 | |
316 if ( (this->gl_data->wglGetProcAddress == NULL) || | |
317 (this->gl_data->wglCreateContext == NULL) || | |
318 (this->gl_data->wglDeleteContext == NULL) || | |
319 (this->gl_data->wglMakeCurrent == NULL) ) { | |
320 SDL_SetError("Could not retrieve OpenGL functions"); | |
321 FreeLibrary(handle); | |
322 return -1; | |
323 } | |
324 | |
325 this->gl_config.dll_handle = handle; | |
326 strcpy(this->gl_config.driver_path, path); | |
327 this->gl_config.driver_loaded = 1; | |
328 return 0; | |
329 } | |
330 | |
331 void *WIN_GL_GetProcAddress(_THIS, const char* proc) | |
332 { | |
333 void *func; | |
334 | |
335 /* This is to pick up extensions */ | |
336 func = this->gl_data->wglGetProcAddress(proc); | |
337 if ( ! func ) { | |
338 /* This is probably a normal GL function */ | |
339 func = GetProcAddress(this->gl_config.dll_handle, proc); | |
340 } | |
341 return func; | |
342 } | |
343 | |
344 #endif /* HAVE_OPENGL */ |