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 /* Flush send data */
218 wl_display_flush(display);
220 /* Check wayland input */
222 if (ioctl(fd, FIONREAD, &nread) < 0) {
226 /* Read event from wayland */
227 wl_display_dispatch(display);
230 if (msec >= 0) usleep(20*1000);
231 } while ((*endflag == 0) && (msec > 0));
234 /*--------------------------------------------------------------------------*/
236 * @brief sec_str_2_value: Convert seconds string to value
238 * @param[in] ssec Time ("sec.msec")
239 * @return miri-second
241 /*--------------------------------------------------------------------------*/
243 sec_str_2_value(const char *ssec)
250 sec = strtol(ssec, &errp, 0) * 1000;
251 if ((errp != NULL) && (*errp == '.')) {
254 for (errp++; *errp; errp++) {
255 if ((*errp < '0') || (*errp > '9')) break;
256 msec = msec * 10 + *errp - '0';
260 if (n == 1) msec *= 100;
261 if (n == 2) msec *= 10;
267 /*--------------------------------------------------------------------------*/
269 * @brief opengl_init: Initialize OpenGL ESv2/EGL
271 * @param[in] display Wayland connection
272 * @param[out] rconf EGL configuration
273 * @param[out] rctx EGL context
274 * @return EGL display
275 * @retval != NULL EGL display
276 * @retval == NULL OpenGL/EGL initialize error
278 /*--------------------------------------------------------------------------*/
280 opengl_init(struct wl_display *display, EGLConfig *rconf, EGLContext *rctx)
282 EGLDisplay dpy; /* EGL dsplay id */
288 static const EGLint config_attribs[] = {
289 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
295 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
298 static const EGLint context_attribs[] = {
299 EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
302 dpy = eglGetDisplay((EGLNativeDisplayType)display);
304 fprintf(stderr, "eglGetDisplay Error\n");
308 if (eglInitialize(dpy, &major, &minor) == EGL_FALSE) {
309 fprintf(stderr, "eglInitialize Error\n");
313 if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE) {
314 fprintf(stderr, "eglBindAPI Error\n");
318 if (eglChooseConfig(dpy, config_attribs, &conf, 1, &num_configs) == EGL_FALSE) {
319 fprintf(stderr, "eglChooseConfig Error\n");
323 ctx = eglCreateContext(dpy, conf, EGL_NO_CONTEXT, context_attribs);
325 fprintf(stderr, "eglCreateContext Error\n");
331 wayland_dispatch_nonblock(display);
336 /*--------------------------------------------------------------------------*/
338 * @brief opengl_create_window: Create OpenGL/EGL window
340 * @param[in] display Wayland connection
341 * @param[in] surface Wayland surface
342 * @param[in] dpy EGL display
343 * @param[in] conf EGL configuration
344 * @param[in] ctx EGL context
345 * @param[in] width Widown width
346 * @param[in] height Window height
347 * @param[in] color Initiale color(A<<24|R<<16|G<<8|B)
348 * @return EGL surface
349 * @retval != NULL EGL surface
350 * @retval == NULL Create window error
352 /*--------------------------------------------------------------------------*/
354 opengl_create_window(struct wl_display *display, struct wl_surface *surface,
355 EGLDisplay dpy, EGLConfig conf, EGLContext ctx,
356 const int width, const int height, const int color)
358 struct wl_egl_window *egl_window;
359 EGLSurface egl_surface;
361 static const EGLint surface_attribs[] = {
362 EGL_ALPHA_FORMAT, EGL_ALPHA_FORMAT_PRE, EGL_NONE
365 egl_window = wl_egl_window_create(surface, width, height);
366 egl_surface = eglCreateWindowSurface(dpy, conf, (EGLNativeWindowType)egl_window,
368 eglMakeCurrent(dpy, egl_surface, egl_surface, ctx);
369 glViewport(0, 0, width, height);
371 wayland_dispatch_nonblock(display);
373 opengl_clear_window(color);
375 opengl_swap_buffer(display, dpy, egl_surface);
380 /*--------------------------------------------------------------------------*/
382 * @brief opengl_clear_window: OpenGL window clear
384 * @param[in] color Initiale color(A<<24|R<<16|G<<8|B)
387 /*--------------------------------------------------------------------------*/
389 opengl_clear_window(const unsigned int color)
393 r = (double)((color>>16) & 0x0ff);
395 g = (double)((color>>8) & 0x0ff);
397 b = (double)(color & 0x0ff);
399 a = (double)((color>>24) & 0x0ff);
400 a = (a + 1.0) / 256.0;
402 glClearColor(r, g, b, a);
403 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT| GL_STENCIL_BUFFER_BIT);
406 /*--------------------------------------------------------------------------*/
408 * @brief opengl_create_window: Create OpenGL/EGL window
410 * @param[in] display Wayland connection
411 * @param[in] dpy EGL display
412 * @param[in] egl_surface EGL surface
415 /*--------------------------------------------------------------------------*/
417 opengl_swap_buffer(struct wl_display *display, EGLDisplay dpy, EGLSurface egl_surface)
419 eglSwapBuffers(dpy, egl_surface);
421 wayland_dispatch_nonblock(display);