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 skip_spaces: skip spaces in command input
137 * @param[in] buf input command string
138 * @return character pointer of not space character
140 /*--------------------------------------------------------------------------*/
142 skip_spaces(char *buf)
144 while ((*buf == ' ') || (*buf == '\t')) {
150 /*--------------------------------------------------------------------------*/
152 * @brief pars_command: The word division of the command line
154 * @param[in] buf input command string
155 * @param[in] pt word pointers (maximum len words)
156 * @param[in] len maximum number of words
157 * @return number of words
159 /*--------------------------------------------------------------------------*/
161 pars_command(char *buf, char *pt[], const int len)
166 memset(pt, 0, sizeof(int *)*10);
168 for (narg = 0; narg < len; narg++) {
173 if ((*p == ' ') || (*p == '\t') ||
174 (*p == '=') || (*p == ',')) break;
186 /*--------------------------------------------------------------------------*/
188 * @brief wayland_dispatch_nonblock: Read from wayland if receive data exist
190 * @param[in] display Wayland connection
193 /*--------------------------------------------------------------------------*/
195 wayland_dispatch_nonblock(struct wl_display *display)
199 /* Check wayland input */
201 /* Flush send data */
202 wl_display_flush(display);
205 if (ioctl(wl_display_get_fd(display), FIONREAD, &nread) < 0) {
209 /* Read event from wayland */
210 wl_display_dispatch(display);
215 /*--------------------------------------------------------------------------*/
217 * @brief sleep_with_wayland: Sleep and receive wayland event
219 * @param[in] display Wayland connection
220 * @param[in] msec Sleep time (miri-sec)
223 /*--------------------------------------------------------------------------*/
225 sleep_with_wayland(struct wl_display *display, int msec)
231 fd = wl_display_get_fd(display);
234 /* Flush send data */
235 wl_display_flush(display);
237 /* Check wayland input */
239 if (ioctl(fd, FIONREAD, &nread) < 0) {
243 /* Read event from wayland */
244 wl_display_dispatch(display);
247 if (msec >= 0) usleep(20*1000);
251 /*--------------------------------------------------------------------------*/
253 * @brief wait_with_wayland: Wait for end and receive wayland event
255 * @param[in] display Wayland connection
256 * @param[in] msec Maximum wait time (miri-sec)
257 * @param[in] endflag End flag address
260 /*--------------------------------------------------------------------------*/
262 wait_with_wayland(struct wl_display *display, int msec, int *endflag)
267 fd = wl_display_get_fd(display);
270 /* Check wayland input */
272 /* Flush send data */
273 wl_display_flush(display);
276 if (ioctl(fd, FIONREAD, &nread) < 0) {
279 if (nread < 8) break;
280 /* Read event from wayland */
281 wl_display_dispatch(display);
284 if (msec >= 0) usleep(20*1000);
285 } while ((*endflag == 0) && (msec > 0));
288 /*--------------------------------------------------------------------------*/
290 * @brief sec_str_2_value: Convert seconds string to value
292 * @param[in] ssec Time ("sec.msec")
293 * @return miri-second
295 /*--------------------------------------------------------------------------*/
297 sec_str_2_value(const char *ssec)
304 sec = strtol(ssec, &errp, 0) * 1000;
305 if ((errp != NULL) && (*errp == '.')) {
308 for (errp++; *errp; errp++) {
309 if ((*errp < '0') || (*errp > '9')) break;
310 msec = msec * 10 + *errp - '0';
314 if (n == 1) msec *= 100;
315 if (n == 2) msec *= 10;
321 /*--------------------------------------------------------------------------*/
323 * @brief opengl_init: Initialize OpenGL ESv2/EGL
325 * @param[in] display Wayland connection
326 * @param[out] rconf EGL configuration
327 * @param[out] rctx EGL context
328 * @return EGL display
329 * @retval != NULL EGL display
330 * @retval == NULL OpenGL/EGL initialize error
332 /*--------------------------------------------------------------------------*/
334 opengl_init(struct wl_display *display, EGLConfig *rconf, EGLContext *rctx)
336 EGLDisplay dpy; /* EGL dsplay id */
342 static const EGLint config_attribs[] = {
343 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
349 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
352 static const EGLint context_attribs[] = {
353 EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
356 dpy = eglGetDisplay((EGLNativeDisplayType)display);
358 fprintf(stderr, "eglGetDisplay Error\n");
362 if (eglInitialize(dpy, &major, &minor) == EGL_FALSE) {
363 fprintf(stderr, "eglInitialize Error\n");
367 if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE) {
368 fprintf(stderr, "eglBindAPI Error\n");
372 if (eglChooseConfig(dpy, config_attribs, &conf, 1, &num_configs) == EGL_FALSE) {
373 fprintf(stderr, "eglChooseConfig Error\n");
377 ctx = eglCreateContext(dpy, conf, EGL_NO_CONTEXT, context_attribs);
379 fprintf(stderr, "eglCreateContext Error\n");
385 wayland_dispatch_nonblock(display);
390 /*--------------------------------------------------------------------------*/
392 * @brief opengl_create_window: Create OpenGL/EGL window
394 * @param[in] display Wayland connection
395 * @param[in] surface Wayland surface
396 * @param[in] dpy EGL display
397 * @param[in] conf EGL configuration
398 * @param[in] ctx EGL context
399 * @param[in] width Widown width
400 * @param[in] height Window height
401 * @param[in] color Initiale color(A<<24|R<<16|G<<8|B)
402 * @return EGL surface
403 * @retval != NULL EGL surface
404 * @retval == NULL Create window error
406 /*--------------------------------------------------------------------------*/
408 opengl_create_window(struct wl_display *display, struct wl_surface *surface,
409 EGLDisplay dpy, EGLConfig conf, EGLContext ctx,
410 const int width, const int height, const int color)
412 struct wl_egl_window *egl_window;
413 EGLSurface egl_surface;
415 static const EGLint surface_attribs[] = {
416 EGL_ALPHA_FORMAT, EGL_ALPHA_FORMAT_PRE, EGL_NONE
419 egl_window = wl_egl_window_create(surface, width, height);
420 egl_surface = eglCreateWindowSurface(dpy, conf, (EGLNativeWindowType)egl_window,
422 eglMakeCurrent(dpy, egl_surface, egl_surface, ctx);
423 glViewport(0, 0, width, height);
425 wayland_dispatch_nonblock(display);
427 opengl_clear_window(color);
429 opengl_swap_buffer(display, dpy, egl_surface);
434 /*--------------------------------------------------------------------------*/
436 * @brief opengl_clear_window: OpenGL window clear
438 * @param[in] color Initiale color(A<<24|R<<16|G<<8|B)
441 /*--------------------------------------------------------------------------*/
443 opengl_clear_window(const unsigned int color)
447 r = (double)((color>>16) & 0x0ff);
449 g = (double)((color>>8) & 0x0ff);
451 b = (double)(color & 0x0ff);
453 a = (double)((color>>24) & 0x0ff);
454 a = (a + 1.0) / 256.0;
456 glClearColor(r, g, b, a);
457 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT| GL_STENCIL_BUFFER_BIT);
460 /*--------------------------------------------------------------------------*/
462 * @brief opengl_swap_buffer: Swap OpenGL/EGL buffer
464 * @param[in] display Wayland connection
465 * @param[in] dpy EGL display
466 * @param[in] egl_surface EGL surface
469 /*--------------------------------------------------------------------------*/
471 opengl_swap_buffer(struct wl_display *display, EGLDisplay dpy, EGLSurface egl_surface)
473 eglSwapBuffers(dpy, egl_surface);
475 wayland_dispatch_nonblock(display);