2 * Copyright © 2013 TOYOTA MOTOR CORPORATION
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that copyright
7 * notice and this permission notice appear in supporting documentation, and
8 * that the name of the copyright holders not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission. The copyright holders make no representations
11 * about the suitability of this software for any purpose. It is provided "as
12 * is" without express or implied warranty.
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
23 * @brief Uint test common routines
32 #include <sys/ioctl.h>
34 #include <sys/types.h>
37 #include <wayland-client.h>
38 #include "ico_window_mgr-client-protocol.h"
39 #include "test-common.h"
41 /*--------------------------------------------------------------------------*/
43 * @brief getdata: Input data string
45 * @param[in] window_mgr ico_window_mgr, if Null, output to stderr
46 * @param[in] prompt Echoback printout header
47 * @param[in] fd Input file discriptor
48 * @param[in] buf Input buffer
49 * @param[in] size Buffer size
50 * @return Number of input characters
51 * @retval >= 0 Number of input characters
52 * @retval < 0 Input error
54 /*--------------------------------------------------------------------------*/
56 getdata(void *window_mgr, const char *prompt, int fd, char *buf, const int size)
62 for (i = 0; i < (size-1); i++) {
63 ret = read(fd, &buf[i], 1);
69 if ((buf[i] == '\n') || (buf[i] == '\r')) break;
73 if ((buf[i] == '#') && (j < 0)) {
78 print_log("%s%s", prompt, buf);
80 /* Delete trailing spaces */
83 if (buf[j-1] != ' ') break;
89 /* Delete header spaces */
90 for (j = 0; buf[j]; j++) {
91 if (buf[j] != ' ') break;
94 strcpy( buf, &buf[j] );
100 /*--------------------------------------------------------------------------*/
102 * @brief print_log: Weston log output
104 * @param[in] fmt printf format
105 * @param[in] ... printf arguments
108 /*--------------------------------------------------------------------------*/
110 print_log(const char *fmt, ...)
114 struct timeval NowTime;
115 extern long timezone;
116 static int sTimeZone = (99*60*60);
119 vsnprintf(log, sizeof(log)-2, fmt, ap);
122 gettimeofday( &NowTime, (struct timezone *)0 );
123 if( sTimeZone > (24*60*60) ) {
125 sTimeZone = timezone;
127 NowTime.tv_sec -= sTimeZone;
128 fprintf(stderr, "[%02d:%02d:%02d.%03d@%d] %s\n", (int)((NowTime.tv_sec/3600) % 24),
129 (int)((NowTime.tv_sec/60) % 60), (int)(NowTime.tv_sec % 60),
130 (int)NowTime.tv_usec/1000, getpid(), log);
133 /*--------------------------------------------------------------------------*/
135 * @brief wayland_dispatch_nonblock: Read from wayland if receive data exist
137 * @param[in] display Wayland connection
140 /*--------------------------------------------------------------------------*/
142 wayland_dispatch_nonblock(struct wl_display *display)
146 /* Check wayland input */
148 /* Flush send data */
149 wl_display_flush(display);
152 if (ioctl(wl_display_get_fd(display), FIONREAD, &nread) < 0) {
156 /* Read event from wayland */
157 wl_display_dispatch(display);
162 /*--------------------------------------------------------------------------*/
164 * @brief sleep_with_wayland: Sleep and receive wayland event
166 * @param[in] display Wayland connection
167 * @param[in] msec Sleep time (miri-sec)
170 /*--------------------------------------------------------------------------*/
172 sleep_with_wayland(struct wl_display *display, int msec)
178 fd = wl_display_get_fd(display);
181 /* Flush send data */
182 wl_display_flush(display);
184 /* Check wayland input */
186 if (ioctl(fd, FIONREAD, &nread) < 0) {
190 /* Read event from wayland */
191 wl_display_dispatch(display);
194 if (msec >= 0) usleep(20*1000);
198 /*--------------------------------------------------------------------------*/
200 * @brief wait_with_wayland: Wait for end and receive wayland event
202 * @param[in] display Wayland connection
203 * @param[in] msec Maximum wait time (miri-sec)
204 * @param[in] endflag End flag address
207 /*--------------------------------------------------------------------------*/
209 wait_with_wayland(struct wl_display *display, int msec, int *endflag)
214 fd = wl_display_get_fd(display);
217 /* Check wayland input */
219 /* Flush send data */
220 wl_display_flush(display);
223 if (ioctl(fd, FIONREAD, &nread) < 0) {
226 if (nread < 8) break;
227 /* Read event from wayland */
228 wl_display_dispatch(display);
231 if (msec >= 0) usleep(20*1000);
232 } while ((*endflag == 0) && (msec > 0));
235 /*--------------------------------------------------------------------------*/
237 * @brief sec_str_2_value: Convert seconds string to value
239 * @param[in] ssec Time ("sec.msec")
240 * @return miri-second
242 /*--------------------------------------------------------------------------*/
244 sec_str_2_value(const char *ssec)
251 sec = strtol(ssec, &errp, 0) * 1000;
252 if ((errp != NULL) && (*errp == '.')) {
255 for (errp++; *errp; errp++) {
256 if ((*errp < '0') || (*errp > '9')) break;
257 msec = msec * 10 + *errp - '0';
261 if (n == 1) msec *= 100;
262 if (n == 2) msec *= 10;
268 /*--------------------------------------------------------------------------*/
270 * @brief opengl_init: Initialize OpenGL ESv2/EGL
272 * @param[in] display Wayland connection
273 * @param[out] rconf EGL configuration
274 * @param[out] rctx EGL context
275 * @return EGL display
276 * @retval != NULL EGL display
277 * @retval == NULL OpenGL/EGL initialize error
279 /*--------------------------------------------------------------------------*/
281 opengl_init(struct wl_display *display, EGLConfig *rconf, EGLContext *rctx)
283 EGLDisplay dpy; /* EGL dsplay id */
289 static const EGLint config_attribs[] = {
290 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
296 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
299 static const EGLint context_attribs[] = {
300 EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
303 dpy = eglGetDisplay((EGLNativeDisplayType)display);
305 fprintf(stderr, "eglGetDisplay Error\n");
309 if (eglInitialize(dpy, &major, &minor) == EGL_FALSE) {
310 fprintf(stderr, "eglInitialize Error\n");
314 if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE) {
315 fprintf(stderr, "eglBindAPI Error\n");
319 if (eglChooseConfig(dpy, config_attribs, &conf, 1, &num_configs) == EGL_FALSE) {
320 fprintf(stderr, "eglChooseConfig Error\n");
324 ctx = eglCreateContext(dpy, conf, EGL_NO_CONTEXT, context_attribs);
326 fprintf(stderr, "eglCreateContext Error\n");
332 wayland_dispatch_nonblock(display);
337 /*--------------------------------------------------------------------------*/
339 * @brief opengl_create_window: Create OpenGL/EGL window
341 * @param[in] display Wayland connection
342 * @param[in] surface Wayland surface
343 * @param[in] dpy EGL display
344 * @param[in] conf EGL configuration
345 * @param[in] ctx EGL context
346 * @param[in] width Widown width
347 * @param[in] height Window height
348 * @param[in] color Initiale color(A<<24|R<<16|G<<8|B)
349 * @return EGL surface
350 * @retval != NULL EGL surface
351 * @retval == NULL Create window error
353 /*--------------------------------------------------------------------------*/
355 opengl_create_window(struct wl_display *display, struct wl_surface *surface,
356 EGLDisplay dpy, EGLConfig conf, EGLContext ctx,
357 const int width, const int height, const int color)
359 struct wl_egl_window *egl_window;
360 EGLSurface egl_surface;
362 static const EGLint surface_attribs[] = {
363 EGL_ALPHA_FORMAT, EGL_ALPHA_FORMAT_PRE, EGL_NONE
366 egl_window = wl_egl_window_create(surface, width, height);
367 egl_surface = eglCreateWindowSurface(dpy, conf, (EGLNativeWindowType)egl_window,
369 eglMakeCurrent(dpy, egl_surface, egl_surface, ctx);
370 glViewport(0, 0, width, height);
372 wayland_dispatch_nonblock(display);
374 opengl_clear_window(color);
376 opengl_swap_buffer(display, dpy, egl_surface);
381 /*--------------------------------------------------------------------------*/
383 * @brief opengl_clear_window: OpenGL window clear
385 * @param[in] color Initiale color(A<<24|R<<16|G<<8|B)
388 /*--------------------------------------------------------------------------*/
390 opengl_clear_window(const unsigned int color)
394 r = (double)((color>>16) & 0x0ff);
396 g = (double)((color>>8) & 0x0ff);
398 b = (double)(color & 0x0ff);
400 a = (double)((color>>24) & 0x0ff);
401 a = (a + 1.0) / 256.0;
403 glClearColor(r, g, b, a);
404 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT| GL_STENCIL_BUFFER_BIT);
407 /*--------------------------------------------------------------------------*/
409 * @brief opengl_create_window: Create OpenGL/EGL window
411 * @param[in] display Wayland connection
412 * @param[in] dpy EGL display
413 * @param[in] egl_surface EGL surface
416 /*--------------------------------------------------------------------------*/
418 opengl_swap_buffer(struct wl_display *display, EGLDisplay dpy, EGLSurface egl_surface)
420 eglSwapBuffers(dpy, egl_surface);
422 wayland_dispatch_nonblock(display);