Mercurial > sdl-ios-xcode
annotate src/video/maccommon/SDL_macgl.c @ 4167:a6f635e5eaa6 SDL-1.2
Fixed bug #611
From Tim Angus 2008-08-12 11:18:06
I'm one of the maintainers of ioquake3.org, an updated version of the
Quake 3 engine. Relatively recently, we moved ioq3 to use SDL as a
replacement for 95% of the platform specific code that was there. On the
whole it's doing a great job but unfortunately since the move we've been
getting complaints about the quality of the mouse input on the Windows
platform to the point where for many the game is unplayable. Put in
other terms, the current stable SDL 1.2 is basically not fit for purpose
if you need high quality mouse input as you do in a first person shooter.
Over the weekend I decided to pull my finger out and actually figure out
what's going on. There are basically two major problems. Firstly, when
using the "windib" driver, mouse input is gathered via the WM_MOUSEMOVE
message. Googling for this indicates that often this is known to result
in "spurious" and/or "missing" mouse movement events; this is the
primary cause of the poor mouse input. The second problem is that the
"directx" driver does not work at all in combination with OpenGL meaning
that you can't use DirectInput if your application also uses OpenGL. In
other words you're locked into using the "windib" driver and its poor
mouse input.
In order to address these problems I've done the following:
* Remove WM_MOUSEMOVE based motion event generation and replace with
calls to GetCursorPos which seems much more reliable. In order to
achieve this I've moved mouse motion out into a separate function that
is called once per DIB_PumpEvents.
* Remove the restriction on the "directx" driver being inoperable in
combination with OpenGL. There is a bug for this issues that I've
hijacked to a certain extent
(http://bugzilla.libsdl.org/show_bug.cgi?id=265). I'm the first to admit
I don't really understand why this restriction is there in the first
place. The commit message for the bug fix that introduced this
restriction (r581) isn't very elaborate and I couldn't see any other bug
tracking the issue. If anyone has more information on the bug that was
avoided by r581 it would be helpful as I/someone could then look into
addressing the problem without disabling the "directx" driver.
* I've also removed the restriction on not being allowed to use
DirectInput in windowed mode. I couldn't see any reason for this, at
least not from our perspective. I have my suspicions that it'll be
something like matching up the cursor with the mouse coordinates...
* I bumped up the DirectInput API used to version 7 in order to get
access to mouse buttons 4-7. I've had to inject a little bit of the DX7
headers into SDL there as the MinGW ones aren't up to date in this respect.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Thu, 02 Apr 2009 04:43:36 +0000 |
parents | a1b03ba2fcd0 |
children |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
4159 | 3 Copyright (C) 1997-2009 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:
774
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:
774
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:
774
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:
774
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:
774
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:
774
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:
0
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:
1361
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 /* AGL implementation of SDL OpenGL support */ | |
25 | |
26 #include "SDL_lowvideo.h" | |
27 #include "SDL_macgl_c.h" | |
774
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
28 #include "SDL_loadso.h" |
0 | 29 |
30 | |
31 /* krat: adding OpenGL support */ | |
32 int Mac_GL_Init(_THIS) | |
33 { | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
34 #if SDL_VIDEO_OPENGL |
0 | 35 AGLPixelFormat format; |
36 int i = 0; | |
1737 | 37 GLint attributes [ 26 ]; /* 26 is max possible in this setup */ |
0 | 38 GLboolean noerr; |
39 | |
1437
f1781c15934c
Make sure the OpenGL library is loaded before setting up OpenGL
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
40 /* load the gl driver from a default path */ |
f1781c15934c
Make sure the OpenGL library is loaded before setting up OpenGL
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
41 if ( ! this->gl_config.driver_loaded ) { |
f1781c15934c
Make sure the OpenGL library is loaded before setting up OpenGL
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
42 /* no driver has been loaded, use default (ourselves) */ |
f1781c15934c
Make sure the OpenGL library is loaded before setting up OpenGL
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
43 if ( Mac_GL_LoadLibrary(this, NULL) < 0 ) { |
f1781c15934c
Make sure the OpenGL library is loaded before setting up OpenGL
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
44 return(-1); |
f1781c15934c
Make sure the OpenGL library is loaded before setting up OpenGL
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
45 } |
f1781c15934c
Make sure the OpenGL library is loaded before setting up OpenGL
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
46 } |
f1781c15934c
Make sure the OpenGL library is loaded before setting up OpenGL
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
47 |
0 | 48 attributes[i++] = AGL_RGBA; |
49 if ( this->gl_config.red_size != 0 && | |
50 this->gl_config.blue_size != 0 && | |
51 this->gl_config.green_size != 0 ) { | |
52 attributes[i++] = AGL_RED_SIZE; | |
53 attributes[i++] = this->gl_config.red_size; | |
54 attributes[i++] = AGL_GREEN_SIZE; | |
55 attributes[i++] = this->gl_config.green_size; | |
56 attributes[i++] = AGL_BLUE_SIZE; | |
57 attributes[i++] = this->gl_config.blue_size; | |
58 attributes[i++] = AGL_ALPHA_SIZE; | |
59 attributes[i++] = this->gl_config.alpha_size; | |
60 } | |
706
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
61 if ( this->gl_config.double_buffer ) { |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
62 attributes[i++] = AGL_DOUBLEBUFFER; |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
63 } |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
64 if ( this->gl_config.depth_size != 0 ) { |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
65 attributes[i++] = AGL_DEPTH_SIZE; |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
66 attributes[i++] = this->gl_config.depth_size; |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
67 } |
0 | 68 if ( this->gl_config.stencil_size != 0 ) { |
69 attributes[i++] = AGL_STENCIL_SIZE; | |
70 attributes[i++] = this->gl_config.stencil_size; | |
71 } | |
72 if ( this->gl_config.accum_red_size != 0 && | |
73 this->gl_config.accum_blue_size != 0 && | |
74 this->gl_config.accum_green_size != 0 ) { | |
75 | |
76 attributes[i++] = AGL_ACCUM_RED_SIZE; | |
77 attributes[i++] = this->gl_config.accum_red_size; | |
78 attributes[i++] = AGL_ACCUM_GREEN_SIZE; | |
79 attributes[i++] = this->gl_config.accum_green_size; | |
80 attributes[i++] = AGL_ACCUM_BLUE_SIZE; | |
81 attributes[i++] = this->gl_config.accum_blue_size; | |
82 attributes[i++] = AGL_ACCUM_ALPHA_SIZE; | |
83 attributes[i++] = this->gl_config.accum_alpha_size; | |
84 } | |
706
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
85 if ( this->gl_config.stereo ) { |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
86 attributes[i++] = AGL_STEREO; |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
87 } |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
88 #if defined(AGL_SAMPLE_BUFFERS_ARB) && defined(AGL_SAMPLES_ARB) |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
89 if ( this->gl_config.multisamplebuffers != 0 ) { |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
90 attributes[i++] = AGL_SAMPLE_BUFFERS_ARB; |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
91 attributes[i++] = this->gl_config.multisamplebuffers; |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
92 } |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
93 if ( this->gl_config.multisamplesamples != 0 ) { |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
94 attributes[i++] = AGL_SAMPLES_ARB; |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
95 attributes[i++] = this->gl_config.multisamplesamples; |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
96 } |
a33b7819b917
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
656
diff
changeset
|
97 #endif |
1737 | 98 if ( this->gl_config.accelerated > 0 ) { |
99 attributes[i++] = AGL_ACCELERATED; | |
100 attributes[i++] = AGL_NO_RECOVERY; | |
101 } | |
102 | |
0 | 103 attributes[i++] = AGL_ALL_RENDERERS; |
104 attributes[i] = AGL_NONE; | |
105 | |
106 format = aglChoosePixelFormat(NULL, 0, attributes); | |
107 if ( format == NULL ) { | |
108 SDL_SetError("Couldn't match OpenGL desired format"); | |
109 return(-1); | |
110 } | |
111 | |
112 glContext = aglCreateContext(format, NULL); | |
113 if ( glContext == NULL ) { | |
114 SDL_SetError("Couldn't create OpenGL context"); | |
115 return(-1); | |
116 } | |
117 aglDestroyPixelFormat(format); | |
118 | |
119 #if TARGET_API_MAC_CARBON | |
1437
f1781c15934c
Make sure the OpenGL library is loaded before setting up OpenGL
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
120 noerr = aglSetDrawable(glContext, GetWindowPort(SDL_Window)); |
0 | 121 #else |
122 noerr = aglSetDrawable(glContext, (AGLDrawable)SDL_Window); | |
123 #endif | |
124 | |
125 if(!noerr) { | |
126 SDL_SetError("Unable to bind GL context to window"); | |
127 return(-1); | |
128 } | |
129 return(0); | |
130 #else | |
131 SDL_SetError("OpenGL support not configured"); | |
132 return(-1); | |
133 #endif | |
134 } | |
135 | |
136 void Mac_GL_Quit(_THIS) | |
137 { | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
138 #if SDL_VIDEO_OPENGL |
0 | 139 if ( glContext != NULL ) { |
140 aglSetCurrentContext(NULL); | |
141 aglSetDrawable(glContext, NULL); | |
142 aglDestroyContext(glContext); | |
143 glContext = NULL; | |
144 } | |
145 #endif | |
146 } | |
147 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
148 #if SDL_VIDEO_OPENGL |
0 | 149 |
150 /* Make the current context active */ | |
151 int Mac_GL_MakeCurrent(_THIS) | |
152 { | |
153 int retval; | |
154 | |
155 retval = 0; | |
156 if( ! aglSetCurrentContext(glContext) ) { | |
157 SDL_SetError("Unable to make GL context current"); | |
158 retval = -1; | |
159 } | |
160 return(retval); | |
161 } | |
162 | |
163 void Mac_GL_SwapBuffers(_THIS) | |
164 { | |
165 aglSwapBuffers(glContext); | |
166 } | |
167 | |
774
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
168 int Mac_GL_LoadLibrary(_THIS, const char *location) |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
169 { |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
170 if (location == NULL) |
1803 | 171 #if __MACH__ |
172 location = "/System/Library/Frameworks/OpenGL.framework/OpenGL"; | |
173 #else | |
774
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
174 location = "OpenGLLibrary"; |
1803 | 175 #endif |
774
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
176 |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
177 this->hidden->libraryHandle = SDL_LoadObject(location); |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
178 |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
179 this->gl_config.driver_loaded = 1; |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
180 return (this->hidden->libraryHandle != NULL) ? 0 : -1; |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
181 } |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
182 |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
183 void Mac_GL_UnloadLibrary(_THIS) |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
184 { |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
185 SDL_UnloadObject(this->hidden->libraryHandle); |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
186 |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
187 this->hidden->libraryHandle = NULL; |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
188 this->gl_config.driver_loaded = 0; |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
189 } |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
190 |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
191 void* Mac_GL_GetProcAddress(_THIS, const char *proc) |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
192 { |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
193 return SDL_LoadFunction( this->hidden->libraryHandle, proc ); |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
194 } |
0c3e00cc9580
Date: Mon, 5 Jan 2004 00:09:36 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
195 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
196 #endif /* SDL_VIDEO_OPENGL */ |
0 | 197 |