st/wgl: Couple of fixes to opengl32.dll's wglCreateContext/wglDeleteContext dispatch.
[mesa.git] / src / gallium / state_trackers / wgl / stw_wgl.c
1 /**************************************************************************
2 *
3 * Copyright 2008 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 /**
29 * @file
30 *
31 * Fake WGL API implementation.
32 *
33 * These functions implement the WGL API, on top of the ICD DDI, so that the
34 * resulting DLL can be used as a drop-in replacement for the system's
35 * opengl32.dll.
36 *
37 * These functions never get called for ICD drivers, which use exclusively the
38 * ICD DDI, i.e., the Drv* entrypoints.
39 */
40
41 #include <windows.h>
42
43 #include "util/u_debug.h"
44 #include "stw_icd.h"
45 #include "stw_context.h"
46 #include "stw_pixelformat.h"
47 #include "stw_wgl.h"
48 #include "stw_ext_context.h"
49
50
51 static void
52 overrideOpenGL32EntryPoints(void);
53
54 WINGDIAPI BOOL APIENTRY
55 wglCopyContext(
56 HGLRC hglrcSrc,
57 HGLRC hglrcDst,
58 UINT mask )
59 {
60 return DrvCopyContext( (DHGLRC)(UINT_PTR)hglrcSrc,
61 (DHGLRC)(UINT_PTR)hglrcDst,
62 mask );
63 }
64
65 WINGDIAPI HGLRC APIENTRY
66 wglCreateContext(
67 HDC hdc )
68 {
69 overrideOpenGL32EntryPoints();
70 return (HGLRC) DrvCreateContext(hdc);
71 }
72
73 WINGDIAPI HGLRC APIENTRY
74 wglCreateLayerContext(
75 HDC hdc,
76 int iLayerPlane )
77 {
78 overrideOpenGL32EntryPoints();
79 return (HGLRC) DrvCreateLayerContext( hdc, iLayerPlane );
80 }
81
82 WINGDIAPI BOOL APIENTRY
83 wglDeleteContext(
84 HGLRC hglrc )
85 {
86 return DrvDeleteContext((DHGLRC)(UINT_PTR)hglrc );
87 }
88
89
90 WINGDIAPI HGLRC APIENTRY
91 wglGetCurrentContext( VOID )
92 {
93 return (HGLRC)(UINT_PTR)stw_get_current_context();
94 }
95
96 WINGDIAPI HDC APIENTRY
97 wglGetCurrentDC( VOID )
98 {
99 return stw_get_current_dc();
100 }
101
102 WINGDIAPI BOOL APIENTRY
103 wglMakeCurrent(
104 HDC hdc,
105 HGLRC hglrc )
106 {
107 return DrvSetContext( hdc, (DHGLRC)(UINT_PTR)hglrc, NULL ) ? TRUE : FALSE;
108 }
109
110
111 WINGDIAPI BOOL APIENTRY
112 wglSwapBuffers(
113 HDC hdc )
114 {
115 return DrvSwapBuffers( hdc );
116 }
117
118
119 WINGDIAPI DWORD WINAPI
120 wglSwapMultipleBuffers(UINT n,
121 CONST WGLSWAP *ps)
122 {
123 UINT i;
124
125 for (i =0; i < n; ++i)
126 wglSwapBuffers(ps->hdc);
127
128 return 0;
129 }
130
131
132 WINGDIAPI BOOL APIENTRY
133 wglSwapLayerBuffers(
134 HDC hdc,
135 UINT fuPlanes )
136 {
137 return DrvSwapLayerBuffers( hdc, fuPlanes );
138 }
139
140 WINGDIAPI PROC APIENTRY
141 wglGetProcAddress(
142 LPCSTR lpszProc )
143 {
144 return DrvGetProcAddress( lpszProc );
145 }
146
147
148 WINGDIAPI int APIENTRY
149 wglChoosePixelFormat(
150 HDC hdc,
151 CONST PIXELFORMATDESCRIPTOR *ppfd )
152 {
153 if (ppfd->nSize != sizeof( PIXELFORMATDESCRIPTOR ) || ppfd->nVersion != 1)
154 return 0;
155 if (ppfd->iPixelType != PFD_TYPE_RGBA)
156 return 0;
157 if (!(ppfd->dwFlags & PFD_DRAW_TO_WINDOW))
158 return 0;
159 if (!(ppfd->dwFlags & PFD_SUPPORT_OPENGL))
160 return 0;
161 if (ppfd->dwFlags & PFD_DRAW_TO_BITMAP)
162 return 0;
163 if (ppfd->dwFlags & PFD_SUPPORT_GDI)
164 return 0;
165 if (!(ppfd->dwFlags & PFD_STEREO_DONTCARE) && (ppfd->dwFlags & PFD_STEREO))
166 return 0;
167
168 return stw_pixelformat_choose( hdc, ppfd );
169 }
170
171 WINGDIAPI int APIENTRY
172 wglDescribePixelFormat(
173 HDC hdc,
174 int iPixelFormat,
175 UINT nBytes,
176 LPPIXELFORMATDESCRIPTOR ppfd )
177 {
178 return DrvDescribePixelFormat( hdc, iPixelFormat, nBytes, ppfd );
179 }
180
181 WINGDIAPI int APIENTRY
182 wglGetPixelFormat(
183 HDC hdc )
184 {
185 return stw_pixelformat_get( hdc );
186 }
187
188 WINGDIAPI BOOL APIENTRY
189 wglSetPixelFormat(
190 HDC hdc,
191 int iPixelFormat,
192 const PIXELFORMATDESCRIPTOR *ppfd )
193 {
194 /* SetPixelFormat (hence wglSetPixelFormat) must not touch ppfd, per
195 * http://msdn.microsoft.com/en-us/library/dd369049(v=vs.85).aspx
196 */
197 (void) ppfd;
198
199 return DrvSetPixelFormat( hdc, iPixelFormat );
200 }
201
202
203 WINGDIAPI BOOL APIENTRY
204 wglUseFontBitmapsA(
205 HDC hdc,
206 DWORD first,
207 DWORD count,
208 DWORD listBase )
209 {
210 (void) hdc;
211 (void) first;
212 (void) count;
213 (void) listBase;
214
215 assert( 0 );
216
217 return FALSE;
218 }
219
220 WINGDIAPI BOOL APIENTRY
221 wglShareLists(
222 HGLRC hglrc1,
223 HGLRC hglrc2 )
224 {
225 return DrvShareLists((DHGLRC)(UINT_PTR)hglrc1,
226 (DHGLRC)(UINT_PTR)hglrc2);
227 }
228
229 WINGDIAPI BOOL APIENTRY
230 wglUseFontBitmapsW(
231 HDC hdc,
232 DWORD first,
233 DWORD count,
234 DWORD listBase )
235 {
236 (void) hdc;
237 (void) first;
238 (void) count;
239 (void) listBase;
240
241 assert( 0 );
242
243 return FALSE;
244 }
245
246 WINGDIAPI BOOL APIENTRY
247 wglUseFontOutlinesA(
248 HDC hdc,
249 DWORD first,
250 DWORD count,
251 DWORD listBase,
252 FLOAT deviation,
253 FLOAT extrusion,
254 int format,
255 LPGLYPHMETRICSFLOAT lpgmf )
256 {
257 (void) hdc;
258 (void) first;
259 (void) count;
260 (void) listBase;
261 (void) deviation;
262 (void) extrusion;
263 (void) format;
264 (void) lpgmf;
265
266 assert( 0 );
267
268 return FALSE;
269 }
270
271 WINGDIAPI BOOL APIENTRY
272 wglUseFontOutlinesW(
273 HDC hdc,
274 DWORD first,
275 DWORD count,
276 DWORD listBase,
277 FLOAT deviation,
278 FLOAT extrusion,
279 int format,
280 LPGLYPHMETRICSFLOAT lpgmf )
281 {
282 (void) hdc;
283 (void) first;
284 (void) count;
285 (void) listBase;
286 (void) deviation;
287 (void) extrusion;
288 (void) format;
289 (void) lpgmf;
290
291 assert( 0 );
292
293 return FALSE;
294 }
295
296 WINGDIAPI BOOL APIENTRY
297 wglDescribeLayerPlane(
298 HDC hdc,
299 int iPixelFormat,
300 int iLayerPlane,
301 UINT nBytes,
302 LPLAYERPLANEDESCRIPTOR plpd )
303 {
304 return DrvDescribeLayerPlane(hdc, iPixelFormat, iLayerPlane, nBytes, plpd);
305 }
306
307 WINGDIAPI int APIENTRY
308 wglSetLayerPaletteEntries(
309 HDC hdc,
310 int iLayerPlane,
311 int iStart,
312 int cEntries,
313 CONST COLORREF *pcr )
314 {
315 return DrvSetLayerPaletteEntries(hdc, iLayerPlane, iStart, cEntries, pcr);
316 }
317
318 WINGDIAPI int APIENTRY
319 wglGetLayerPaletteEntries(
320 HDC hdc,
321 int iLayerPlane,
322 int iStart,
323 int cEntries,
324 COLORREF *pcr )
325 {
326 return DrvGetLayerPaletteEntries(hdc, iLayerPlane, iStart, cEntries, pcr);
327 }
328
329 WINGDIAPI BOOL APIENTRY
330 wglRealizeLayerPalette(
331 HDC hdc,
332 int iLayerPlane,
333 BOOL bRealize )
334 {
335 (void) hdc;
336 (void) iLayerPlane;
337 (void) bRealize;
338
339 assert( 0 );
340
341 return FALSE;
342 }
343
344
345 /* When this library is used as a opengl32.dll drop-in replacement, ensure we
346 * use the wglCreate/Destroy entrypoints above, and not the true opengl32.dll,
347 * which could happen if this library's name is not opengl32.dll exactly.
348 *
349 * For example, Qt 5.4 bundles this as opengl32sw.dll:
350 * https://blog.qt.io/blog/2014/11/27/qt-weekly-21-dynamic-opengl-implementation-loading-in-qt-5-4/
351 */
352 static void
353 overrideOpenGL32EntryPoints(void)
354 {
355 wglCreateContext_func = &wglCreateContext;
356 wglDeleteContext_func = &wglDeleteContext;
357 }