[Piglit] [PATCH 1/3] Add eglut utility
Chia-I Wu
olvaffe at gmail.com
Thu Oct 21 18:43:47 PDT 2010
2010/10/22 Shuang He <shuang.he at intel.com>:
> On 2010-10-22 1:36, Kristian Høgsberg wrote:
>>
>> On Wed, Oct 20, 2010 at 10:26 PM, Shuang He<shuang.he at intel.com> wrote:
>>>
>>> These are directly copied from mesa/demos
>>
>> Chia-I Wu added the eglut framework to mesa demos in commit
>> c5bf7d5fd1f52f82c6256be4856df2d3d90a752d, but didn't actually specify
>> a license. The files in mesa-demos come from a lot of different
>> places and have different licenses. I'd like for Chia-I to add a
>> COPYING file to the eglut directory in mesa-demos, and then this
>> commit should copy that files into piglit as well.
>>
>> Other than that, I think reusing eglut is fine.
>>
>> Kristian
>
> Thanks for digging this out.
> This will make me more feel better to reuse eglut.
> I'll wait for his commit on that.
eglut is MIT licensed. I've added the license info to the sources in
mesa/demos.
>
> Thanks
> --Shuang
>
>>> ---
>>> tests/util/CMakeLists.txt | 5 +
>>> tests/util/eglut/CMakeLists.txt | 18 ++
>>> tests/util/eglut/eglut.c | 348
>>> +++++++++++++++++++++++++++++++++++++++
>>> tests/util/eglut/eglut.h | 68 ++++++++
>>> tests/util/eglut/eglut_x11.c | 220 ++++++++++++++++++++++++
>>> tests/util/eglut/eglutint.h | 78 +++++++++
>>> 6 files changed, 737 insertions(+), 0 deletions(-)
>>> create mode 100644 tests/util/eglut/CMakeLists.txt
>>> create mode 100644 tests/util/eglut/eglut.c
>>> create mode 100644 tests/util/eglut/eglut.h
>>> create mode 100644 tests/util/eglut/eglut_x11.c
>>> create mode 100644 tests/util/eglut/eglutint.h
>>>
>>> diff --git a/tests/util/CMakeLists.txt b/tests/util/CMakeLists.txt
>>> index f859a3f..19a1ee0 100644
>>> --- a/tests/util/CMakeLists.txt
>>> +++ b/tests/util/CMakeLists.txt
>>> @@ -33,3 +33,8 @@ ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
>>> add_library (piglitutil
>>> ${UTIL_SOURCES}
>>> )
>>> +
>>> +IF(OPENGL_egl_LIBRARY)
>>> + add_subdirectory (eglut)
>>> + add_subdirectory (egl)
>>> +ENDIF(OPENGL_egl_LIBRARY)
>>> diff --git a/tests/util/eglut/CMakeLists.txt
>>> b/tests/util/eglut/CMakeLists.txt
>>> new file mode 100644
>>> index 0000000..884f76f
>>> --- /dev/null
>>> +++ b/tests/util/eglut/CMakeLists.txt
>>> @@ -0,0 +1,18 @@
>>> +add_definitions ( -DSOURCE_DIR="${piglit_SOURCE_DIR}/" )
>>> +
>>> +include_directories(
>>> + ${OPENGL_INCLUDE_PATH}
>>> +)
>>> +
>>> +link_libraries (
>>> + ${OPENGL_egl_LIBRARY}
>>> +)
>>> +
>>> +set (EGLUT_SOURCES
>>> + eglut.c
>>> + eglut_x11.c
>>> +)
>>> +
>>> +add_library (pigliteglut
>>> + ${EGLUT_SOURCES}
>>> +)
>>> diff --git a/tests/util/eglut/eglut.c b/tests/util/eglut/eglut.c
>>> new file mode 100644
>>> index 0000000..ff7d8df
>>> --- /dev/null
>>> +++ b/tests/util/eglut/eglut.c
>>> @@ -0,0 +1,348 @@
>>> +#include<stdio.h>
>>> +#include<stdlib.h>
>>> +#include<string.h>
>>> +#include<stdarg.h>
>>> +#include<sys/time.h>
>>> +
>>> +#include "EGL/egl.h"
>>> +#include "EGL/eglext.h"
>>> +
>>> +#include "eglutint.h"
>>> +
>>> +static struct eglut_state _eglut_state = {
>>> + .api_mask = EGLUT_OPENGL_ES1_BIT,
>>> + .window_width = 300,
>>> + .window_height = 300,
>>> + .verbose = 0,
>>> + .num_windows = 0,
>>> +};
>>> +
>>> +struct eglut_state *_eglut =&_eglut_state;
>>> +
>>> +void
>>> +_eglutFatal(char *format, ...)
>>> +{
>>> + va_list args;
>>> +
>>> + va_start(args, format);
>>> +
>>> + fprintf(stderr, "EGLUT: ");
>>> + vfprintf(stderr, format, args);
>>> + va_end(args);
>>> + putc('\n', stderr);
>>> +
>>> + exit(1);
>>> +}
>>> +
>>> +/* return current time (in milliseconds) */
>>> +int
>>> +_eglutNow(void)
>>> +{
>>> + struct timeval tv;
>>> +#ifdef __VMS
>>> + (void) gettimeofday(&tv, NULL );
>>> +#else
>>> + struct timezone tz;
>>> + (void) gettimeofday(&tv,&tz);
>>> +#endif
>>> + return tv.tv_sec * 1000 + tv.tv_usec / 1000;
>>> +}
>>> +
>>> +static void
>>> +_eglutDestroyWindow(struct eglut_window *win)
>>> +{
>>> + if (_eglut->surface_type != EGL_PBUFFER_BIT&&
>>> + _eglut->surface_type != EGL_SCREEN_BIT_MESA)
>>> + eglDestroySurface(_eglut->dpy, win->surface);
>>> +
>>> + _eglutNativeFiniWindow(win);
>>> +
>>> + eglDestroyContext(_eglut->dpy, win->context);
>>> +}
>>> +
>>> +static EGLConfig
>>> +_eglutChooseConfig(void)
>>> +{
>>> + EGLConfig config;
>>> + EGLint config_attribs[32];
>>> + EGLint renderable_type, num_configs, i;
>>> +
>>> + i = 0;
>>> + config_attribs[i++] = EGL_RED_SIZE;
>>> + config_attribs[i++] = 1;
>>> + config_attribs[i++] = EGL_GREEN_SIZE;
>>> + config_attribs[i++] = 1;
>>> + config_attribs[i++] = EGL_BLUE_SIZE;
>>> + config_attribs[i++] = 1;
>>> + config_attribs[i++] = EGL_DEPTH_SIZE;
>>> + config_attribs[i++] = 1;
>>> +
>>> + config_attribs[i++] = EGL_SURFACE_TYPE;
>>> + config_attribs[i++] = _eglut->surface_type;
>>> +
>>> + config_attribs[i++] = EGL_RENDERABLE_TYPE;
>>> + renderable_type = 0x0;
>>> + if (_eglut->api_mask& EGLUT_OPENGL_BIT)
>>> + renderable_type |= EGL_OPENGL_BIT;
>>> + if (_eglut->api_mask& EGLUT_OPENGL_ES1_BIT)
>>> + renderable_type |= EGL_OPENGL_ES_BIT;
>>> + if (_eglut->api_mask& EGLUT_OPENGL_ES2_BIT)
>>> + renderable_type |= EGL_OPENGL_ES2_BIT;
>>> + if (_eglut->api_mask& EGLUT_OPENVG_BIT)
>>> + renderable_type |= EGL_OPENVG_BIT;
>>> + config_attribs[i++] = renderable_type;
>>> +
>>> + config_attribs[i] = EGL_NONE;
>>> +
>>> + if (!eglChooseConfig(_eglut->dpy,
>>> + config_attribs,&config, 1,&num_configs) || !num_configs)
>>> + _eglutFatal("failed to choose a config");
>>> +
>>> + return config;
>>> +}
>>> +
>>> +static struct eglut_window *
>>> +_eglutCreateWindow(const char *title, int x, int y, int w, int h)
>>> +{
>>> + struct eglut_window *win;
>>> + EGLint context_attribs[4];
>>> + EGLint api, i;
>>> +
>>> + win = calloc(1, sizeof(*win));
>>> + if (!win)
>>> + _eglutFatal("failed to allocate window");
>>> +
>>> + win->config = _eglutChooseConfig();
>>> +
>>> + i = 0;
>>> + context_attribs[i] = EGL_NONE;
>>> +
>>> + /* multiple APIs? */
>>> +
>>> + api = EGL_OPENGL_ES_API;
>>> + if (_eglut->api_mask& EGLUT_OPENGL_BIT) {
>>> + api = EGL_OPENGL_API;
>>> + }
>>> + else if (_eglut->api_mask& EGLUT_OPENVG_BIT) {
>>> + api = EGL_OPENVG_API;
>>> + }
>>> + else if (_eglut->api_mask& EGLUT_OPENGL_ES2_BIT) {
>>> + context_attribs[i++] = EGL_CONTEXT_CLIENT_VERSION;
>>> + context_attribs[i++] = 2;
>>> + }
>>> +
>>> + context_attribs[i] = EGL_NONE;
>>> +
>>> + eglBindAPI(api);
>>> + win->context = eglCreateContext(_eglut->dpy,
>>> + win->config, EGL_NO_CONTEXT, context_attribs);
>>> + if (!win->context)
>>> + _eglutFatal("failed to create context");
>>> +
>>> + _eglutNativeInitWindow(win, title, x, y, w, h);
>>> + switch (_eglut->surface_type) {
>>> + case EGL_WINDOW_BIT:
>>> + win->surface = eglCreateWindowSurface(_eglut->dpy,
>>> + win->config, win->native.u.window, NULL);
>>> + break;
>>> + case EGL_PIXMAP_BIT:
>>> + win->surface = eglCreatePixmapSurface(_eglut->dpy,
>>> + win->config, win->native.u.pixmap, NULL);
>>> + break;
>>> + case EGL_PBUFFER_BIT:
>>> + case EGL_SCREEN_BIT_MESA:
>>> + win->surface = win->native.u.surface;
>>> + break;
>>> + default:
>>> + break;
>>> + }
>>> + if (win->surface == EGL_NO_SURFACE)
>>> + _eglutFatal("failed to create surface");
>>> +
>>> + return win;
>>> +}
>>> +
>>> +void
>>> +eglutInitAPIMask(int mask)
>>> +{
>>> + _eglut->api_mask = mask;
>>> +}
>>> +
>>> +void
>>> +eglutInitWindowSize(int width, int height)
>>> +{
>>> + _eglut->window_width = width;
>>> + _eglut->window_height = height;
>>> +}
>>> +
>>> +void
>>> +eglutInit(int argc, char **argv)
>>> +{
>>> + int i;
>>> +
>>> + for (i = 1; i< argc; i++) {
>>> + if (strcmp(argv[i], "-display") == 0)
>>> + _eglut->display_name = argv[++i];
>>> + else if (strcmp(argv[i], "-info") == 0) {
>>> + _eglut->verbose = 1;
>>> + }
>>> + }
>>> +
>>> + _eglutNativeInitDisplay();
>>> + _eglut->dpy = eglGetDisplay(_eglut->native_dpy);
>>> +
>>> + if (!eglInitialize(_eglut->dpy,&_eglut->major,&_eglut->minor))
>>> + _eglutFatal("failed to initialize EGL display");
>>> +
>>> + _eglut->init_time = _eglutNow();
>>> +
>>> + printf("EGL_VERSION = %s\n", eglQueryString(_eglut->dpy,
>>> EGL_VERSION));
>>> + if (_eglut->verbose) {
>>> + printf("EGL_VENDOR = %s\n", eglQueryString(_eglut->dpy,
>>> EGL_VENDOR));
>>> + printf("EGL_EXTENSIONS = %s\n",
>>> + eglQueryString(_eglut->dpy, EGL_EXTENSIONS));
>>> + printf("EGL_CLIENT_APIS = %s\n",
>>> + eglQueryString(_eglut->dpy, EGL_CLIENT_APIS));
>>> + }
>>> +}
>>> +
>>> +int
>>> +eglutGet(int state)
>>> +{
>>> + int val;
>>> +
>>> + switch (state) {
>>> + case EGLUT_ELAPSED_TIME:
>>> + val = _eglutNow() - _eglut->init_time;
>>> + break;
>>> + default:
>>> + val = -1;
>>> + break;
>>> + }
>>> +
>>> + return val;
>>> +}
>>> +
>>> +void
>>> +eglutIdleFunc(EGLUTidleCB func)
>>> +{
>>> + _eglut->idle_cb = func;
>>> +}
>>> +
>>> +void
>>> +eglutPostRedisplay(void)
>>> +{
>>> + _eglut->redisplay = 1;
>>> +}
>>> +
>>> +void
>>> +eglutMainLoop(void)
>>> +{
>>> + struct eglut_window *win = _eglut->current;
>>> +
>>> + if (!win)
>>> + _eglutFatal("no window is created\n");
>>> +
>>> + if (win->reshape_cb)
>>> + win->reshape_cb(win->native.width, win->native.height);
>>> +
>>> + _eglutNativeEventLoop();
>>> +}
>>> +
>>> +static void
>>> +_eglutFini(void)
>>> +{
>>> + eglTerminate(_eglut->dpy);
>>> + _eglutNativeFiniDisplay();
>>> +}
>>> +
>>> +void
>>> +eglutDestroyWindow(int win)
>>> +{
>>> + struct eglut_window *window = _eglut->current;
>>> +
>>> + if (window->index != win)
>>> + return;
>>> +
>>> + /* XXX it causes some bug in st/egl KMS backend */
>>> + if ( _eglut->surface_type != EGL_SCREEN_BIT_MESA)
>>> + eglMakeCurrent(_eglut->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE,
>>> EGL_NO_CONTEXT);
>>> +
>>> + _eglutDestroyWindow(_eglut->current);
>>> +}
>>> +
>>> +static void
>>> +_eglutDefaultKeyboard(unsigned char key)
>>> +{
>>> + if (key == 27) {
>>> + if (_eglut->current)
>>> + eglutDestroyWindow(_eglut->current->index);
>>> + _eglutFini();
>>> +
>>> + exit(0);
>>> + }
>>> +}
>>> +
>>> +int
>>> +eglutCreateWindow(const char *title)
>>> +{
>>> + struct eglut_window *win;
>>> +
>>> + win = _eglutCreateWindow(title, 0, 0,
>>> + _eglut->window_width, _eglut->window_height);
>>> +
>>> + win->index = _eglut->num_windows++;
>>> + win->reshape_cb = NULL;
>>> + win->display_cb = NULL;
>>> + win->keyboard_cb = _eglutDefaultKeyboard;
>>> + win->special_cb = NULL;
>>> +
>>> + if (!eglMakeCurrent(_eglut->dpy, win->surface, win->surface,
>>> win->context))
>>> + _eglutFatal("failed to make window current");
>>> + _eglut->current = win;
>>> +
>>> + return win->index;
>>> +}
>>> +
>>> +int
>>> +eglutGetWindowWidth(void)
>>> +{
>>> + struct eglut_window *win = _eglut->current;
>>> + return win->native.width;
>>> +}
>>> +
>>> +int
>>> +eglutGetWindowHeight(void)
>>> +{
>>> + struct eglut_window *win = _eglut->current;
>>> + return win->native.height;
>>> +}
>>> +
>>> +void
>>> +eglutDisplayFunc(EGLUTdisplayCB func)
>>> +{
>>> + struct eglut_window *win = _eglut->current;
>>> + win->display_cb = func;
>>> +
>>> +}
>>> +
>>> +void
>>> +eglutReshapeFunc(EGLUTreshapeCB func)
>>> +{
>>> + struct eglut_window *win = _eglut->current;
>>> + win->reshape_cb = func;
>>> +}
>>> +
>>> +void
>>> +eglutKeyboardFunc(EGLUTkeyboardCB func)
>>> +{
>>> + struct eglut_window *win = _eglut->current;
>>> + win->keyboard_cb = func;
>>> +}
>>> +
>>> +void
>>> +eglutSpecialFunc(EGLUTspecialCB func)
>>> +{
>>> + struct eglut_window *win = _eglut->current;
>>> + win->special_cb = func;
>>> +}
>>> diff --git a/tests/util/eglut/eglut.h b/tests/util/eglut/eglut.h
>>> new file mode 100644
>>> index 0000000..07df4ba
>>> --- /dev/null
>>> +++ b/tests/util/eglut/eglut.h
>>> @@ -0,0 +1,68 @@
>>> +#ifndef EGLUT_H
>>> +#define EGLUT_H
>>> +
>>> +/* used by eglutInitAPIMask */
>>> +enum {
>>> + EGLUT_OPENGL_BIT = 0x1,
>>> + EGLUT_OPENGL_ES1_BIT = 0x2,
>>> + EGLUT_OPENGL_ES2_BIT = 0x4,
>>> + EGLUT_OPENVG_BIT = 0x8
>>> +};
>>> +
>>> +/* used by EGLUTspecialCB */
>>> +enum {
>>> + /* function keys */
>>> + EGLUT_KEY_F1,
>>> + EGLUT_KEY_F2,
>>> + EGLUT_KEY_F3,
>>> + EGLUT_KEY_F4,
>>> + EGLUT_KEY_F5,
>>> + EGLUT_KEY_F6,
>>> + EGLUT_KEY_F7,
>>> + EGLUT_KEY_F8,
>>> + EGLUT_KEY_F9,
>>> + EGLUT_KEY_F10,
>>> + EGLUT_KEY_F11,
>>> + EGLUT_KEY_F12,
>>> +
>>> + /* directional keys */
>>> + EGLUT_KEY_LEFT,
>>> + EGLUT_KEY_UP,
>>> + EGLUT_KEY_RIGHT,
>>> + EGLUT_KEY_DOWN,
>>> +};
>>> +
>>> +/* used by eglutGet */
>>> +enum {
>>> + EGLUT_ELAPSED_TIME
>>> +};
>>> +
>>> +typedef void (*EGLUTidleCB)(void);
>>> +typedef void (*EGLUTreshapeCB)(int, int);
>>> +typedef void (*EGLUTdisplayCB)(void);
>>> +typedef void (*EGLUTkeyboardCB)(unsigned char);
>>> +typedef void (*EGLUTspecialCB)(int);
>>> +
>>> +void eglutInitAPIMask(int mask);
>>> +void eglutInitWindowSize(int width, int height);
>>> +void eglutInit(int argc, char **argv);
>>> +
>>> +int eglutGet(int state);
>>> +
>>> +void eglutIdleFunc(EGLUTidleCB func);
>>> +void eglutPostRedisplay(void);
>>> +
>>> +void eglutMainLoop(void);
>>> +
>>> +int eglutCreateWindow(const char *title);
>>> +void eglutDestroyWindow(int win);
>>> +
>>> +int eglutGetWindowWidth(void);
>>> +int eglutGetWindowHeight(void);
>>> +
>>> +void eglutDisplayFunc(EGLUTdisplayCB func);
>>> +void eglutReshapeFunc(EGLUTreshapeCB func);
>>> +void eglutKeyboardFunc(EGLUTkeyboardCB func);
>>> +void eglutSpecialFunc(EGLUTspecialCB func);
>>> +
>>> +#endif /* EGLUT_H */
>>> diff --git a/tests/util/eglut/eglut_x11.c b/tests/util/eglut/eglut_x11.c
>>> new file mode 100644
>>> index 0000000..f3b2280
>>> --- /dev/null
>>> +++ b/tests/util/eglut/eglut_x11.c
>>> @@ -0,0 +1,220 @@
>>> +#include<X11/Xlib.h>
>>> +#include<X11/Xutil.h>
>>> +#include<X11/keysym.h>
>>> +
>>> +#include "eglutint.h"
>>> +
>>> +void
>>> +_eglutNativeInitDisplay(void)
>>> +{
>>> + _eglut->native_dpy = XOpenDisplay(_eglut->display_name);
>>> + if (!_eglut->native_dpy)
>>> + _eglutFatal("failed to initialize native display");
>>> +
>>> + _eglut->surface_type = EGL_WINDOW_BIT;
>>> +}
>>> +
>>> +void
>>> +_eglutNativeFiniDisplay(void)
>>> +{
>>> + XCloseDisplay(_eglut->native_dpy);
>>> +}
>>> +
>>> +void
>>> +_eglutNativeInitWindow(struct eglut_window *win, const char *title,
>>> + int x, int y, int w, int h)
>>> +{
>>> + XVisualInfo *visInfo, visTemplate;
>>> + int num_visuals;
>>> + Window root, xwin;
>>> + XSetWindowAttributes attr;
>>> + unsigned long mask;
>>> + EGLint vid;
>>> +
>>> + if (!eglGetConfigAttrib(_eglut->dpy,
>>> + win->config, EGL_NATIVE_VISUAL_ID,&vid))
>>> + _eglutFatal("failed to get visual id");
>>> +
>>> + /* The X window visual must match the EGL config */
>>> + visTemplate.visualid = vid;
>>> + visInfo = XGetVisualInfo(_eglut->native_dpy,
>>> + VisualIDMask,&visTemplate,&num_visuals);
>>> + if (!visInfo)
>>> + _eglutFatal("failed to get an visual of id 0x%x", vid);
>>> +
>>> + root = RootWindow(_eglut->native_dpy,
>>> DefaultScreen(_eglut->native_dpy));
>>> +
>>> + /* window attributes */
>>> + attr.background_pixel = 0;
>>> + attr.border_pixel = 0;
>>> + attr.colormap = XCreateColormap(_eglut->native_dpy,
>>> + root, visInfo->visual, AllocNone);
>>> + attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
>>> + mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
>>> +
>>> + xwin = XCreateWindow(_eglut->native_dpy, root, x, y, w, h,
>>> + 0, visInfo->depth, InputOutput, visInfo->visual, mask,&attr);
>>> + if (!xwin)
>>> + _eglutFatal("failed to create a window");
>>> +
>>> + XFree(visInfo);
>>> +
>>> + /* set hints and properties */
>>> + {
>>> + XSizeHints sizehints;
>>> + sizehints.x = x;
>>> + sizehints.y = y;
>>> + sizehints.width = w;
>>> + sizehints.height = h;
>>> + sizehints.flags = USSize | USPosition;
>>> + XSetNormalHints(_eglut->native_dpy, xwin,&sizehints);
>>> + XSetStandardProperties(_eglut->native_dpy, xwin,
>>> + title, title, None, (char **) NULL, 0,&sizehints);
>>> + }
>>> +
>>> + XMapWindow(_eglut->native_dpy, xwin);
>>> +
>>> + win->native.u.window = xwin;
>>> + win->native.width = w;
>>> + win->native.height = h;
>>> +}
>>> +
>>> +void
>>> +_eglutNativeFiniWindow(struct eglut_window *win)
>>> +{
>>> + XDestroyWindow(_eglut->native_dpy, win->native.u.window);
>>> +}
>>> +
>>> +static int
>>> +lookup_keysym(KeySym sym)
>>> +{
>>> + int special;
>>> +
>>> + switch (sym) {
>>> + case XK_F1:
>>> + special = EGLUT_KEY_F1;
>>> + break;
>>> + case XK_F2:
>>> + special = EGLUT_KEY_F2;
>>> + break;
>>> + case XK_F3:
>>> + special = EGLUT_KEY_F3;
>>> + break;
>>> + case XK_F4:
>>> + special = EGLUT_KEY_F4;
>>> + break;
>>> + case XK_F5:
>>> + special = EGLUT_KEY_F5;
>>> + break;
>>> + case XK_F6:
>>> + special = EGLUT_KEY_F6;
>>> + break;
>>> + case XK_F7:
>>> + special = EGLUT_KEY_F7;
>>> + break;
>>> + case XK_F8:
>>> + special = EGLUT_KEY_F8;
>>> + break;
>>> + case XK_F9:
>>> + special = EGLUT_KEY_F9;
>>> + break;
>>> + case XK_F10:
>>> + special = EGLUT_KEY_F10;
>>> + break;
>>> + case XK_F11:
>>> + special = EGLUT_KEY_F11;
>>> + break;
>>> + case XK_F12:
>>> + special = EGLUT_KEY_F12;
>>> + break;
>>> + case XK_KP_Left:
>>> + case XK_Left:
>>> + special = EGLUT_KEY_LEFT;
>>> + break;
>>> + case XK_KP_Up:
>>> + case XK_Up:
>>> + special = EGLUT_KEY_UP;
>>> + break;
>>> + case XK_KP_Right:
>>> + case XK_Right:
>>> + special = EGLUT_KEY_RIGHT;
>>> + break;
>>> + case XK_KP_Down:
>>> + case XK_Down:
>>> + special = EGLUT_KEY_DOWN;
>>> + break;
>>> + default:
>>> + special = -1;
>>> + break;
>>> + }
>>> +
>>> + return special;
>>> +}
>>> +
>>> +static void
>>> +next_event(struct eglut_window *win)
>>> +{
>>> + int redraw = 0;
>>> + XEvent event;
>>> +
>>> + if (!XPending(_eglut->native_dpy)) {
>>> + if (_eglut->idle_cb)
>>> + _eglut->idle_cb();
>>> + return;
>>> + }
>>> +
>>> + XNextEvent(_eglut->native_dpy,&event);
>>> +
>>> + switch (event.type) {
>>> + case Expose:
>>> + redraw = 1;
>>> + break;
>>> + case ConfigureNotify:
>>> + win->native.width = event.xconfigure.width;
>>> + win->native.height = event.xconfigure.height;
>>> + if (win->reshape_cb)
>>> + win->reshape_cb(win->native.width, win->native.height);
>>> + break;
>>> + case KeyPress:
>>> + {
>>> + char buffer[1];
>>> + KeySym sym;
>>> + int r;
>>> +
>>> + r = XLookupString(&event.xkey,
>>> + buffer, sizeof(buffer),&sym, NULL);
>>> + if (r&& win->keyboard_cb) {
>>> + win->keyboard_cb(buffer[0]);
>>> + }
>>> + else if (!r&& win->special_cb) {
>>> + r = lookup_keysym(sym);
>>> + if (r>= 0)
>>> + win->special_cb(r);
>>> + }
>>> + }
>>> + redraw = 1;
>>> + break;
>>> + default:
>>> + ; /*no-op*/
>>> + }
>>> +
>>> + _eglut->redisplay = redraw;
>>> +}
>>> +
>>> +void
>>> +_eglutNativeEventLoop(void)
>>> +{
>>> + while (1) {
>>> + struct eglut_window *win = _eglut->current;
>>> +
>>> + next_event(win);
>>> +
>>> + if (_eglut->redisplay) {
>>> + _eglut->redisplay = 0;
>>> +
>>> + if (win->display_cb)
>>> + win->display_cb();
>>> + eglSwapBuffers(_eglut->dpy, win->surface);
>>> + }
>>> + }
>>> +}
>>> diff --git a/tests/util/eglut/eglutint.h b/tests/util/eglut/eglutint.h
>>> new file mode 100644
>>> index 0000000..54d329f
>>> --- /dev/null
>>> +++ b/tests/util/eglut/eglutint.h
>>> @@ -0,0 +1,78 @@
>>> +#ifndef _EGLUTINT_H_
>>> +#define _EGLUTINT_H_
>>> +
>>> +#include "EGL/egl.h"
>>> +#include "eglut.h"
>>> +
>>> +struct eglut_window {
>>> + EGLConfig config;
>>> + EGLContext context;
>>> +
>>> + /* initialized by native display */
>>> + struct {
>>> + union {
>>> + EGLNativeWindowType window;
>>> + EGLNativePixmapType pixmap;
>>> + EGLSurface surface; /* pbuffer or screen surface */
>>> + } u;
>>> + int width, height;
>>> + } native;
>>> +
>>> + EGLSurface surface;
>>> +
>>> + int index;
>>> +
>>> + EGLUTreshapeCB reshape_cb;
>>> + EGLUTdisplayCB display_cb;
>>> + EGLUTkeyboardCB keyboard_cb;
>>> + EGLUTspecialCB special_cb;
>>> +};
>>> +
>>> +struct eglut_state {
>>> + int api_mask;
>>> + int window_width, window_height;
>>> + const char *display_name;
>>> + int verbose;
>>> + int init_time;
>>> +
>>> + EGLUTidleCB idle_cb;
>>> +
>>> + int num_windows;
>>> +
>>> + /* initialized by native display */
>>> + EGLNativeDisplayType native_dpy;
>>> + EGLint surface_type;
>>> +
>>> + EGLDisplay dpy;
>>> + EGLint major, minor;
>>> +
>>> + struct eglut_window *current;
>>> +
>>> + int redisplay;
>>> +};
>>> +
>>> +extern struct eglut_state *_eglut;
>>> +
>>> +void
>>> +_eglutFatal(char *format, ...);
>>> +
>>> +int
>>> +_eglutNow(void);
>>> +
>>> +void
>>> +_eglutNativeInitDisplay(void);
>>> +
>>> +void
>>> +_eglutNativeFiniDisplay(void);
>>> +
>>> +void
>>> +_eglutNativeInitWindow(struct eglut_window *win, const char *title,
>>> + int x, int y, int w, int h);
>>> +
>>> +void
>>> +_eglutNativeFiniWindow(struct eglut_window *win);
>>> +
>>> +void
>>> +_eglutNativeEventLoop(void);
>>> +
>>> +#endif /* _EGLUTINT_H_ */
>>> --
>>> 1.7.2.3
>>>
>>> _______________________________________________
>>> Piglit mailing list
>>> Piglit at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/piglit
>>>
>
>
--
olv at LunarG.com
More information about the Piglit
mailing list