xref: /reactos/win32ss/gdi/gdi32/misc/wingl.c (revision 98e8827a)
1 /*
2  *  ReactOS Gdi32
3  *  Copyright (C) 2003 ReactOS Team
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 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  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  *
19  *
20  *
21  *
22  */
23 
24 #include <precomp.h>
25 
26 #define NDEBUG
27 #include <debug.h>
28 
29 
30 
31 typedef int  (WINAPI *CHOOSEPIXELFMT) (HDC, CONST PIXELFORMATDESCRIPTOR *);
32 typedef BOOL (WINAPI *SETPIXELFMT) (HDC, int, CONST PIXELFORMATDESCRIPTOR *);
33 typedef BOOL (WINAPI *SWAPBUFFERS) (HDC hdc);
34 typedef int  (WINAPI *DESCRIBEPIXELFMT) (HDC, int, UINT, LPPIXELFORMATDESCRIPTOR);
35 typedef int  (WINAPI *GETPIXELFMT) (HDC);
36 
37 
38 static CHOOSEPIXELFMT    glChoosePixelFormat   = NULL;
39 static SETPIXELFMT       glSetPixelFormat      = NULL;
40 static SWAPBUFFERS       glSwapBuffers         = NULL;
41 static DESCRIBEPIXELFMT  glDescribePixelFormat = NULL;
42 static GETPIXELFMT       glGetPixelFormat      = NULL;
43 
44 /*
45 		OpenGL Handle.
46 */
47 HINSTANCE                hOpenGL               = NULL;
48 
49 static BOOL OpenGLInitFunction(PCSTR name,
50                                FARPROC *funcptr)
51 {
52     PVOID func;
53 
54     func = (PVOID)GetProcAddress(hOpenGL, name);
55     if (func != NULL)
56     {
57         (void)InterlockedCompareExchangePointer((PVOID*)funcptr,
58                                                 func,
59                                                 NULL);
60         return TRUE;
61     }
62 
63     return FALSE;
64 }
65 
66 static BOOL OpenGLEnable(void)
67 {
68     HMODULE hModOpengl32;
69     BOOL Ret = TRUE;
70 
71     hModOpengl32 = LoadLibraryW(L"OPENGL32.DLL");
72     if (hModOpengl32 == NULL)
73         return FALSE;
74 
75     if (InterlockedCompareExchangePointer((PVOID*)&hOpenGL,
76                                           (PVOID)hModOpengl32,
77                                           NULL) != NULL)
78     {
79         FreeLibrary(hModOpengl32);
80 
81         /* NOTE: Even though another thread was faster loading the
82                  library we can't just bail out here. We really need
83                  to *try* to locate every function. This is slow but
84                  thread-safe */
85     }
86 
87     /* The cast is required on x64, because FARPROC has INT_PTR sized return */
88     if (!OpenGLInitFunction("wglChoosePixelFormat", (FARPROC*)&glChoosePixelFormat))
89         Ret = FALSE;
90 
91     if (!OpenGLInitFunction("wglSetPixelFormat", (FARPROC*)&glSetPixelFormat))
92         Ret = FALSE;
93 
94     if (!OpenGLInitFunction("wglSwapBuffers", (FARPROC*)&glSwapBuffers))
95         Ret = FALSE;
96 
97     if (!OpenGLInitFunction("wglDescribePixelFormat", (FARPROC*)&glDescribePixelFormat))
98         Ret = FALSE;
99 
100     if (!OpenGLInitFunction("wglGetPixelFormat", (FARPROC*)&glGetPixelFormat))
101         Ret = FALSE;
102 
103     return Ret;
104 }
105 
106 
107 
108 /*
109  * @implemented
110  */
111 INT
112 WINAPI
113 ChoosePixelFormat(HDC  hdc,
114                   CONST PIXELFORMATDESCRIPTOR * ppfd)
115 {
116     if (glChoosePixelFormat == NULL)
117         if (OpenGLEnable() == FALSE)
118             return(0);
119 
120     return(glChoosePixelFormat(hdc, ppfd));
121 }
122 
123 
124 
125 /*
126  * @implemented
127  */
128 INT
129 WINAPI
130 DescribePixelFormat(HDC  hdc,
131                     INT  iPixelFormat,
132                     UINT  nBytes,
133                     LPPIXELFORMATDESCRIPTOR  ppfd)
134 {
135     if (glDescribePixelFormat == NULL)
136         if (OpenGLEnable() == FALSE)
137             return(0);
138 
139     return(glDescribePixelFormat(hdc, iPixelFormat, nBytes, ppfd));
140 }
141 
142 
143 
144 /*
145  * @implemented
146  */
147 INT
148 WINAPI
149 GetPixelFormat(HDC  hdc)
150 {
151     if (glGetPixelFormat == NULL)
152         if (OpenGLEnable() == FALSE)
153             return(0);
154 
155     return(glGetPixelFormat(hdc));
156 }
157 
158 
159 
160 /*
161  * @implemented
162  */
163 BOOL
164 WINAPI
165 SetPixelFormat(HDC  hdc,
166                INT  iPixelFormat,
167                CONST PIXELFORMATDESCRIPTOR * ppfd)
168 {
169     /* Can only be set once */
170     INT current = GetPixelFormat(hdc);
171     if(current) return current == iPixelFormat ;
172 
173     if (glSetPixelFormat == NULL)
174         if (OpenGLEnable() == FALSE)
175             return(0);
176 
177     return(glSetPixelFormat(hdc, iPixelFormat, ppfd));
178 }
179 
180 
181 
182 /*
183  * @implemented
184  */
185 BOOL
186 WINAPI
187 SwapBuffers(HDC  hdc)
188 {
189     if (glSwapBuffers == NULL)
190         if (OpenGLEnable() == FALSE)
191             return(0);
192 
193 
194     return(glSwapBuffers(hdc));
195 }
196 
197 
198 /*
199 	Do this here for now.
200 */
201 
202 /* EOF */
203