8 #include "EGL/eglext.h"
12 static struct eglut_state _eglut_state
= {
13 .api_mask
= EGLUT_OPENGL_ES1_BIT
,
20 struct eglut_state
*_eglut
= &_eglut_state
;
23 _eglutFatal(char *format
, ...)
27 va_start(args
, format
);
29 fprintf(stderr
, "EGLUT: ");
30 vfprintf(stderr
, format
, args
);
37 /* return current time (in milliseconds) */
43 (void) gettimeofday(&tv
, NULL
);
46 (void) gettimeofday(&tv
, &tz
);
48 return tv
.tv_sec
* 1000 + tv
.tv_usec
/ 1000;
52 _eglutDestroyWindow(struct eglut_window
*win
)
54 if (_eglut
->surface_type
!= EGL_PBUFFER_BIT
&&
55 _eglut
->surface_type
!= EGL_SCREEN_BIT_MESA
)
56 eglDestroySurface(_eglut
->dpy
, win
->surface
);
58 _eglutNativeFiniWindow(win
);
60 eglDestroyContext(_eglut
->dpy
, win
->context
);
64 _eglutChooseConfig(void)
67 EGLint config_attribs
[32];
68 EGLint renderable_type
, num_configs
, i
;
71 config_attribs
[i
++] = EGL_RED_SIZE
;
72 config_attribs
[i
++] = 1;
73 config_attribs
[i
++] = EGL_GREEN_SIZE
;
74 config_attribs
[i
++] = 1;
75 config_attribs
[i
++] = EGL_BLUE_SIZE
;
76 config_attribs
[i
++] = 1;
77 config_attribs
[i
++] = EGL_DEPTH_SIZE
;
78 config_attribs
[i
++] = 1;
80 config_attribs
[i
++] = EGL_SURFACE_TYPE
;
81 config_attribs
[i
++] = _eglut
->surface_type
;
83 config_attribs
[i
++] = EGL_RENDERABLE_TYPE
;
84 renderable_type
= 0x0;
85 if (_eglut
->api_mask
& EGLUT_OPENGL_BIT
)
86 renderable_type
|= EGL_OPENGL_BIT
;
87 if (_eglut
->api_mask
& (EGLUT_OPENGL_ES1_BIT
| EGLUT_OPENGL_ES2_BIT
))
88 renderable_type
|= EGL_OPENGL_ES_BIT
;
89 if (_eglut
->api_mask
& EGLUT_OPENVG_BIT
)
90 renderable_type
|= EGL_OPENVG_BIT
;
91 config_attribs
[i
++] = renderable_type
;
93 config_attribs
[i
] = EGL_NONE
;
95 if (!eglChooseConfig(_eglut
->dpy
,
96 config_attribs
, &config
, 1, &num_configs
) || !num_configs
)
97 _eglutFatal("failed to choose a config");
102 static struct eglut_window
*
103 _eglutCreateWindow(const char *title
, int x
, int y
, int w
, int h
)
105 struct eglut_window
*win
;
106 EGLint context_attribs
[4];
109 win
= calloc(1, sizeof(*win
));
111 _eglutFatal("failed to allocate window");
113 win
->config
= _eglutChooseConfig();
116 context_attribs
[i
] = EGL_NONE
;
120 api
= EGL_OPENGL_ES_API
;
121 if (_eglut
->api_mask
& EGLUT_OPENGL_BIT
) {
122 api
= EGL_OPENGL_API
;
124 else if (_eglut
->api_mask
& EGLUT_OPENVG_BIT
) {
125 api
= EGL_OPENVG_API
;
127 else if (_eglut
->api_mask
& EGLUT_OPENGL_ES2_BIT
) {
128 context_attribs
[i
++] = EGL_CONTEXT_CLIENT_VERSION
;
129 context_attribs
[i
++] = 2;
132 context_attribs
[i
] = EGL_NONE
;
135 win
->context
= eglCreateContext(_eglut
->dpy
,
136 win
->config
, EGL_NO_CONTEXT
, context_attribs
);
138 _eglutFatal("failed to create context");
140 _eglutNativeInitWindow(win
, title
, x
, y
, w
, h
);
141 switch (_eglut
->surface_type
) {
143 win
->surface
= eglCreateWindowSurface(_eglut
->dpy
,
144 win
->config
, win
->native
.u
.window
, NULL
);
147 win
->surface
= eglCreatePixmapSurface(_eglut
->dpy
,
148 win
->config
, win
->native
.u
.pixmap
, NULL
);
150 case EGL_PBUFFER_BIT
:
151 case EGL_SCREEN_BIT_MESA
:
152 win
->surface
= win
->native
.u
.surface
;
157 if (win
->surface
== EGL_NO_SURFACE
)
158 _eglutFatal("failed to create surface");
164 eglutInitAPIMask(int mask
)
166 _eglut
->api_mask
= mask
;
170 eglutInitWindowSize(int width
, int height
)
172 _eglut
->window_width
= width
;
173 _eglut
->window_height
= height
;
177 eglutInit(int argc
, char **argv
)
181 for (i
= 1; i
< argc
; i
++) {
182 if (strcmp(argv
[i
], "-display") == 0)
183 _eglut
->display_name
= argv
[++i
];
184 else if (strcmp(argv
[i
], "-info") == 0) {
189 _eglutNativeInitDisplay();
190 _eglut
->dpy
= eglGetDisplay(_eglut
->native_dpy
);
192 if (!eglInitialize(_eglut
->dpy
, &_eglut
->major
, &_eglut
->minor
))
193 _eglutFatal("failed to initialize EGL display");
195 _eglut
->init_time
= _eglutNow();
197 printf("EGL_VERSION = %s\n", eglQueryString(_eglut
->dpy
, EGL_VERSION
));
198 if (_eglut
->verbose
) {
199 printf("EGL_VENDOR = %s\n", eglQueryString(_eglut
->dpy
, EGL_VENDOR
));
200 printf("EGL_EXTENSIONS = %s\n",
201 eglQueryString(_eglut
->dpy
, EGL_EXTENSIONS
));
202 printf("EGL_CLIENT_APIS = %s\n",
203 eglQueryString(_eglut
->dpy
, EGL_CLIENT_APIS
));
213 case EGLUT_ELAPSED_TIME
:
214 val
= _eglutNow() - _eglut
->init_time
;
225 eglutIdleFunc(EGLUTidleCB func
)
227 _eglut
->idle_cb
= func
;
231 eglutPostRedisplay(void)
233 _eglut
->redisplay
= 1;
239 struct eglut_window
*win
= _eglut
->current
;
242 _eglutFatal("no window is created\n");
245 win
->reshape_cb(win
->native
.width
, win
->native
.height
);
247 _eglutNativeEventLoop();
253 eglTerminate(_eglut
->dpy
);
254 _eglutNativeFiniDisplay();
258 eglutDestroyWindow(int win
)
260 struct eglut_window
*window
= _eglut
->current
;
262 if (window
->index
!= win
)
265 /* XXX it causes some bug in st/egl KMS backend */
266 if ( _eglut
->surface_type
!= EGL_SCREEN_BIT_MESA
)
267 eglMakeCurrent(_eglut
->dpy
, EGL_NO_SURFACE
, EGL_NO_SURFACE
, EGL_NO_CONTEXT
);
269 _eglutDestroyWindow(_eglut
->current
);
273 _eglutDefaultKeyboard(unsigned char key
)
277 eglutDestroyWindow(_eglut
->current
->index
);
285 eglutCreateWindow(const char *title
)
287 struct eglut_window
*win
;
289 win
= _eglutCreateWindow(title
, 0, 0,
290 _eglut
->window_width
, _eglut
->window_height
);
292 win
->index
= _eglut
->num_windows
++;
293 win
->reshape_cb
= NULL
;
294 win
->display_cb
= NULL
;
295 win
->keyboard_cb
= _eglutDefaultKeyboard
;
296 win
->special_cb
= NULL
;
298 if (!eglMakeCurrent(_eglut
->dpy
, win
->surface
, win
->surface
, win
->context
))
299 _eglutFatal("failed to make window current");
300 _eglut
->current
= win
;
306 eglutGetWindowWidth(void)
308 struct eglut_window
*win
= _eglut
->current
;
309 return win
->native
.width
;
313 eglutGetWindowHeight(void)
315 struct eglut_window
*win
= _eglut
->current
;
316 return win
->native
.height
;
320 eglutDisplayFunc(EGLUTdisplayCB func
)
322 struct eglut_window
*win
= _eglut
->current
;
323 win
->display_cb
= func
;
328 eglutReshapeFunc(EGLUTreshapeCB func
)
330 struct eglut_window
*win
= _eglut
->current
;
331 win
->reshape_cb
= func
;
335 eglutKeyboardFunc(EGLUTkeyboardCB func
)
337 struct eglut_window
*win
= _eglut
->current
;
338 win
->keyboard_cb
= func
;
342 eglutSpecialFunc(EGLUTspecialCB func
)
344 struct eglut_window
*win
= _eglut
->current
;
345 win
->special_cb
= func
;