1 /* San Angeles Observation OpenGL ES version example
2 * Copyright 2004-2005 Jetro Lauha
3 * All rights reserved.
4 * Web: http://iki.fi/jetro/
5 *
6 * This source is free software; you can redistribute it and/or
7 * modify it under the terms of EITHER:
8 * (1) The GNU Lesser General Public License as published by the Free
9 * Software Foundation; either version 2.1 of the License, or (at
10 * your option) any later version. The text of the GNU Lesser
11 * General Public License is included with this source in the
12 * file LICENSE-LGPL.txt.
13 * (2) The BSD-style license that is included with this source in
14 * the file LICENSE-BSD.txt.
15 *
16 * This source is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
19 * LICENSE-LGPL.txt and LICENSE-BSD.txt for more details.
20 *
21 * $Id: app-win32.c,v 1.6 2005/02/24 20:29:00 tonic Exp $
22 * $Revision: 1.6 $
23 */
24
25 #define WIN32_LEAN_AND_MEAN
26 #include <windows.h>
27 #include <tchar.h>
28 #ifdef UNDER_CE
29 #include <aygshell.h>
30 #endif
31
32 #include <stdio.h>
33
34 #include "importgl.h"
35
36 #include "app.h"
37
38
39 int gAppAlive = 1;
40
41 static HINSTANCE sInstance;
42
43 static const _TCHAR sAppName[] =
44 _T("San Angeles Observation OpenGL ES version example (Win32)");
45 static HWND sWnd;
46 static int sWindowWidth = WINDOW_DEFAULT_WIDTH;
47 static int sWindowHeight = WINDOW_DEFAULT_HEIGHT;
48 static EGLDisplay sEglDisplay = EGL_NO_DISPLAY;
49 static EGLConfig sEglConfig;
50 static EGLContext sEglContext = EGL_NO_CONTEXT;
51 static EGLSurface sEglSurface = EGL_NO_SURFACE;
52
53
checkGLErrors()54 static void checkGLErrors()
55 {
56 GLenum error = glGetError();
57 if (error != GL_NO_ERROR)
58 {
59 _TCHAR errorString[32];
60 _stprintf(errorString, _T("0x%04x"), error);
61 MessageBox(NULL, errorString, _T("GL Error"), MB_OK);
62 }
63 }
64
65
checkEGLErrors()66 static void checkEGLErrors()
67 {
68 EGLint error = eglGetError();
69 if (error != EGL_SUCCESS)
70 {
71 _TCHAR errorString[32];
72 _stprintf(errorString, _T("0x%04x"), error);
73 MessageBox(NULL, errorString, _T("EGL Initialization Error"), MB_OK);
74 }
75 }
76
77
initEGL(HWND wnd)78 static BOOL initEGL(HWND wnd)
79 {
80 static const EGLint configAttribs[] =
81 {
82 #if (WINDOW_BPP == 16)
83 EGL_RED_SIZE, 5,
84 EGL_GREEN_SIZE, 5,
85 EGL_BLUE_SIZE, 5,
86 #elif (WINDOW_BPP == 32)
87 EGL_RED_SIZE, 8,
88 EGL_GREEN_SIZE, 8,
89 EGL_BLUE_SIZE, 8,
90 #else
91 #error WINDOW_BPP must be 16 or 32
92 #endif
93 EGL_DEPTH_SIZE, 16,
94 EGL_ALPHA_SIZE, EGL_DONT_CARE,
95 EGL_STENCIL_SIZE, EGL_DONT_CARE,
96 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
97 EGL_NONE
98 };
99 EGLBoolean success;
100 EGLint numConfigs;
101 EGLint majorVersion;
102 EGLint minorVersion;
103 #ifdef PVRSDK
104 HDC dc;
105 #endif // PVRSDK
106
107 #ifndef DISABLE_IMPORTGL
108 int importGLResult;
109 importGLResult = importGLInit();
110 if (!importGLResult)
111 return FALSE;
112 #endif // !DISABLE_IMPORTGL
113
114 #ifdef PVRSDK
115 dc = GetDC(sWnd);
116 sEglDisplay = eglGetDisplay(dc);
117 #else
118 sEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
119 #endif // !PVRSDK
120 success = eglInitialize(sEglDisplay, &majorVersion, &minorVersion);
121 if (success != EGL_FALSE)
122 success = eglGetConfigs(sEglDisplay, NULL, 0, &numConfigs);
123 if (success != EGL_FALSE)
124 success = eglChooseConfig(sEglDisplay, configAttribs,
125 &sEglConfig, 1, &numConfigs);
126 if (success != EGL_FALSE)
127 {
128 sEglSurface = eglCreateWindowSurface(sEglDisplay, sEglConfig,
129 wnd, NULL);
130 if (sEglSurface == EGL_NO_SURFACE)
131 success = EGL_FALSE;
132 }
133 if (success != EGL_FALSE)
134 {
135 sEglContext = eglCreateContext(sEglDisplay, sEglConfig, NULL, NULL);
136 if (sEglContext == EGL_NO_CONTEXT)
137 success = EGL_FALSE;
138 }
139 if (success != EGL_FALSE)
140 success = eglMakeCurrent(sEglDisplay, sEglSurface,
141 sEglSurface, sEglContext);
142
143 if (success == EGL_FALSE)
144 checkEGLErrors();
145
146 return success;
147 }
148
149
deinitEGL()150 static void deinitEGL()
151 {
152 eglMakeCurrent(sEglDisplay, NULL, NULL, NULL);
153 eglDestroyContext(sEglDisplay, sEglContext);
154 eglDestroySurface(sEglDisplay, sEglSurface);
155 eglTerminate(sEglDisplay);
156 #ifndef DISABLE_IMPORTGL
157 importGLDeinit();
158 #endif // !DISABLE_IMPORTGL
159 }
160
161
wndProc(HWND wnd,UINT message,WPARAM wParam,LPARAM lParam)162 static LRESULT CALLBACK wndProc(HWND wnd, UINT message,
163 WPARAM wParam, LPARAM lParam)
164 {
165 RECT rc;
166 int useDefWindowProc = 0;
167
168 switch (message)
169 {
170 case WM_CLOSE:
171 DestroyWindow(wnd);
172 gAppAlive = 0;
173 break;
174
175 case WM_DESTROY:
176 PostQuitMessage(0);
177 gAppAlive = 0;
178 break;
179
180 case WM_KEYDOWN:
181 if (wParam == VK_ESCAPE || wParam == VK_RETURN)
182 gAppAlive = 0;
183 useDefWindowProc = 1;
184 break;
185
186 case WM_KEYUP:
187 useDefWindowProc = 1;
188 break;
189
190 case WM_SIZE:
191 GetClientRect(sWnd, &rc);
192 sWindowWidth = rc.right;
193 sWindowHeight = rc.bottom;
194 break;
195
196 default:
197 useDefWindowProc = 1;
198 }
199
200 if (useDefWindowProc)
201 return DefWindowProc(wnd, message, wParam, lParam);
202 return 0;
203 }
204
205
WinMain(HINSTANCE instance,HINSTANCE prevInstance,LPTSTR cmdLine,int cmdShow)206 int WINAPI WinMain(HINSTANCE instance, HINSTANCE prevInstance,
207 LPTSTR cmdLine, int cmdShow)
208 {
209 MSG msg;
210 WNDCLASS wc;
211 DWORD windowStyle;
212 int windowX, windowY;
213
214 // not referenced:
215 prevInstance = prevInstance;
216 cmdLine = cmdLine;
217
218
219 sInstance = instance;
220
221 // register class
222 wc.style = CS_HREDRAW | CS_VREDRAW;
223 wc.lpfnWndProc = (WNDPROC)wndProc;
224 wc.cbClsExtra = 0;
225 wc.cbWndExtra = 0;
226 wc.hInstance = sInstance;
227 wc.hIcon = NULL;
228 wc.hCursor = 0;
229 wc.hbrBackground = GetStockObject(BLACK_BRUSH);
230 wc.lpszMenuName = NULL;
231 wc.lpszClassName = sAppName;
232 if (!RegisterClass(&wc))
233 return FALSE;
234
235 // init instance
236 windowStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE;
237 #ifdef UNDER_CE
238 sWindowWidth = GetSystemMetrics(SM_CXSCREEN);
239 sWindowHeight = GetSystemMetrics(SM_CYSCREEN);
240 windowX = windowY = 0;
241 #else
242 windowStyle |= WS_OVERLAPPEDWINDOW;
243 windowX = CW_USEDEFAULT;
244 windowY = 0;
245 #endif
246 sWnd = CreateWindow(sAppName, sAppName, windowStyle,
247 windowX, windowY,
248 sWindowWidth, sWindowHeight,
249 NULL, NULL, instance, NULL);
250 if (!sWnd)
251 return FALSE;
252
253 ShowWindow(sWnd, cmdShow);
254
255 #ifdef UNDER_CE
256 SHFullScreen(sWnd,
257 SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);
258 MoveWindow(sWnd, 0, 0, sWindowWidth, sWindowHeight, TRUE);
259 #endif
260
261 UpdateWindow(sWnd);
262
263 if (!initEGL(sWnd))
264 return FALSE;
265
266 appInit(sWindowWidth, sWindowHeight);
267
268 while (gAppAlive)
269 {
270 while (PeekMessage(&msg, sWnd, 0, 0, PM_NOREMOVE))
271 {
272 if (GetMessage(&msg, sWnd, 0, 0))
273 {
274 TranslateMessage(&msg);
275 DispatchMessage(&msg);
276 }
277 else
278 gAppAlive = 0;
279 }
280
281 if (gAppAlive)
282 {
283 appRender(GetTickCount(), sWindowWidth, sWindowHeight);
284 checkGLErrors();
285 eglSwapBuffers(sEglDisplay, sEglSurface);
286 checkEGLErrors();
287 }
288 }
289
290 appDeinit();
291 deinitEGL();
292
293 return 0;
294 }
295