progs/egl: Move demos a level deeper.
authorChia-I Wu <olv@lunarg.com>
Thu, 1 Apr 2010 03:17:43 +0000 (11:17 +0800)
committerChia-I Wu <olv@lunarg.com>
Thu, 1 Apr 2010 14:25:48 +0000 (22:25 +0800)
Move the demos to "opengl" subdirectory.

29 files changed:
configs/linux-dri
configs/linux-egl
configure.ac
progs/egl/.gitignore [deleted file]
progs/egl/Makefile [deleted file]
progs/egl/demo1.c [deleted file]
progs/egl/demo2.c [deleted file]
progs/egl/demo3.c [deleted file]
progs/egl/eglgears.c [deleted file]
progs/egl/eglinfo.c [deleted file]
progs/egl/eglscreen.c [deleted file]
progs/egl/egltri.c [deleted file]
progs/egl/opengl/.gitignore [new file with mode: 0644]
progs/egl/opengl/Makefile [new file with mode: 0644]
progs/egl/opengl/demo1.c [new file with mode: 0644]
progs/egl/opengl/demo2.c [new file with mode: 0644]
progs/egl/opengl/demo3.c [new file with mode: 0644]
progs/egl/opengl/eglgears.c [new file with mode: 0644]
progs/egl/opengl/eglinfo.c [new file with mode: 0644]
progs/egl/opengl/eglscreen.c [new file with mode: 0644]
progs/egl/opengl/egltri.c [new file with mode: 0644]
progs/egl/opengl/peglgears.c [new file with mode: 0644]
progs/egl/opengl/xegl_tri.c [new file with mode: 0644]
progs/egl/opengl/xeglgears.c [new file with mode: 0644]
progs/egl/opengl/xeglthreads.c [new file with mode: 0644]
progs/egl/peglgears.c [deleted file]
progs/egl/xegl_tri.c [deleted file]
progs/egl/xeglgears.c [deleted file]
progs/egl/xeglthreads.c [deleted file]

index e21a3e9594364e3c32643ab253b4173a0d9b8a7b..9017becdafe993dfd70c2a731ff0c54488d7884c 100644 (file)
@@ -52,7 +52,7 @@ GL_LIB_DEPS   = $(EXTRA_LIB_PATH) -lX11 -lXext -lXxf86vm -lXdamage -lXfixes \
 
 # Directories
 SRC_DIRS := glx egl $(SRC_DIRS)
-PROGRAM_DIRS := egl $(PROGRAM_DIRS)
+PROGRAM_DIRS := egl/opengl $(PROGRAM_DIRS)
 
 # EGL directories
 EGL_DRIVERS_DIRS = glx
index 28165ed5b5a3f30a6d0d86c223a97b0fbdb445b0..cd664b4171f6c13647fe83c8c603bbbee07a8981 100644 (file)
@@ -48,7 +48,7 @@ GL_LIB_DEPS   = $(EXTRA_LIB_PATH) -lX11 -lXext -lXxf86vm -lXdamage -lXfixes \
 
 # Directories
 SRC_DIRS = gallium mesa gallium/winsys gallium/targets glu egl
-PROGRAM_DIRS = egl
+PROGRAM_DIRS = egl/opengl
 
 DRIVER_DIRS = dri
 GALLIUM_WINSYS_DIRS = egl_drm
index f2e87f4d4c2c102f6fe2263ccf8d5fc706a71feb..5647442ea17b1b5e76a4afc5d2b1dde978e46741 100644 (file)
@@ -954,7 +954,7 @@ if test "x$enable_egl" = xyes; then
     fi
 
     if test "$with_demos" = yes; then
-        PROGRAM_DIRS="$PROGRAM_DIRS egl"
+        PROGRAM_DIRS="$PROGRAM_DIRS egl/opengl"
     fi
 fi
 AC_SUBST([EGL_LIB_DEPS])
diff --git a/progs/egl/.gitignore b/progs/egl/.gitignore
deleted file mode 100644 (file)
index 7a13d46..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-demo1
-demo2
-demo3
-eglgears
-eglinfo
-eglscreen
-egltri
-peglgears
-xeglbindtex
-xeglgears
-xeglthreads
-xegl_tri
diff --git a/progs/egl/Makefile b/progs/egl/Makefile
deleted file mode 100644 (file)
index 890240f..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-# progs/egl/Makefile
-
-TOP = ../..
-include $(TOP)/configs/current
-
-
-INCLUDE_DIRS = -I$(TOP)/include
-
-HEADERS = $(TOP)/include/GLES/egl.h
-LIB_DEP = $(TOP)/$(LIB_DIR)/libEGL.so
-
-LIBS = -L$(TOP)/$(LIB_DIR) -lEGL -lGL
-
-PROGRAMS = \
-       demo1 \
-       demo2 \
-       demo3 \
-       egltri \
-       eglinfo \
-       eglgears \
-       eglscreen \
-       peglgears \
-       xeglgears \
-       xeglthreads \
-       xegl_tri
-
-
-.c.o:
-       $(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@
-
-
-
-default: $(PROGRAMS)
-
-demo1: demo1.o $(HEADERS) $(LIB_DEP)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
-
-demo2: demo2.o $(HEADERS) $(LIB_DEP)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
-
-demo3: demo3.o $(HEADERS) $(LIB_DEP)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
-
-egltri: egltri.o $(HEADERS) $(LIB_DEP)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
-
-eglinfo: eglinfo.o $(HEADERS) $(LIB_DEP)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
-
-eglgears: eglgears.o $(HEADERS) $(LIB_DEP)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB) -lm
-
-eglscreen: eglscreen.o $(HEADERS) $(LIB_DEP)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
-
-peglgears: peglgears.o $(HEADERS) $(LIB_DEP)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB) -lm
-
-xeglgears: xeglgears.o $(HEADERS) $(LIB_DEP)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lm $(X11_LIBS)
-
-xeglthreads: xeglthreads.o $(HEADERS) $(LIB_DEP)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lpthread -lm $(X11_LIBS)
-
-xegl_tri: xegl_tri.o $(HEADERS) $(LIB_DEP)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lm $(X11_LIBS)
-
-clean:
-       -rm -f *.o *~
-       -rm -f $(PROGRAMS)
diff --git a/progs/egl/demo1.c b/progs/egl/demo1.c
deleted file mode 100644 (file)
index d892734..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Exercise EGL API functions
- */
-
-#define EGL_EGLEXT_PROTOTYPES
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-/**
- * Test EGL_MESA_screen_surface functions
- */
-static void
-TestScreens(EGLDisplay dpy)
-{
-#define MAX 8
-   EGLScreenMESA screens[MAX];
-   EGLint numScreens;
-   EGLint i;
-
-   eglGetScreensMESA(dpy, screens, MAX, &numScreens);
-   printf("Found %d screens\n", numScreens);
-   for (i = 0; i < numScreens; i++) {
-      printf(" Screen %d handle: %d\n", i, (int) screens[i]);
-   }
-}
-
-/**
- * Print table of all available configurations.
- */
-static void
-PrintConfigs(EGLDisplay d, EGLConfig *configs, EGLint numConfigs)
-{
-   EGLint i;
-
-   printf("Configurations:\n");
-   printf("     bf lv d st colorbuffer dp st   supported \n");
-   printf("  id sz  l b ro  r  g  b  a th cl   surfaces  \n");
-   printf("----------------------------------------------\n");
-   for (i = 0; i < numConfigs; i++) {
-      EGLint id, size, level;
-      EGLint red, green, blue, alpha;
-      EGLint depth, stencil;
-      EGLint surfaces;
-      EGLint doubleBuf = 1, stereo = 0;
-      char surfString[100] = "";
-
-      eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id);
-      eglGetConfigAttrib(d, configs[i], EGL_BUFFER_SIZE, &size);
-      eglGetConfigAttrib(d, configs[i], EGL_LEVEL, &level);
-
-      eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red);
-      eglGetConfigAttrib(d, configs[i], EGL_GREEN_SIZE, &green);
-      eglGetConfigAttrib(d, configs[i], EGL_BLUE_SIZE, &blue);
-      eglGetConfigAttrib(d, configs[i], EGL_ALPHA_SIZE, &alpha);
-      eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth);
-      eglGetConfigAttrib(d, configs[i], EGL_STENCIL_SIZE, &stencil);
-      eglGetConfigAttrib(d, configs[i], EGL_SURFACE_TYPE, &surfaces);
-
-      if (surfaces & EGL_WINDOW_BIT)
-         strcat(surfString, "win,");
-      if (surfaces & EGL_PBUFFER_BIT)
-         strcat(surfString, "pb,");
-      if (surfaces & EGL_PIXMAP_BIT)
-         strcat(surfString, "pix,");
-      if (strlen(surfString) > 0)
-         surfString[strlen(surfString) - 1] = 0;
-
-      printf("0x%02x %2d %2d %c  %c %2d %2d %2d %2d %2d %2d   %-12s\n",
-             id, size, level,
-             doubleBuf ? 'y' : '.',
-             stereo ? 'y' : '.',
-             red, green, blue, alpha,
-             depth, stencil, surfString);
-   }
-}
-
-
-
-int
-main(int argc, char *argv[])
-{
-   int maj, min;
-   EGLContext ctx;
-   EGLSurface pbuffer;
-   EGLConfig *configs;
-   EGLint numConfigs;
-   EGLBoolean b;
-   const EGLint pbufAttribs[] = {
-      EGL_WIDTH, 500,
-      EGL_HEIGHT, 500,
-      EGL_NONE
-   };
-
-   EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-   assert(d);
-
-   if (!eglInitialize(d, &maj, &min)) {
-      printf("demo: eglInitialize failed\n");
-      exit(1);
-   }
-
-   printf("EGL version = %d.%d\n", maj, min);
-   printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
-
-   eglGetConfigs(d, NULL, 0, &numConfigs);
-   configs = malloc(sizeof(*configs) *numConfigs);
-   eglGetConfigs(d, configs, numConfigs, &numConfigs);
-
-   PrintConfigs(d, configs, numConfigs);
-
-   eglBindAPI(EGL_OPENGL_API);
-   ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
-   if (ctx == EGL_NO_CONTEXT) {
-      printf("failed to create context\n");
-      return 0;
-   }
-
-   pbuffer = eglCreatePbufferSurface(d, configs[0], pbufAttribs);
-   if (pbuffer == EGL_NO_SURFACE) {
-      printf("failed to create pbuffer\n");
-      return 0;
-   }
-
-   free(configs);
-
-   b = eglMakeCurrent(d, pbuffer, pbuffer, ctx);
-   if (!b) {
-      printf("make current failed\n");
-      return 0;
-   }
-
-   b = eglMakeCurrent(d, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-
-   TestScreens(d);
-
-   eglDestroySurface(d, pbuffer);
-   eglDestroyContext(d, ctx);
-   eglTerminate(d);
-
-   return 0;
-}
diff --git a/progs/egl/demo2.c b/progs/egl/demo2.c
deleted file mode 100644 (file)
index b9e92f6..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Exercise EGL API functions
- */
-
-#define EGL_EGLEXT_PROTOTYPES
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <GLES/gl.h>
-
-/*#define FRONTBUFFER*/
-
-static void _subset_Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2,
-                          GLfloat r, GLfloat g, GLfloat b)
-{
-   GLfloat v[4][2], c[4][4];
-   int i;
-
-   v[0][0] = x1;   v[0][1] = y1;
-   v[1][0] = x2;   v[1][1] = y1;
-   v[2][0] = x2;   v[2][1] = y2;
-   v[3][0] = x1;   v[3][1] = y2;
-
-   for (i = 0; i < 4; i++) {
-      c[i][0] = r;
-      c[i][1] = g;
-      c[i][2] = b;
-      c[i][3] = 1.0;
-   }
-
-   glVertexPointer(2, GL_FLOAT, 0, v);
-   glColorPointer(4, GL_FLOAT, 0, v);
-   glEnableClientState(GL_VERTEX_ARRAY);
-   glEnableClientState(GL_COLOR_ARRAY);
-
-   glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
-   glDisableClientState(GL_VERTEX_ARRAY);
-   glDisableClientState(GL_COLOR_ARRAY);
-}
-
-
-static void redraw(EGLDisplay dpy, EGLSurface surf, int rot)
-{
-   GLfloat r, g, b;
-
-   printf("Redraw event\n");
-
-   glClearColor( rand()/(float)RAND_MAX, 
-                rand()/(float)RAND_MAX, 
-                rand()/(float)RAND_MAX,
-                1);
-
-   glClear( GL_COLOR_BUFFER_BIT ); 
-
-   r = rand()/(float)RAND_MAX;
-   g = rand()/(float)RAND_MAX;
-   b = rand()/(float)RAND_MAX;
-
-   glPushMatrix();
-   glRotatef(rot, 0, 0, 1);
-   glScalef(.5, .5, .5);
-   _subset_Rectf( -1, -1, 1, 1, r, g, b );
-   glPopMatrix();
-
-#ifdef FRONTBUFFER
-   glFlush();
-#else
-   eglSwapBuffers( dpy, surf ); 
-#endif
-   glFinish();
-}
-
-
-/**
- * Test EGL_MESA_screen_surface functions
- */
-static void
-TestScreens(EGLDisplay dpy)
-{
-#define MAX 8
-   EGLScreenMESA screens[MAX];
-   EGLint numScreens;
-   EGLint i;
-
-   eglGetScreensMESA(dpy, screens, MAX, &numScreens);
-   printf("Found %d screens\n", numScreens);
-   for (i = 0; i < numScreens; i++) {
-      printf(" Screen %d handle: %d\n", i, (int) screens[i]);
-   }
-}
-
-
-int
-main(int argc, char *argv[])
-{
-   int maj, min;
-   EGLContext ctx;
-   EGLSurface pbuffer, screen_surf;
-   EGLConfig configs[10];
-   EGLint numConfigs, i;
-   EGLBoolean b;
-   const EGLint pbufAttribs[] = {
-      EGL_WIDTH, 500,
-      EGL_HEIGHT, 500,
-      EGL_NONE
-   };
-   EGLint screenAttribs[32];
-   EGLModeMESA mode;
-   EGLScreenMESA screen;
-   EGLint count;
-
-   EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-   assert(d);
-
-   if (!eglInitialize(d, &maj, &min)) {
-      printf("demo: eglInitialize failed\n");
-      exit(1);
-   }
-
-   printf("EGL version = %d.%d\n", maj, min);
-   printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
-   if (!strstr(eglQueryString(d, EGL_EXTENSIONS),
-               "EGL_MESA_screen_surface")) {
-      printf("EGL_MESA_screen_surface is not supported\n");
-      exit(1);
-   }
-
-   eglGetConfigs(d, configs, 10, &numConfigs);
-   printf("Got %d EGL configs:\n", numConfigs);
-   for (i = 0; i < numConfigs; i++) {
-      EGLint id, red, depth;
-      eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id);
-      eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red);
-      eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth);
-      printf("%2d:  Red Size = %d  Depth Size = %d\n", id, red, depth);
-   }
-   
-   eglGetScreensMESA(d, &screen, 1, &count);
-   eglGetModesMESA(d, screen, &mode, 1, &count);
-
-   eglBindAPI(EGL_OPENGL_API);
-   ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
-   if (ctx == EGL_NO_CONTEXT) {
-      printf("failed to create context\n");
-      return 0;
-   }
-
-   pbuffer = eglCreatePbufferSurface(d, configs[0], pbufAttribs);
-   if (pbuffer == EGL_NO_SURFACE) {
-      printf("failed to create pbuffer\n");
-      return 0;
-   }
-
-   b = eglMakeCurrent(d, pbuffer, pbuffer, ctx);
-   if (!b) {
-      printf("make current failed\n");
-      return 0;
-   }
-
-   b = eglMakeCurrent(d, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-
-   i = 0;
-   screenAttribs[i++] = EGL_WIDTH;
-   eglGetModeAttribMESA(d, mode, EGL_WIDTH, &screenAttribs[i++]);
-   screenAttribs[i++] = EGL_HEIGHT;
-   eglGetModeAttribMESA(d, mode, EGL_HEIGHT, &screenAttribs[i++]);
-   screenAttribs[i] = EGL_NONE;
-
-   screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
-   if (screen_surf == EGL_NO_SURFACE) {
-      printf("failed to create screen surface\n");
-      return 0;
-   }
-   
-   eglShowScreenSurfaceMESA(d, screen, screen_surf, mode);
-
-   b = eglMakeCurrent(d, screen_surf, screen_surf, ctx);
-   if (!b) {
-      printf("make current failed\n");
-      return 0;
-   }
-
-   glViewport(0, 0, 1024, 768);
-
-   glClearColor( 0, 
-                1.0, 
-                0,
-                1);
-
-   glClear( GL_COLOR_BUFFER_BIT ); 
-   
-      
-   TestScreens(d);
-
-   glShadeModel( GL_FLAT );
-   
-   for (i = 0; i < 6; i++) {
-      redraw(d, screen_surf, i*10 );
-
-      printf("sleep(1)\n");   
-      sleep(1);  
-   }
-
-   eglDestroySurface(d, pbuffer);
-   eglDestroyContext(d, ctx);
-   eglTerminate(d);
-
-   return 0;
-}
diff --git a/progs/egl/demo3.c b/progs/egl/demo3.c
deleted file mode 100644 (file)
index 64b9ee6..0000000
+++ /dev/null
@@ -1,647 +0,0 @@
-/*
- * Exercise EGL API functions
- */
-
-#define EGL_EGLEXT_PROTOTYPES
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <GL/gl.h>
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-
-
-#define PIXEL_CENTER(x) ((long)(x) + 0.5)
-
-#define GAP 10
-#define ROWS 3
-#define COLS 4
-
-#define OPENGL_WIDTH 48
-#define OPENGL_HEIGHT 13
-
-
-GLenum rgb, doubleBuffer, windType;
-GLint windW, windH;
-
-GLenum mode1, mode2;
-GLint boxW, boxH;
-GLubyte OpenGL_bits[] = {
-   0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 
-   0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
-   0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01, 
-   0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
-   0x3e, 0x8f, 0xb7, 0xf9, 0xfc, 0x01, 
-   0x63, 0xdb, 0xb0, 0x8d, 0x0d, 0x00,
-   0x63, 0xdb, 0xb7, 0x8d, 0x0d, 0x00, 
-   0x63, 0xdb, 0xb6, 0x8d, 0x0d, 0x00,
-   0x63, 0x8f, 0xf3, 0xcc, 0x0d, 0x00, 
-   0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0a,
-   0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0e, 
-   0x63, 0x00, 0x00, 0x8c, 0xed, 0x0e,
-   0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00, 
-};
-
-
-static void Init(void)
-{
-
-    mode1 = GL_TRUE;
-    mode2 = GL_TRUE;
-}
-
-static void Reshape(int width, int height)
-{
-
-    windW = (GLint)width;
-    windH = (GLint)height;
-}
-
-#if 0
-static void RotateColorMask(void)
-{
-    static GLint rotation = 0;
-    
-    rotation = (rotation + 1) & 0x3;
-    switch (rotation) {
-      case 0:
-       glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-       glIndexMask( 0xff );
-       break;
-      case 1:
-       glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
-       glIndexMask(0xFE);
-       break;
-      case 2:
-       glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
-       glIndexMask(0xFD);
-       break;
-      case 3:
-       glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
-       glIndexMask(0xFB);
-       break;
-    }
-}
-#endif
-
-static void Viewport(GLint row, GLint column)
-{
-    GLint x, y;
-
-    boxW = (windW - (COLS + 1) * GAP) / COLS;
-    boxH = (windH - (ROWS + 1) * GAP) / ROWS;
-
-    x = GAP + column * (boxW + GAP);
-    y = GAP + row * (boxH + GAP);
-
-    glViewport(x, y, boxW, boxH);
-
-    glMatrixMode(GL_PROJECTION);
-    glLoadIdentity();
-    glOrtho(-boxW/2, boxW/2, -boxH/2, boxH/2, 0.0, 1.0);
-    glMatrixMode(GL_MODELVIEW);
-
-    glEnable(GL_SCISSOR_TEST);
-    glScissor(x, y, boxW, boxH);
-}
-
-enum {
-    COLOR_BLACK = 0,
-    COLOR_RED,
-    COLOR_GREEN,
-    COLOR_YELLOW,
-    COLOR_BLUE,
-    COLOR_MAGENTA,
-    COLOR_CYAN,
-    COLOR_WHITE
-};
-
-static float RGBMap[9][3] = {
-    {0, 0, 0},
-    {1, 0, 0},
-    {0, 1, 0},
-    {1, 1, 0},
-    {0, 0, 1},
-    {1, 0, 1},
-    {0, 1, 1},
-    {1, 1, 1},
-    {0.5, 0.5, 0.5}
-};
-
-static void SetColor(int c)
-{
-     glColor3fv(RGBMap[c]);
-}
-
-static void Point(void)
-{
-    GLint i;
-
-    glBegin(GL_POINTS);
-       SetColor(COLOR_WHITE);
-       glVertex2i(0, 0);
-       for (i = 1; i < 8; i++) {
-           GLint j = i * 2;
-           SetColor(COLOR_BLACK+i);
-           glVertex2i(-j, -j);
-           glVertex2i(-j, 0);
-           glVertex2i(-j, j);
-           glVertex2i(0, j);
-           glVertex2i(j, j);
-           glVertex2i(j, 0);
-           glVertex2i(j, -j);
-           glVertex2i(0, -j);
-       }
-    glEnd();
-}
-
-static void Lines(void)
-{
-    GLint i;
-
-    glPushMatrix();
-
-    glTranslatef(-12, 0, 0);
-    for (i = 1; i < 8; i++) {
-       SetColor(COLOR_BLACK+i);
-       glBegin(GL_LINES);
-           glVertex2i(-boxW/4, -boxH/4);
-           glVertex2i(boxW/4, boxH/4);
-       glEnd();
-       glTranslatef(4, 0, 0);
-    }
-
-    glPopMatrix();
-
-    glBegin(GL_LINES);
-       glVertex2i(0, 0);
-    glEnd();
-}
-
-static void LineStrip(void)
-{
-
-    glBegin(GL_LINE_STRIP);
-       SetColor(COLOR_RED);
-       glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
-       SetColor(COLOR_GREEN);
-       glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
-       SetColor(COLOR_BLUE);
-       glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
-       SetColor(COLOR_WHITE);
-       glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
-    glEnd();
-
-    glBegin(GL_LINE_STRIP);
-       glVertex2i(0, 0);
-    glEnd();
-}
-
-static void LineLoop(void)
-{
-
-    glBegin(GL_LINE_LOOP);
-       SetColor(COLOR_RED);
-       glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
-       SetColor(COLOR_GREEN);
-       glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
-       SetColor(COLOR_BLUE);
-       glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
-       SetColor(COLOR_WHITE);
-       glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
-    glEnd();
-
-    glEnable(GL_LOGIC_OP);
-    glLogicOp(GL_XOR);
-
-    glEnable(GL_BLEND);
-    glBlendFunc(GL_ONE, GL_ONE);
-
-    SetColor(COLOR_MAGENTA);
-    glBegin(GL_LINE_LOOP);
-       glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(-boxH/8));
-       glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8));
-    glEnd();
-    glBegin(GL_LINE_LOOP);
-       glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8+5));
-       glVertex2f(PIXEL_CENTER(boxW/8), PIXEL_CENTER(boxH/8+5));
-    glEnd();
-    glDisable(GL_LOGIC_OP);
-    glDisable(GL_BLEND);
-
-    SetColor(COLOR_GREEN);
-    glBegin(GL_POINTS);
-       glVertex2i(0, 0);
-    glEnd();
-
-    glBegin(GL_LINE_LOOP);
-       glVertex2i(0, 0);
-    glEnd();
-}
-
-static void Bitmap(void)
-{
-
-    glBegin(GL_LINES);
-       SetColor(COLOR_GREEN);
-       glVertex2i(-boxW/2, 0);
-       glVertex2i(boxW/2, 0);
-       glVertex2i(0, -boxH/2);
-       glVertex2i(0, boxH/2);
-       SetColor(COLOR_RED);
-       glVertex2i(0, -3);
-       glVertex2i(0, -3+OPENGL_HEIGHT);
-       SetColor(COLOR_BLUE);
-       glVertex2i(0, -3);
-       glVertex2i(OPENGL_WIDTH, -3);
-    glEnd();
-
-    SetColor(COLOR_GREEN);
-
-    glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);
-    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
-    glRasterPos2i(0, 0);
-    glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, 0, 3, 0.0, 0.0, OpenGL_bits);
-}
-
-static void Triangles(void)
-{
-
-    glBegin(GL_TRIANGLES);
-       SetColor(COLOR_GREEN);
-       glVertex2i(-boxW/4, -boxH/4);
-       SetColor(COLOR_RED);
-       glVertex2i(-boxW/8, -boxH/16);
-       SetColor(COLOR_BLUE);
-       glVertex2i(boxW/8, -boxH/16);
-
-       SetColor(COLOR_GREEN);
-       glVertex2i(-boxW/4, boxH/4);
-       SetColor(COLOR_RED);
-       glVertex2i(-boxW/8, boxH/16);
-       SetColor(COLOR_BLUE);
-       glVertex2i(boxW/8, boxH/16);
-    glEnd();
-
-    glBegin(GL_TRIANGLES);
-       glVertex2i(0, 0);
-       glVertex2i(-100, 100);
-    glEnd();
-}
-
-static void TriangleStrip(void)
-{
-
-    glBegin(GL_TRIANGLE_STRIP);
-       SetColor(COLOR_GREEN);
-       glVertex2i(-boxW/4, -boxH/4);
-       SetColor(COLOR_RED);
-       glVertex2i(-boxW/4, boxH/4);
-       SetColor(COLOR_BLUE);
-       glVertex2i(0, -boxH/4);
-       SetColor(COLOR_WHITE);
-       glVertex2i(0, boxH/4);
-       SetColor(COLOR_CYAN);
-       glVertex2i(boxW/4, -boxH/4);
-       SetColor(COLOR_YELLOW);
-       glVertex2i(boxW/4, boxH/4);
-    glEnd();
-
-    glBegin(GL_TRIANGLE_STRIP);
-       glVertex2i(0, 0);
-       glVertex2i(-100, 100);
-    glEnd();
-}
-
-static void TriangleFan(void)
-{
-    GLint vx[8][2];
-    GLint x0, y0, x1, y1, x2, y2, x3, y3;
-    GLint i;
-
-    y0 = -boxH/4;
-    y1 = y0 + boxH/2/3;
-    y2 = y1 + boxH/2/3;
-    y3 = boxH/4;
-    x0 = -boxW/4;
-    x1 = x0 + boxW/2/3;
-    x2 = x1 + boxW/2/3;
-    x3 = boxW/4;
-
-    vx[0][0] = x0; vx[0][1] = y1;
-    vx[1][0] = x0; vx[1][1] = y2;
-    vx[2][0] = x1; vx[2][1] = y3;
-    vx[3][0] = x2; vx[3][1] = y3;
-    vx[4][0] = x3; vx[4][1] = y2;
-    vx[5][0] = x3; vx[5][1] = y1;
-    vx[6][0] = x2; vx[6][1] = y0;
-    vx[7][0] = x1; vx[7][1] = y0;
-
-    glBegin(GL_TRIANGLE_FAN);
-       SetColor(COLOR_WHITE);
-       glVertex2i(0, 0);
-       for (i = 0; i < 8; i++) {
-           SetColor(COLOR_WHITE-i);
-           glVertex2iv(vx[i]);
-       }
-    glEnd();
-
-    glBegin(GL_TRIANGLE_FAN);
-       glVertex2i(0, 0);
-       glVertex2i(-100, 100);
-    glEnd();
-}
-
-static void Rect(void)
-{
-
-    SetColor(COLOR_GREEN);
-    glRecti(-boxW/4, -boxH/4, boxW/4, boxH/4);
-}
-
-static void PolygonFunc(void)
-{
-    GLint vx[8][2];
-    GLint x0, y0, x1, y1, x2, y2, x3, y3;
-    GLint i;
-
-    y0 = -boxH/4;
-    y1 = y0 + boxH/2/3;
-    y2 = y1 + boxH/2/3;
-    y3 = boxH/4;
-    x0 = -boxW/4;
-    x1 = x0 + boxW/2/3;
-    x2 = x1 + boxW/2/3;
-    x3 = boxW/4;
-
-    vx[0][0] = x0; vx[0][1] = y1;
-    vx[1][0] = x0; vx[1][1] = y2;
-    vx[2][0] = x1; vx[2][1] = y3;
-    vx[3][0] = x2; vx[3][1] = y3;
-    vx[4][0] = x3; vx[4][1] = y2;
-    vx[5][0] = x3; vx[5][1] = y1;
-    vx[6][0] = x2; vx[6][1] = y0;
-    vx[7][0] = x1; vx[7][1] = y0;
-
-    glBegin(GL_POLYGON);
-       for (i = 0; i < 8; i++) {
-           SetColor(COLOR_WHITE-i);
-           glVertex2iv(vx[i]);
-       }
-    glEnd();
-
-    glBegin(GL_POLYGON);
-       glVertex2i(0, 0);
-       glVertex2i(100, 100);
-    glEnd();
-}
-
-static void Quads(void)
-{
-
-    glBegin(GL_QUADS);
-       SetColor(COLOR_GREEN);
-       glVertex2i(-boxW/4, -boxH/4);
-       SetColor(COLOR_RED);
-       glVertex2i(-boxW/8, -boxH/16);
-       SetColor(COLOR_BLUE);
-       glVertex2i(boxW/8, -boxH/16);
-       SetColor(COLOR_WHITE);
-       glVertex2i(boxW/4, -boxH/4);
-
-       SetColor(COLOR_GREEN);
-       glVertex2i(-boxW/4, boxH/4);
-       SetColor(COLOR_RED);
-       glVertex2i(-boxW/8, boxH/16);
-       SetColor(COLOR_BLUE);
-       glVertex2i(boxW/8, boxH/16);
-       SetColor(COLOR_WHITE);
-       glVertex2i(boxW/4, boxH/4);
-    glEnd();
-
-    glBegin(GL_QUADS);
-       glVertex2i(0, 0);
-       glVertex2i(100, 100);
-       glVertex2i(-100, 100);
-    glEnd();
-}
-
-static void QuadStrip(void)
-{
-
-    glBegin(GL_QUAD_STRIP);
-       SetColor(COLOR_GREEN);
-       glVertex2i(-boxW/4, -boxH/4);
-       SetColor(COLOR_RED);
-       glVertex2i(-boxW/4, boxH/4);
-       SetColor(COLOR_BLUE);
-       glVertex2i(0, -boxH/4);
-       SetColor(COLOR_WHITE);
-       glVertex2i(0, boxH/4);
-       SetColor(COLOR_CYAN);
-       glVertex2i(boxW/4, -boxH/4);
-       SetColor(COLOR_YELLOW);
-       glVertex2i(boxW/4, boxH/4);
-    glEnd();
-
-    glBegin(GL_QUAD_STRIP);
-       glVertex2i(0, 0);
-       glVertex2i(100, 100);
-       glVertex2i(-100, 100);
-    glEnd();
-}
-
-static void Draw(EGLDisplay dpy, EGLSurface surf)
-{
-
-    glViewport(0, 0, windW, windH);
-    glDisable(GL_SCISSOR_TEST);
-
-    glPushAttrib(GL_COLOR_BUFFER_BIT);
-
-    glColorMask(1, 1, 1, 1);
-    glIndexMask(~0);
-
-    glClearColor(0.0, 0.0, 0.0, 0.0);
-    glClear(GL_COLOR_BUFFER_BIT);
-
-    glPopAttrib();
-
-    if (mode1) {
-       glShadeModel(GL_SMOOTH);
-    } else {
-       glShadeModel(GL_FLAT);
-    }
-
-    if (mode2) {
-       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-    } else {
-       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-    }
-
-    Viewport(0, 0); Point();
-    Viewport(0, 1); Lines();
-    Viewport(0, 2); LineStrip();
-    Viewport(0, 3); LineLoop();
-
-    Viewport(1, 0); Bitmap();
-
-    Viewport(1, 1); TriangleFan();
-    Viewport(1, 2); Triangles();
-    Viewport(1, 3); TriangleStrip();
-
-    Viewport(2, 0); Rect();
-    Viewport(2, 1); PolygonFunc();
-    Viewport(2, 2); Quads();
-    Viewport(2, 3); QuadStrip();
-
-    glFlush();
-
-    if (doubleBuffer) {
-       eglSwapBuffers(dpy, surf);
-    }
-}
-
-static void
-write_ppm(const char *filename, const GLubyte *buffer, int width, int height)
-{
-   const int binary = 0;
-   FILE *f = fopen( filename, "w" );
-   if (f) {
-      int i, x, y;
-      const GLubyte *ptr = buffer;
-      if (binary) {
-         fprintf(f,"P6\n");
-         fprintf(f,"# ppm-file created by osdemo.c\n");
-         fprintf(f,"%i %i\n", width,height);
-         fprintf(f,"255\n");
-         fclose(f);
-         f = fopen( filename, "ab" );  /* reopen in binary append mode */
-         for (y=height-1; y>=0; y--) {
-            for (x=0; x<width; x++) {
-               i = (y*width + x) * 4;
-               fputc(ptr[i], f);   /* write red */
-               fputc(ptr[i+1], f); /* write green */
-               fputc(ptr[i+2], f); /* write blue */
-            }
-         }
-      }
-      else {
-         /*ASCII*/
-         int counter = 0;
-         fprintf(f,"P3\n");
-         fprintf(f,"# ascii ppm file created by osdemo.c\n");
-         fprintf(f,"%i %i\n", width, height);
-         fprintf(f,"255\n");
-         for (y=height-1; y>=0; y--) {
-            for (x=0; x<width; x++) {
-               i = (y*width + x) * 4;
-               fprintf(f, " %3d %3d %3d", ptr[i], ptr[i+1], ptr[i+2]);
-               counter++;
-               if (counter % 5 == 0)
-                  fprintf(f, "\n");
-            }
-         }
-      }
-      fclose(f);
-   }
-}
-
-int
-main(int argc, char *argv[])
-{
-   int maj, min;
-   EGLContext ctx;
-   EGLSurface screen_surf;
-   EGLConfig configs[10];
-   EGLScreenMESA screen;
-   EGLModeMESA mode;
-   EGLint numConfigs, count;
-   EGLBoolean b;
-   const GLubyte *bitmap;
-   EGLint screenAttribs[32];
-   EGLint i;
-
-   EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-   assert(d);
-
-   if (!eglInitialize(d, &maj, &min)) {
-      printf("demo: eglInitialize failed\n");
-      exit(1);
-   }
-
-   printf("EGL version = %d.%d\n", maj, min);
-   printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
-   if (!strstr(eglQueryString(d, EGL_EXTENSIONS),
-               "EGL_MESA_screen_surface")) {
-      printf("EGL_MESA_screen_surface is not supported\n");
-      exit(1);
-   }
-
-   eglGetConfigs(d, configs, 10, &numConfigs);
-   eglGetScreensMESA(d, &screen, 1, &count);
-   eglGetModesMESA(d, screen, &mode, 1, &count);
-
-   eglBindAPI(EGL_OPENGL_API);
-   ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
-   if (ctx == EGL_NO_CONTEXT) {
-      printf("failed to create context\n");
-      return 0;
-   }
-
-   i = 0;
-   screenAttribs[i++] = EGL_WIDTH;
-   eglGetModeAttribMESA(d, mode, EGL_WIDTH, &screenAttribs[i++]);
-   screenAttribs[i++] = EGL_HEIGHT;
-   eglGetModeAttribMESA(d, mode, EGL_HEIGHT, &screenAttribs[i++]);
-   screenAttribs[i] = EGL_NONE;
-
-   screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
-   if (screen_surf == EGL_NO_SURFACE) {
-      printf("failed to create screen surface\n");
-      return 0;
-   }
-
-   eglShowScreenSurfaceMESA(d, screen, screen_surf, mode);
-
-   b = eglMakeCurrent(d, screen_surf, screen_surf, ctx);
-   if (!b) {
-      printf("make current failed\n");
-      return 0;
-   }
-   glViewport(0, 0, 1024, 768);
-
-
-   Init();
-   Reshape(1024, 768);
-
-   /* some drivers crash when rendering to front buffer */
-#if 0
-   glDrawBuffer( GL_FRONT );
-   glClearColor( 0, 1.0, 0, 1);
-
-   glClear( GL_COLOR_BUFFER_BIT );
-#endif
-
-   doubleBuffer = 1;
-   glDrawBuffer( GL_BACK );
-
-   Draw(d, screen_surf);
-   sleep(2);
-
-   /* TODO EGL_KHR_lock_surface */
-   bitmap = NULL;
-   if (bitmap)
-      write_ppm("dump.ppm", bitmap, 1024, 768);
-
-   eglDestroySurface(d, screen_surf);
-   eglDestroyContext(d, ctx);
-   eglTerminate(d);
-
-   return 0;
-}
diff --git a/progs/egl/eglgears.c b/progs/egl/eglgears.c
deleted file mode 100644 (file)
index 6349095..0000000
+++ /dev/null
@@ -1,482 +0,0 @@
-/*
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * This is a port of the infamous "glxgears" demo to straight EGL
- * Port by Dane Rushton 10 July 2005
- * 
- * No command line options.
- * Program runs for 5 seconds then exits, outputing framerate to console
- */
-
-#define EGL_EGLEXT_PROTOTYPES
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <GL/gl.h>
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-#define MAX_CONFIGS 10
-#define MAX_MODES 100
-
-#define BENCHMARK
-
-#ifdef BENCHMARK
-
-/* XXX this probably isn't very portable */
-
-#include <sys/time.h>
-#include <unistd.h>
-
-/* return current time (in seconds) */
-static double
-current_time(void)
-{
-   struct timeval tv;
-#ifdef __VMS
-   (void) gettimeofday(&tv, NULL );
-#else
-   struct timezone tz;
-   (void) gettimeofday(&tv, &tz);
-#endif
-   return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
-}
-
-#else /*BENCHMARK*/
-
-/* dummy */
-static double
-current_time(void)
-{
-   /* update this function for other platforms! */
-   static double t = 0.0;
-   static int warn = 1;
-   if (warn) {
-      fprintf(stderr, "Warning: current_time() not implemented!!\n");
-      warn = 0;
-   }
-   return t += 1.0;
-}
-
-#endif /*BENCHMARK*/
-
-
-#ifndef M_PI
-#define M_PI 3.14159265
-#endif
-
-
-static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
-static GLint gear1, gear2, gear3;
-static GLfloat angle = 0.0;
-
-#if 0
-static GLfloat eyesep = 5.0;           /* Eye separation. */
-static GLfloat fix_point = 40.0;       /* Fixation point distance.  */
-static GLfloat left, right, asp;       /* Stereo frustum params.  */
-#endif
-
-
-/*
- *
- *  Draw a gear wheel.  You'll probably want to call this function when
- *  building a display list since we do a lot of trig here.
- * 
- *  Input:  inner_radius - radius of hole at center
- *          outer_radius - radius at center of teeth
- *          width - width of gear
- *          teeth - number of teeth
- *          tooth_depth - depth of tooth
- */
-static void
-gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
-     GLint teeth, GLfloat tooth_depth)
-{
-   GLint i;
-   GLfloat r0, r1, r2;
-   GLfloat angle, da;
-   GLfloat u, v, len;
-
-   r0 = inner_radius;
-   r1 = outer_radius - tooth_depth / 2.0;
-   r2 = outer_radius + tooth_depth / 2.0;
-
-   da = 2.0 * M_PI / teeth / 4.0;
-
-   glShadeModel(GL_FLAT);
-
-   glNormal3f(0.0, 0.0, 1.0);
-
-   /* draw front face */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i <= teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
-      if (i < teeth) {
-        glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
-        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                   width * 0.5);
-      }
-   }
-   glEnd();
-
-   /* draw front sides of teeth */
-   glBegin(GL_QUADS);
-   da = 2.0 * M_PI / teeth / 4.0;
-   for (i = 0; i < teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                width * 0.5);
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                width * 0.5);
-   }
-   glEnd();
-
-   glNormal3f(0.0, 0.0, -1.0);
-
-   /* draw back face */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i <= teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
-      if (i < teeth) {
-        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                   -width * 0.5);
-        glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
-      }
-   }
-   glEnd();
-
-   /* draw back sides of teeth */
-   glBegin(GL_QUADS);
-   da = 2.0 * M_PI / teeth / 4.0;
-   for (i = 0; i < teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                -width * 0.5);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                -width * 0.5);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
-   }
-   glEnd();
-
-   /* draw outward faces of teeth */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i < teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
-      u = r2 * cos(angle + da) - r1 * cos(angle);
-      v = r2 * sin(angle + da) - r1 * sin(angle);
-      len = sqrt(u * u + v * v);
-      u /= len;
-      v /= len;
-      glNormal3f(v, -u, 0.0);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
-      glNormal3f(cos(angle), sin(angle), 0.0);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                width * 0.5);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                -width * 0.5);
-      u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
-      v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
-      glNormal3f(v, -u, 0.0);
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                width * 0.5);
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                -width * 0.5);
-      glNormal3f(cos(angle), sin(angle), 0.0);
-   }
-
-   glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
-   glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
-
-   glEnd();
-
-   glShadeModel(GL_SMOOTH);
-
-   /* draw inside radius cylinder */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i <= teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-      glNormal3f(-cos(angle), -sin(angle), 0.0);
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
-   }
-   glEnd();
-}
-
-
-static void
-draw(void)
-{
-   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-   glPushMatrix();
-   glRotatef(view_rotx, 1.0, 0.0, 0.0);
-   glRotatef(view_roty, 0.0, 1.0, 0.0);
-   glRotatef(view_rotz, 0.0, 0.0, 1.0);
-
-   glPushMatrix();
-   glTranslatef(-3.0, -2.0, 0.0);
-   glRotatef(angle, 0.0, 0.0, 1.0);
-   glCallList(gear1);
-   glPopMatrix();
-
-   glPushMatrix();
-   glTranslatef(3.1, -2.0, 0.0);
-   glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
-   glCallList(gear2);
-   glPopMatrix();
-
-   glPushMatrix();
-   glTranslatef(-3.1, 4.2, 0.0);
-   glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
-   glCallList(gear3);
-   glPopMatrix();
-
-   glPopMatrix();
-}
-
-
-/* new window size or exposure */
-static void
-reshape(int width, int height)
-{
-   GLfloat h = (GLfloat) height / (GLfloat) width;
-
-   glViewport(0, 0, (GLint) width, (GLint) height);
-
-   glMatrixMode(GL_PROJECTION);
-   glLoadIdentity();
-   glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
-   
-   glMatrixMode(GL_MODELVIEW);
-   glLoadIdentity();
-   glTranslatef(0.0, 0.0, -40.0);
-}
-   
-
-
-static void
-init(void)
-{
-   static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 };
-   static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 };
-   static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 };
-   static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };
-
-   glLightfv(GL_LIGHT0, GL_POSITION, pos);
-   glEnable(GL_CULL_FACE);
-   glEnable(GL_LIGHTING);
-   glEnable(GL_LIGHT0);
-   glEnable(GL_DEPTH_TEST);
-
-   /* make the gears */
-   gear1 = glGenLists(1);
-   glNewList(gear1, GL_COMPILE);
-   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
-   gear(1.0, 4.0, 1.0, 20, 0.7);
-   glEndList();
-
-   gear2 = glGenLists(1);
-   glNewList(gear2, GL_COMPILE);
-   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
-   gear(0.5, 2.0, 2.0, 10, 0.7);
-   glEndList();
-
-   gear3 = glGenLists(1);
-   glNewList(gear3, GL_COMPILE);
-   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
-   gear(1.3, 2.0, 0.5, 10, 0.7);
-   glEndList();
-
-   glEnable(GL_NORMALIZE);
-}
-
-
-
-
-static void run_gears(EGLDisplay dpy, EGLSurface surf, int ttr)
-{
-       double st = current_time();
-       double ct = st;
-       int frames = 0;
-       GLfloat seconds, fps;
-
-       while (ct - st < ttr)
-       {
-               double tt = current_time();
-               double dt = tt - ct;
-               ct = tt;
-               
-               /* advance rotation for next frame */
-               angle += 70.0 * dt;  /* 70 degrees per second */
-               if (angle > 3600.0)
-                       angle -= 3600.0;
-               
-               draw();
-               
-               eglSwapBuffers(dpy, surf);
-       
-               
-               frames++;
-       }
-       
-       seconds = ct - st;
-       fps = frames / seconds;
-       printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, fps);
-       
-}
-
-
-int
-main(int argc, char *argv[])
-{
-       int maj, min;
-       EGLContext ctx;
-       EGLSurface screen_surf;
-       EGLConfig configs[MAX_CONFIGS];
-       EGLint numConfigs, i;
-       EGLBoolean b;
-       EGLDisplay d;
-       EGLint screenAttribs[10];
-       EGLModeMESA mode[MAX_MODES];
-       EGLScreenMESA screen;
-       EGLint count;
-       EGLint chosenMode = 0;
-       GLboolean printInfo = GL_FALSE;
-       EGLint width = 0, height = 0;
-       
-        /* parse cmd line args */
-       for (i = 1; i < argc; i++)
-       {
-               if (strcmp(argv[i], "-info") == 0)
-               {
-                       printInfo = GL_TRUE;
-               }
-               else
-                       printf("Warning: unknown parameter: %s\n", argv[i]);
-       }
-       
-       /* DBR : Create EGL context/surface etc */
-       d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-       assert(d);
-
-       if (!eglInitialize(d, &maj, &min)) {
-               printf("eglgears: eglInitialize failed\n");
-               exit(1);
-       }
-       
-       printf("eglgears: EGL version = %d.%d\n", maj, min);
-       printf("eglgears: EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
-       
-        /* XXX use ChooseConfig */
-       eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);
-       eglGetScreensMESA(d, &screen, 1, &count);
-
-       if (!eglGetModesMESA(d, screen, mode, MAX_MODES, &count) || count == 0) {
-               printf("eglgears: eglGetModesMESA failed!\n");
-               return 0;
-       }
-
-        /* Print list of modes, and find the one to use */
-       printf("eglgears: Found %d modes:\n", count);
-       for (i = 0; i < count; i++) {
-               EGLint w, h;
-               eglGetModeAttribMESA(d, mode[i], EGL_WIDTH, &w);
-               eglGetModeAttribMESA(d, mode[i], EGL_HEIGHT, &h);
-               printf("%3d: %d x %d\n", i, w, h);
-               if (w > width && h > height) {
-                       width = w;
-                       height = h;
-                        chosenMode = i;
-               }
-       }
-       printf("eglgears: Using screen mode/size %d: %d x %d\n", chosenMode, width, height);
-
-       eglBindAPI(EGL_OPENGL_API);
-       ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
-       if (ctx == EGL_NO_CONTEXT) {
-               printf("eglgears: failed to create context\n");
-               return 0;
-       }
-       
-       /* build up screenAttribs array */
-       i = 0;
-       screenAttribs[i++] = EGL_WIDTH;
-       screenAttribs[i++] = width;
-       screenAttribs[i++] = EGL_HEIGHT;
-       screenAttribs[i++] = height;
-       screenAttribs[i++] = EGL_NONE;
-
-       screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
-       if (screen_surf == EGL_NO_SURFACE) {
-               printf("eglgears: failed to create screen surface\n");
-               return 0;
-       }
-       
-       b = eglShowScreenSurfaceMESA(d, screen, screen_surf, mode[chosenMode]);
-       if (!b) {
-               printf("eglgears: show surface failed\n");
-               return 0;
-       }
-
-       b = eglMakeCurrent(d, screen_surf, screen_surf, ctx);
-       if (!b) {
-               printf("eglgears: make current failed\n");
-               return 0;
-       }
-       
-       if (printInfo)
-       {
-               printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
-               printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
-               printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
-               printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
-       }
-       
-       init();
-       reshape(width, height);
-
-        glDrawBuffer( GL_BACK );
-
-       run_gears(d, screen_surf, 5.0);
-       
-       eglDestroySurface(d, screen_surf);
-       eglDestroyContext(d, ctx);
-       eglTerminate(d);
-       
-       return 0;
-}
diff --git a/progs/egl/eglinfo.c b/progs/egl/eglinfo.c
deleted file mode 100644 (file)
index 961fd9c..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * eglinfo - like glxinfo but for EGL
- *
- * Brian Paul
- * 11 March 2005
- *
- * Copyright (C) 2005  Brian Paul   All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#define EGL_EGLEXT_PROTOTYPES
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define MAX_CONFIGS 1000
-#define MAX_MODES 1000
-#define MAX_SCREENS 10
-
-/* These are X visual types, so if you're running eglinfo under
- * something not X, they probably don't make sense. */
-static const char *vnames[] = { "SG", "GS", "SC", "PC", "TC", "DC" };
-
-/**
- * Print table of all available configurations.
- */
-static void
-PrintConfigs(EGLDisplay d)
-{
-   EGLConfig configs[MAX_CONFIGS];
-   EGLint numConfigs, i;
-
-   eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);
-
-   printf("Configurations:\n");
-   printf("     bf lv colorbuffer dp st  ms    vis   cav bi  renderable  supported\n");
-   printf("  id sz  l  r  g  b  a th cl ns b    id   eat nd gl es es2 vg surfaces \n");
-   printf("---------------------------------------------------------------------\n");
-   for (i = 0; i < numConfigs; i++) {
-      EGLint id, size, level;
-      EGLint red, green, blue, alpha;
-      EGLint depth, stencil;
-      EGLint renderable, surfaces;
-      EGLint vid, vtype, caveat, bindRgb, bindRgba;
-      EGLint samples, sampleBuffers;
-      char surfString[100] = "";
-
-      eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id);
-      eglGetConfigAttrib(d, configs[i], EGL_BUFFER_SIZE, &size);
-      eglGetConfigAttrib(d, configs[i], EGL_LEVEL, &level);
-
-      eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red);
-      eglGetConfigAttrib(d, configs[i], EGL_GREEN_SIZE, &green);
-      eglGetConfigAttrib(d, configs[i], EGL_BLUE_SIZE, &blue);
-      eglGetConfigAttrib(d, configs[i], EGL_ALPHA_SIZE, &alpha);
-      eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth);
-      eglGetConfigAttrib(d, configs[i], EGL_STENCIL_SIZE, &stencil);
-      eglGetConfigAttrib(d, configs[i], EGL_NATIVE_VISUAL_ID, &vid);
-      eglGetConfigAttrib(d, configs[i], EGL_NATIVE_VISUAL_TYPE, &vtype);
-
-      eglGetConfigAttrib(d, configs[i], EGL_CONFIG_CAVEAT, &caveat);
-      eglGetConfigAttrib(d, configs[i], EGL_BIND_TO_TEXTURE_RGB, &bindRgb);
-      eglGetConfigAttrib(d, configs[i], EGL_BIND_TO_TEXTURE_RGBA, &bindRgba);
-      eglGetConfigAttrib(d, configs[i], EGL_RENDERABLE_TYPE, &renderable);
-      eglGetConfigAttrib(d, configs[i], EGL_SURFACE_TYPE, &surfaces);
-
-      eglGetConfigAttrib(d, configs[i], EGL_SAMPLES, &samples);
-      eglGetConfigAttrib(d, configs[i], EGL_SAMPLE_BUFFERS, &sampleBuffers);
-
-      if (surfaces & EGL_WINDOW_BIT)
-         strcat(surfString, "win,");
-      if (surfaces & EGL_PBUFFER_BIT)
-         strcat(surfString, "pb,");
-      if (surfaces & EGL_PIXMAP_BIT)
-         strcat(surfString, "pix,");
-#ifdef EGL_MESA_screen_surface
-      if (surfaces & EGL_SCREEN_BIT_MESA)
-         strcat(surfString, "scrn,");
-#endif
-      if (strlen(surfString) > 0)
-         surfString[strlen(surfString) - 1] = 0;
-
-      printf("0x%02x %2d %2d %2d %2d %2d %2d %2d %2d %2d%2d 0x%02x%s ",
-             id, size, level,
-             red, green, blue, alpha,
-             depth, stencil,
-             samples, sampleBuffers, vid, vtype < 6 ? vnames[vtype] : "--");
-      printf("  %c  %c  %c  %c  %c   %c %s\n",
-             (caveat != EGL_NONE) ? 'y' : ' ',
-             (bindRgba) ? 'a' : (bindRgb) ? 'y' : ' ',
-             (renderable & EGL_OPENGL_BIT) ? 'y' : ' ',
-             (renderable & EGL_OPENGL_ES_BIT) ? 'y' : ' ',
-             (renderable & EGL_OPENGL_ES2_BIT) ? 'y' : ' ',
-             (renderable & EGL_OPENVG_BIT) ? 'y' : ' ',
-             surfString);
-   }
-}
-
-
-/**
- * Print table of all available configurations.
- */
-static void
-PrintModes(EGLDisplay d)
-{
-#ifdef EGL_MESA_screen_surface
-   const char *extensions = eglQueryString(d, EGL_EXTENSIONS);
-   if (strstr(extensions, "EGL_MESA_screen_surface")) {
-      EGLScreenMESA screens[MAX_SCREENS];
-      EGLint numScreens = 1, scrn;
-      EGLModeMESA modes[MAX_MODES];
-
-      eglGetScreensMESA(d, screens, MAX_SCREENS, &numScreens);
-      printf("Number of Screens: %d\n\n", numScreens);
-
-      for (scrn = 0; scrn < numScreens; scrn++) {
-         EGLint numModes, i;
-
-         eglGetModesMESA(d, screens[scrn], modes, MAX_MODES, &numModes);
-
-         printf("Screen %d Modes:\n", scrn);
-         printf("  id  width height refresh  name\n");
-         printf("-----------------------------------------\n");
-         for (i = 0; i < numModes; i++) {
-            EGLint id, w, h, r;
-            const char *str;
-            eglGetModeAttribMESA(d, modes[i], EGL_MODE_ID_MESA, &id);
-            eglGetModeAttribMESA(d, modes[i], EGL_WIDTH, &w);
-            eglGetModeAttribMESA(d, modes[i], EGL_HEIGHT, &h);
-            eglGetModeAttribMESA(d, modes[i], EGL_REFRESH_RATE_MESA, &r);
-            str = eglQueryModeStringMESA(d, modes[i]);
-            printf("0x%02x %5d  %5d   %.3f  %s\n", id, w, h, r / 1000.0, str);
-         }
-      }
-   }
-#endif
-}
-
-static void
-PrintExtensions(EGLDisplay d)
-{
-   const char *extensions, *p, *end, *next;
-   int column;
-
-   printf("EGL extensions string:\n");
-
-   extensions = eglQueryString(d, EGL_EXTENSIONS);
-
-   column = 0;
-   end = extensions + strlen(extensions);
-
-   for (p = extensions; p < end; p = next + 1) {
-      next = strchr(p, ' ');
-      if (next == NULL)
-         next = end;
-
-      if (column > 0 && column + next - p + 1 > 70) {
-        printf("\n");
-        column = 0;
-      }
-      if (column == 0)
-        printf("    ");
-      else
-        printf(" ");
-      column += next - p + 1;
-
-      printf("%.*s", (int) (next - p), p);
-
-      p = next + 1;
-   }
-
-   if (column > 0)
-      printf("\n");
-}
-
-int
-main(int argc, char *argv[])
-{
-   int maj, min;
-   EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-
-   if (!eglInitialize(d, &maj, &min)) {
-      printf("eglinfo: eglInitialize failed\n");
-      exit(1);
-   }
-
-   printf("EGL API version: %d.%d\n", maj, min);
-   printf("EGL vendor string: %s\n", eglQueryString(d, EGL_VENDOR));
-   printf("EGL version string: %s\n", eglQueryString(d, EGL_VERSION));
-#ifdef EGL_VERSION_1_2
-   printf("EGL client APIs: %s\n", eglQueryString(d, EGL_CLIENT_APIS));
-#endif
-
-   PrintExtensions(d);
-
-   PrintConfigs(d);
-
-   PrintModes(d);
-
-   eglTerminate(d);
-
-   return 0;
-}
diff --git a/progs/egl/eglscreen.c b/progs/egl/eglscreen.c
deleted file mode 100644 (file)
index 520f76e..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * Stolen from eglgears
- *
- * Creates a surface and show that on the first screen
- */
-
-#define EGL_EGLEXT_PROTOTYPES
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <GL/gl.h>
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-#define MAX_CONFIGS 10
-#define MAX_MODES 100
-
-int
-main(int argc, char *argv[])
-{
-       int maj, min;
-       EGLSurface screen_surf;
-       EGLConfig configs[MAX_CONFIGS];
-       EGLint numConfigs, i;
-       EGLBoolean b;
-       EGLDisplay d;
-       EGLint screenAttribs[10];
-       EGLModeMESA mode[MAX_MODES];
-       EGLScreenMESA screen;
-       EGLint count;
-       EGLint chosenMode = 0;
-       EGLint width = 0, height = 0;
-
-       d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-       assert(d);
-
-       if (!eglInitialize(d, &maj, &min)) {
-               printf("eglscreen: eglInitialize failed\n");
-               exit(1);
-       }
-
-       printf("eglscreen: EGL version = %d.%d\n", maj, min);
-       printf("eglscreen: EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
-
-       /* XXX use ChooseConfig */
-       eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);
-       eglGetScreensMESA(d, &screen, 1, &count);
-
-       if (!eglGetModesMESA(d, screen, mode, MAX_MODES, &count) || count == 0) {
-               printf("eglscreen: eglGetModesMESA failed!\n");
-               return 0;
-       }
-
-       /* Print list of modes, and find the one to use */
-       printf("eglscreen: Found %d modes:\n", count);
-       for (i = 0; i < count; i++) {
-               EGLint w, h;
-               eglGetModeAttribMESA(d, mode[i], EGL_WIDTH, &w);
-               eglGetModeAttribMESA(d, mode[i], EGL_HEIGHT, &h);
-               printf("%3d: %d x %d\n", i, w, h);
-               if (w > width && h > height) {
-                       width = w;
-                       height = h;
-                       chosenMode = i;
-               }
-       }
-       printf("eglscreen: Using screen mode/size %d: %d x %d\n", chosenMode, width, height);
-
-       /* build up screenAttribs array */
-       i = 0;
-       screenAttribs[i++] = EGL_WIDTH;
-       screenAttribs[i++] = width;
-       screenAttribs[i++] = EGL_HEIGHT;
-       screenAttribs[i++] = height;
-       screenAttribs[i++] = EGL_NONE;
-
-       screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
-       if (screen_surf == EGL_NO_SURFACE) {
-               printf("eglscreen: Failed to create screen surface\n");
-               return 0;
-       }
-
-       b = eglShowScreenSurfaceMESA(d, screen, screen_surf, mode[chosenMode]);
-       if (!b) {
-               printf("eglscreen: Show surface failed\n");
-               return 0;
-       }
-
-       usleep(5000000);
-
-       eglDestroySurface(d, screen_surf);
-       eglTerminate(d);
-
-       return 0;
-}
diff --git a/progs/egl/egltri.c b/progs/egl/egltri.c
deleted file mode 100644 (file)
index 006e06e..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
- * Copyright (C) 2008  Brian Paul   All Rights Reserved.
- * Copyright (C) 2008  Jakob Bornecrantz   All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * This program is based on eglgears and xegl_tri.
- * Remixed by Jakob Bornecrantz
- *
- * No command line options.
- * Program runs for 5 seconds then exits, outputing framerate to console
- */
-
-#define EGL_EGLEXT_PROTOTYPES
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <GL/gl.h>
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-#define MAX_CONFIGS 10
-#define MAX_MODES 100
-
-
-/* XXX this probably isn't very portable */
-
-#include <sys/time.h>
-#include <unistd.h>
-
-/* return current time (in seconds) */
-static double
-current_time(void)
-{
-   struct timeval tv;
-#ifdef __VMS
-   (void) gettimeofday(&tv, NULL );
-#else
-   struct timezone tz;
-   (void) gettimeofday(&tv, &tz);
-#endif
-   return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
-}
-
-
-static GLfloat view_rotx = 0.0, view_roty = 0.0, view_rotz = 0.0;
-
-static void draw()
-{
-       static const GLfloat verts[3][2] = {
-               { -1, -1 },
-               {  1, -1 },
-               {  0,  1 }
-       };
-       static const GLfloat colors[3][3] = {
-               { 1, 0, 0 },
-               { 0, 1, 0 },
-               { 0, 0, 1 }
-       };
-
-       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-       glPushMatrix();
-       glRotatef(view_rotx, 1, 0, 0);
-       glRotatef(view_roty, 0, 1, 0);
-       glRotatef(view_rotz, 0, 0, 1);
-
-       {
-               glVertexPointer(2, GL_FLOAT, 0, verts);
-               glColorPointer(3, GL_FLOAT, 0, colors);
-               glEnableClientState(GL_VERTEX_ARRAY);
-               glEnableClientState(GL_COLOR_ARRAY);
-
-               glDrawArrays(GL_TRIANGLES, 0, 3);
-
-               glDisableClientState(GL_VERTEX_ARRAY);
-               glDisableClientState(GL_COLOR_ARRAY);
-       }
-
-       glPopMatrix();
-}
-
-static void init()
-{
-       glClearColor(0.4, 0.4, 0.4, 0.0);
-}
-
-/* new window size or exposure */
-static void reshape(int width, int height)
-{
-       GLfloat ar = (GLfloat) width / (GLfloat) height;
-
-       glViewport(0, 0, (GLint) width, (GLint) height);
-
-       glMatrixMode(GL_PROJECTION);
-       glLoadIdentity();
-       glFrustum(-ar, ar, -1, 1, 5.0, 60.0);
-
-       glMatrixMode(GL_MODELVIEW);
-       glLoadIdentity();
-       glTranslatef(0.0, 0.0, -10.0);
-}
-
-static void run(EGLDisplay dpy, EGLSurface surf, int ttr)
-{
-       double st = current_time();
-       double ct = st;
-       int frames = 0;
-       GLfloat seconds, fps;
-
-       while (ct - st < ttr)
-       {
-               ct = current_time();
-
-               draw();
-
-               eglSwapBuffers(dpy, surf);
-
-               frames++;
-       }
-
-       seconds = ct - st;
-       fps = frames / seconds;
-       printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, fps);
-}
-
-int main(int argc, char *argv[])
-{
-       int maj, min;
-       EGLContext ctx;
-       EGLSurface screen_surf;
-       EGLConfig configs[MAX_CONFIGS];
-       EGLint numConfigs, i;
-       EGLBoolean b;
-       EGLDisplay d;
-       EGLint screenAttribs[10];
-       EGLModeMESA mode[MAX_MODES];
-       EGLScreenMESA screen;
-       EGLint count, chosenMode = 0;
-       GLboolean printInfo = GL_FALSE;
-       EGLint width = 0, height = 0;
-
-       /* parse cmd line args */
-       for (i = 1; i < argc; i++)
-       {
-               if (strcmp(argv[i], "-info") == 0)
-               {
-                       printInfo = GL_TRUE;
-               }
-               else
-                       printf("Warning: unknown parameter: %s\n", argv[i]);
-       }
-
-       /* DBR : Create EGL context/surface etc */
-       d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-       assert(d);
-
-       if (!eglInitialize(d, &maj, &min)) {
-               printf("egltri: eglInitialize failed\n");
-               exit(1);
-       }
-
-       printf("egltri: EGL version = %d.%d\n", maj, min);
-       printf("egltri: EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
-
-       /* XXX use ChooseConfig */
-       eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);
-       eglGetScreensMESA(d, &screen, 1, &count);
-
-       if (!eglGetModesMESA(d, screen, mode, MAX_MODES, &count) || count == 0) {
-               printf("egltri: eglGetModesMESA failed!\n");
-               return 0;
-       }
-
-       /* Print list of modes, and find the one to use */
-       printf("egltri: Found %d modes:\n", count);
-       for (i = 0; i < count; i++) {
-               EGLint w, h;
-               eglGetModeAttribMESA(d, mode[i], EGL_WIDTH, &w);
-               eglGetModeAttribMESA(d, mode[i], EGL_HEIGHT, &h);
-               printf("%3d: %d x %d\n", i, w, h);
-               if (w > width && h > height) {
-                       width = w;
-                       height = h;
-                       chosenMode = i;
-               }
-       }
-       printf("egltri: Using screen mode/size %d: %d x %d\n", chosenMode, width, height);
-
-       eglBindAPI(EGL_OPENGL_API);
-       ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
-       if (ctx == EGL_NO_CONTEXT) {
-               printf("egltri: failed to create context\n");
-               return 0;
-       }
-
-       /* build up screenAttribs array */
-       i = 0;
-       screenAttribs[i++] = EGL_WIDTH;
-       screenAttribs[i++] = width;
-       screenAttribs[i++] = EGL_HEIGHT;
-       screenAttribs[i++] = height;
-       screenAttribs[i++] = EGL_NONE;
-
-       screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
-       if (screen_surf == EGL_NO_SURFACE) {
-               printf("egltri: failed to create screen surface\n");
-               return 0;
-       }
-
-       b = eglShowScreenSurfaceMESA(d, screen, screen_surf, mode[chosenMode]);
-       if (!b) {
-               printf("egltri: show surface failed\n");
-               return 0;
-       }
-
-       b = eglMakeCurrent(d, screen_surf, screen_surf, ctx);
-       if (!b) {
-               printf("egltri: make current failed\n");
-               return 0;
-       }
-
-       if (printInfo)
-       {
-               printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
-               printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
-               printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
-               printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
-       }
-
-       init();
-       reshape(width, height);
-
-       glDrawBuffer( GL_BACK );
-
-       run(d, screen_surf, 5.0);
-
-       eglDestroySurface(d, screen_surf);
-       eglDestroyContext(d, ctx);
-       eglTerminate(d);
-
-       return 0;
-}
diff --git a/progs/egl/opengl/.gitignore b/progs/egl/opengl/.gitignore
new file mode 100644 (file)
index 0000000..7a13d46
--- /dev/null
@@ -0,0 +1,12 @@
+demo1
+demo2
+demo3
+eglgears
+eglinfo
+eglscreen
+egltri
+peglgears
+xeglbindtex
+xeglgears
+xeglthreads
+xegl_tri
diff --git a/progs/egl/opengl/Makefile b/progs/egl/opengl/Makefile
new file mode 100644 (file)
index 0000000..50a60c7
--- /dev/null
@@ -0,0 +1,70 @@
+# progs/egl/Makefile
+
+TOP = ../../..
+include $(TOP)/configs/current
+
+
+INCLUDE_DIRS = -I$(TOP)/include
+
+HEADERS = $(TOP)/include/GLES/egl.h
+LIB_DEP = $(TOP)/$(LIB_DIR)/libEGL.so
+
+LIBS = -L$(TOP)/$(LIB_DIR) -lEGL -lGL
+
+PROGRAMS = \
+       demo1 \
+       demo2 \
+       demo3 \
+       egltri \
+       eglinfo \
+       eglgears \
+       eglscreen \
+       peglgears \
+       xeglgears \
+       xeglthreads \
+       xegl_tri
+
+
+.c.o:
+       $(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@
+
+
+
+default: $(PROGRAMS)
+
+demo1: demo1.o $(HEADERS) $(LIB_DEP)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
+
+demo2: demo2.o $(HEADERS) $(LIB_DEP)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
+
+demo3: demo3.o $(HEADERS) $(LIB_DEP)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
+
+egltri: egltri.o $(HEADERS) $(LIB_DEP)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
+
+eglinfo: eglinfo.o $(HEADERS) $(LIB_DEP)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
+
+eglgears: eglgears.o $(HEADERS) $(LIB_DEP)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB) -lm
+
+eglscreen: eglscreen.o $(HEADERS) $(LIB_DEP)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
+
+peglgears: peglgears.o $(HEADERS) $(LIB_DEP)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB) -lm
+
+xeglgears: xeglgears.o $(HEADERS) $(LIB_DEP)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lm $(X11_LIBS)
+
+xeglthreads: xeglthreads.o $(HEADERS) $(LIB_DEP)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lpthread -lm $(X11_LIBS)
+
+xegl_tri: xegl_tri.o $(HEADERS) $(LIB_DEP)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lm $(X11_LIBS)
+
+clean:
+       -rm -f *.o *~
+       -rm -f $(PROGRAMS)
diff --git a/progs/egl/opengl/demo1.c b/progs/egl/opengl/demo1.c
new file mode 100644 (file)
index 0000000..d892734
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * Exercise EGL API functions
+ */
+
+#define EGL_EGLEXT_PROTOTYPES
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/**
+ * Test EGL_MESA_screen_surface functions
+ */
+static void
+TestScreens(EGLDisplay dpy)
+{
+#define MAX 8
+   EGLScreenMESA screens[MAX];
+   EGLint numScreens;
+   EGLint i;
+
+   eglGetScreensMESA(dpy, screens, MAX, &numScreens);
+   printf("Found %d screens\n", numScreens);
+   for (i = 0; i < numScreens; i++) {
+      printf(" Screen %d handle: %d\n", i, (int) screens[i]);
+   }
+}
+
+/**
+ * Print table of all available configurations.
+ */
+static void
+PrintConfigs(EGLDisplay d, EGLConfig *configs, EGLint numConfigs)
+{
+   EGLint i;
+
+   printf("Configurations:\n");
+   printf("     bf lv d st colorbuffer dp st   supported \n");
+   printf("  id sz  l b ro  r  g  b  a th cl   surfaces  \n");
+   printf("----------------------------------------------\n");
+   for (i = 0; i < numConfigs; i++) {
+      EGLint id, size, level;
+      EGLint red, green, blue, alpha;
+      EGLint depth, stencil;
+      EGLint surfaces;
+      EGLint doubleBuf = 1, stereo = 0;
+      char surfString[100] = "";
+
+      eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id);
+      eglGetConfigAttrib(d, configs[i], EGL_BUFFER_SIZE, &size);
+      eglGetConfigAttrib(d, configs[i], EGL_LEVEL, &level);
+
+      eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red);
+      eglGetConfigAttrib(d, configs[i], EGL_GREEN_SIZE, &green);
+      eglGetConfigAttrib(d, configs[i], EGL_BLUE_SIZE, &blue);
+      eglGetConfigAttrib(d, configs[i], EGL_ALPHA_SIZE, &alpha);
+      eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth);
+      eglGetConfigAttrib(d, configs[i], EGL_STENCIL_SIZE, &stencil);
+      eglGetConfigAttrib(d, configs[i], EGL_SURFACE_TYPE, &surfaces);
+
+      if (surfaces & EGL_WINDOW_BIT)
+         strcat(surfString, "win,");
+      if (surfaces & EGL_PBUFFER_BIT)
+         strcat(surfString, "pb,");
+      if (surfaces & EGL_PIXMAP_BIT)
+         strcat(surfString, "pix,");
+      if (strlen(surfString) > 0)
+         surfString[strlen(surfString) - 1] = 0;
+
+      printf("0x%02x %2d %2d %c  %c %2d %2d %2d %2d %2d %2d   %-12s\n",
+             id, size, level,
+             doubleBuf ? 'y' : '.',
+             stereo ? 'y' : '.',
+             red, green, blue, alpha,
+             depth, stencil, surfString);
+   }
+}
+
+
+
+int
+main(int argc, char *argv[])
+{
+   int maj, min;
+   EGLContext ctx;
+   EGLSurface pbuffer;
+   EGLConfig *configs;
+   EGLint numConfigs;
+   EGLBoolean b;
+   const EGLint pbufAttribs[] = {
+      EGL_WIDTH, 500,
+      EGL_HEIGHT, 500,
+      EGL_NONE
+   };
+
+   EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+   assert(d);
+
+   if (!eglInitialize(d, &maj, &min)) {
+      printf("demo: eglInitialize failed\n");
+      exit(1);
+   }
+
+   printf("EGL version = %d.%d\n", maj, min);
+   printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
+
+   eglGetConfigs(d, NULL, 0, &numConfigs);
+   configs = malloc(sizeof(*configs) *numConfigs);
+   eglGetConfigs(d, configs, numConfigs, &numConfigs);
+
+   PrintConfigs(d, configs, numConfigs);
+
+   eglBindAPI(EGL_OPENGL_API);
+   ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
+   if (ctx == EGL_NO_CONTEXT) {
+      printf("failed to create context\n");
+      return 0;
+   }
+
+   pbuffer = eglCreatePbufferSurface(d, configs[0], pbufAttribs);
+   if (pbuffer == EGL_NO_SURFACE) {
+      printf("failed to create pbuffer\n");
+      return 0;
+   }
+
+   free(configs);
+
+   b = eglMakeCurrent(d, pbuffer, pbuffer, ctx);
+   if (!b) {
+      printf("make current failed\n");
+      return 0;
+   }
+
+   b = eglMakeCurrent(d, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+
+   TestScreens(d);
+
+   eglDestroySurface(d, pbuffer);
+   eglDestroyContext(d, ctx);
+   eglTerminate(d);
+
+   return 0;
+}
diff --git a/progs/egl/opengl/demo2.c b/progs/egl/opengl/demo2.c
new file mode 100644 (file)
index 0000000..b9e92f6
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * Exercise EGL API functions
+ */
+
+#define EGL_EGLEXT_PROTOTYPES
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GLES/gl.h>
+
+/*#define FRONTBUFFER*/
+
+static void _subset_Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2,
+                          GLfloat r, GLfloat g, GLfloat b)
+{
+   GLfloat v[4][2], c[4][4];
+   int i;
+
+   v[0][0] = x1;   v[0][1] = y1;
+   v[1][0] = x2;   v[1][1] = y1;
+   v[2][0] = x2;   v[2][1] = y2;
+   v[3][0] = x1;   v[3][1] = y2;
+
+   for (i = 0; i < 4; i++) {
+      c[i][0] = r;
+      c[i][1] = g;
+      c[i][2] = b;
+      c[i][3] = 1.0;
+   }
+
+   glVertexPointer(2, GL_FLOAT, 0, v);
+   glColorPointer(4, GL_FLOAT, 0, v);
+   glEnableClientState(GL_VERTEX_ARRAY);
+   glEnableClientState(GL_COLOR_ARRAY);
+
+   glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+   glDisableClientState(GL_VERTEX_ARRAY);
+   glDisableClientState(GL_COLOR_ARRAY);
+}
+
+
+static void redraw(EGLDisplay dpy, EGLSurface surf, int rot)
+{
+   GLfloat r, g, b;
+
+   printf("Redraw event\n");
+
+   glClearColor( rand()/(float)RAND_MAX, 
+                rand()/(float)RAND_MAX, 
+                rand()/(float)RAND_MAX,
+                1);
+
+   glClear( GL_COLOR_BUFFER_BIT ); 
+
+   r = rand()/(float)RAND_MAX;
+   g = rand()/(float)RAND_MAX;
+   b = rand()/(float)RAND_MAX;
+
+   glPushMatrix();
+   glRotatef(rot, 0, 0, 1);
+   glScalef(.5, .5, .5);
+   _subset_Rectf( -1, -1, 1, 1, r, g, b );
+   glPopMatrix();
+
+#ifdef FRONTBUFFER
+   glFlush();
+#else
+   eglSwapBuffers( dpy, surf ); 
+#endif
+   glFinish();
+}
+
+
+/**
+ * Test EGL_MESA_screen_surface functions
+ */
+static void
+TestScreens(EGLDisplay dpy)
+{
+#define MAX 8
+   EGLScreenMESA screens[MAX];
+   EGLint numScreens;
+   EGLint i;
+
+   eglGetScreensMESA(dpy, screens, MAX, &numScreens);
+   printf("Found %d screens\n", numScreens);
+   for (i = 0; i < numScreens; i++) {
+      printf(" Screen %d handle: %d\n", i, (int) screens[i]);
+   }
+}
+
+
+int
+main(int argc, char *argv[])
+{
+   int maj, min;
+   EGLContext ctx;
+   EGLSurface pbuffer, screen_surf;
+   EGLConfig configs[10];
+   EGLint numConfigs, i;
+   EGLBoolean b;
+   const EGLint pbufAttribs[] = {
+      EGL_WIDTH, 500,
+      EGL_HEIGHT, 500,
+      EGL_NONE
+   };
+   EGLint screenAttribs[32];
+   EGLModeMESA mode;
+   EGLScreenMESA screen;
+   EGLint count;
+
+   EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+   assert(d);
+
+   if (!eglInitialize(d, &maj, &min)) {
+      printf("demo: eglInitialize failed\n");
+      exit(1);
+   }
+
+   printf("EGL version = %d.%d\n", maj, min);
+   printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
+   if (!strstr(eglQueryString(d, EGL_EXTENSIONS),
+               "EGL_MESA_screen_surface")) {
+      printf("EGL_MESA_screen_surface is not supported\n");
+      exit(1);
+   }
+
+   eglGetConfigs(d, configs, 10, &numConfigs);
+   printf("Got %d EGL configs:\n", numConfigs);
+   for (i = 0; i < numConfigs; i++) {
+      EGLint id, red, depth;
+      eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id);
+      eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red);
+      eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth);
+      printf("%2d:  Red Size = %d  Depth Size = %d\n", id, red, depth);
+   }
+   
+   eglGetScreensMESA(d, &screen, 1, &count);
+   eglGetModesMESA(d, screen, &mode, 1, &count);
+
+   eglBindAPI(EGL_OPENGL_API);
+   ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
+   if (ctx == EGL_NO_CONTEXT) {
+      printf("failed to create context\n");
+      return 0;
+   }
+
+   pbuffer = eglCreatePbufferSurface(d, configs[0], pbufAttribs);
+   if (pbuffer == EGL_NO_SURFACE) {
+      printf("failed to create pbuffer\n");
+      return 0;
+   }
+
+   b = eglMakeCurrent(d, pbuffer, pbuffer, ctx);
+   if (!b) {
+      printf("make current failed\n");
+      return 0;
+   }
+
+   b = eglMakeCurrent(d, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+
+   i = 0;
+   screenAttribs[i++] = EGL_WIDTH;
+   eglGetModeAttribMESA(d, mode, EGL_WIDTH, &screenAttribs[i++]);
+   screenAttribs[i++] = EGL_HEIGHT;
+   eglGetModeAttribMESA(d, mode, EGL_HEIGHT, &screenAttribs[i++]);
+   screenAttribs[i] = EGL_NONE;
+
+   screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
+   if (screen_surf == EGL_NO_SURFACE) {
+      printf("failed to create screen surface\n");
+      return 0;
+   }
+   
+   eglShowScreenSurfaceMESA(d, screen, screen_surf, mode);
+
+   b = eglMakeCurrent(d, screen_surf, screen_surf, ctx);
+   if (!b) {
+      printf("make current failed\n");
+      return 0;
+   }
+
+   glViewport(0, 0, 1024, 768);
+
+   glClearColor( 0, 
+                1.0, 
+                0,
+                1);
+
+   glClear( GL_COLOR_BUFFER_BIT ); 
+   
+      
+   TestScreens(d);
+
+   glShadeModel( GL_FLAT );
+   
+   for (i = 0; i < 6; i++) {
+      redraw(d, screen_surf, i*10 );
+
+      printf("sleep(1)\n");   
+      sleep(1);  
+   }
+
+   eglDestroySurface(d, pbuffer);
+   eglDestroyContext(d, ctx);
+   eglTerminate(d);
+
+   return 0;
+}
diff --git a/progs/egl/opengl/demo3.c b/progs/egl/opengl/demo3.c
new file mode 100644 (file)
index 0000000..64b9ee6
--- /dev/null
@@ -0,0 +1,647 @@
+/*
+ * Exercise EGL API functions
+ */
+
+#define EGL_EGLEXT_PROTOTYPES
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GL/gl.h>
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+
+#define PIXEL_CENTER(x) ((long)(x) + 0.5)
+
+#define GAP 10
+#define ROWS 3
+#define COLS 4
+
+#define OPENGL_WIDTH 48
+#define OPENGL_HEIGHT 13
+
+
+GLenum rgb, doubleBuffer, windType;
+GLint windW, windH;
+
+GLenum mode1, mode2;
+GLint boxW, boxH;
+GLubyte OpenGL_bits[] = {
+   0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 
+   0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
+   0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01, 
+   0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
+   0x3e, 0x8f, 0xb7, 0xf9, 0xfc, 0x01, 
+   0x63, 0xdb, 0xb0, 0x8d, 0x0d, 0x00,
+   0x63, 0xdb, 0xb7, 0x8d, 0x0d, 0x00, 
+   0x63, 0xdb, 0xb6, 0x8d, 0x0d, 0x00,
+   0x63, 0x8f, 0xf3, 0xcc, 0x0d, 0x00, 
+   0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0a,
+   0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0e, 
+   0x63, 0x00, 0x00, 0x8c, 0xed, 0x0e,
+   0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00, 
+};
+
+
+static void Init(void)
+{
+
+    mode1 = GL_TRUE;
+    mode2 = GL_TRUE;
+}
+
+static void Reshape(int width, int height)
+{
+
+    windW = (GLint)width;
+    windH = (GLint)height;
+}
+
+#if 0
+static void RotateColorMask(void)
+{
+    static GLint rotation = 0;
+    
+    rotation = (rotation + 1) & 0x3;
+    switch (rotation) {
+      case 0:
+       glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+       glIndexMask( 0xff );
+       break;
+      case 1:
+       glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
+       glIndexMask(0xFE);
+       break;
+      case 2:
+       glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
+       glIndexMask(0xFD);
+       break;
+      case 3:
+       glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
+       glIndexMask(0xFB);
+       break;
+    }
+}
+#endif
+
+static void Viewport(GLint row, GLint column)
+{
+    GLint x, y;
+
+    boxW = (windW - (COLS + 1) * GAP) / COLS;
+    boxH = (windH - (ROWS + 1) * GAP) / ROWS;
+
+    x = GAP + column * (boxW + GAP);
+    y = GAP + row * (boxH + GAP);
+
+    glViewport(x, y, boxW, boxH);
+
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();
+    glOrtho(-boxW/2, boxW/2, -boxH/2, boxH/2, 0.0, 1.0);
+    glMatrixMode(GL_MODELVIEW);
+
+    glEnable(GL_SCISSOR_TEST);
+    glScissor(x, y, boxW, boxH);
+}
+
+enum {
+    COLOR_BLACK = 0,
+    COLOR_RED,
+    COLOR_GREEN,
+    COLOR_YELLOW,
+    COLOR_BLUE,
+    COLOR_MAGENTA,
+    COLOR_CYAN,
+    COLOR_WHITE
+};
+
+static float RGBMap[9][3] = {
+    {0, 0, 0},
+    {1, 0, 0},
+    {0, 1, 0},
+    {1, 1, 0},
+    {0, 0, 1},
+    {1, 0, 1},
+    {0, 1, 1},
+    {1, 1, 1},
+    {0.5, 0.5, 0.5}
+};
+
+static void SetColor(int c)
+{
+     glColor3fv(RGBMap[c]);
+}
+
+static void Point(void)
+{
+    GLint i;
+
+    glBegin(GL_POINTS);
+       SetColor(COLOR_WHITE);
+       glVertex2i(0, 0);
+       for (i = 1; i < 8; i++) {
+           GLint j = i * 2;
+           SetColor(COLOR_BLACK+i);
+           glVertex2i(-j, -j);
+           glVertex2i(-j, 0);
+           glVertex2i(-j, j);
+           glVertex2i(0, j);
+           glVertex2i(j, j);
+           glVertex2i(j, 0);
+           glVertex2i(j, -j);
+           glVertex2i(0, -j);
+       }
+    glEnd();
+}
+
+static void Lines(void)
+{
+    GLint i;
+
+    glPushMatrix();
+
+    glTranslatef(-12, 0, 0);
+    for (i = 1; i < 8; i++) {
+       SetColor(COLOR_BLACK+i);
+       glBegin(GL_LINES);
+           glVertex2i(-boxW/4, -boxH/4);
+           glVertex2i(boxW/4, boxH/4);
+       glEnd();
+       glTranslatef(4, 0, 0);
+    }
+
+    glPopMatrix();
+
+    glBegin(GL_LINES);
+       glVertex2i(0, 0);
+    glEnd();
+}
+
+static void LineStrip(void)
+{
+
+    glBegin(GL_LINE_STRIP);
+       SetColor(COLOR_RED);
+       glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
+       SetColor(COLOR_GREEN);
+       glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
+       SetColor(COLOR_BLUE);
+       glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
+       SetColor(COLOR_WHITE);
+       glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
+    glEnd();
+
+    glBegin(GL_LINE_STRIP);
+       glVertex2i(0, 0);
+    glEnd();
+}
+
+static void LineLoop(void)
+{
+
+    glBegin(GL_LINE_LOOP);
+       SetColor(COLOR_RED);
+       glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
+       SetColor(COLOR_GREEN);
+       glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
+       SetColor(COLOR_BLUE);
+       glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
+       SetColor(COLOR_WHITE);
+       glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
+    glEnd();
+
+    glEnable(GL_LOGIC_OP);
+    glLogicOp(GL_XOR);
+
+    glEnable(GL_BLEND);
+    glBlendFunc(GL_ONE, GL_ONE);
+
+    SetColor(COLOR_MAGENTA);
+    glBegin(GL_LINE_LOOP);
+       glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(-boxH/8));
+       glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8));
+    glEnd();
+    glBegin(GL_LINE_LOOP);
+       glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8+5));
+       glVertex2f(PIXEL_CENTER(boxW/8), PIXEL_CENTER(boxH/8+5));
+    glEnd();
+    glDisable(GL_LOGIC_OP);
+    glDisable(GL_BLEND);
+
+    SetColor(COLOR_GREEN);
+    glBegin(GL_POINTS);
+       glVertex2i(0, 0);
+    glEnd();
+
+    glBegin(GL_LINE_LOOP);
+       glVertex2i(0, 0);
+    glEnd();
+}
+
+static void Bitmap(void)
+{
+
+    glBegin(GL_LINES);
+       SetColor(COLOR_GREEN);
+       glVertex2i(-boxW/2, 0);
+       glVertex2i(boxW/2, 0);
+       glVertex2i(0, -boxH/2);
+       glVertex2i(0, boxH/2);
+       SetColor(COLOR_RED);
+       glVertex2i(0, -3);
+       glVertex2i(0, -3+OPENGL_HEIGHT);
+       SetColor(COLOR_BLUE);
+       glVertex2i(0, -3);
+       glVertex2i(OPENGL_WIDTH, -3);
+    glEnd();
+
+    SetColor(COLOR_GREEN);
+
+    glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);
+    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+    glRasterPos2i(0, 0);
+    glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, 0, 3, 0.0, 0.0, OpenGL_bits);
+}
+
+static void Triangles(void)
+{
+
+    glBegin(GL_TRIANGLES);
+       SetColor(COLOR_GREEN);
+       glVertex2i(-boxW/4, -boxH/4);
+       SetColor(COLOR_RED);
+       glVertex2i(-boxW/8, -boxH/16);
+       SetColor(COLOR_BLUE);
+       glVertex2i(boxW/8, -boxH/16);
+
+       SetColor(COLOR_GREEN);
+       glVertex2i(-boxW/4, boxH/4);
+       SetColor(COLOR_RED);
+       glVertex2i(-boxW/8, boxH/16);
+       SetColor(COLOR_BLUE);
+       glVertex2i(boxW/8, boxH/16);
+    glEnd();
+
+    glBegin(GL_TRIANGLES);
+       glVertex2i(0, 0);
+       glVertex2i(-100, 100);
+    glEnd();
+}
+
+static void TriangleStrip(void)
+{
+
+    glBegin(GL_TRIANGLE_STRIP);
+       SetColor(COLOR_GREEN);
+       glVertex2i(-boxW/4, -boxH/4);
+       SetColor(COLOR_RED);
+       glVertex2i(-boxW/4, boxH/4);
+       SetColor(COLOR_BLUE);
+       glVertex2i(0, -boxH/4);
+       SetColor(COLOR_WHITE);
+       glVertex2i(0, boxH/4);
+       SetColor(COLOR_CYAN);
+       glVertex2i(boxW/4, -boxH/4);
+       SetColor(COLOR_YELLOW);
+       glVertex2i(boxW/4, boxH/4);
+    glEnd();
+
+    glBegin(GL_TRIANGLE_STRIP);
+       glVertex2i(0, 0);
+       glVertex2i(-100, 100);
+    glEnd();
+}
+
+static void TriangleFan(void)
+{
+    GLint vx[8][2];
+    GLint x0, y0, x1, y1, x2, y2, x3, y3;
+    GLint i;
+
+    y0 = -boxH/4;
+    y1 = y0 + boxH/2/3;
+    y2 = y1 + boxH/2/3;
+    y3 = boxH/4;
+    x0 = -boxW/4;
+    x1 = x0 + boxW/2/3;
+    x2 = x1 + boxW/2/3;
+    x3 = boxW/4;
+
+    vx[0][0] = x0; vx[0][1] = y1;
+    vx[1][0] = x0; vx[1][1] = y2;
+    vx[2][0] = x1; vx[2][1] = y3;
+    vx[3][0] = x2; vx[3][1] = y3;
+    vx[4][0] = x3; vx[4][1] = y2;
+    vx[5][0] = x3; vx[5][1] = y1;
+    vx[6][0] = x2; vx[6][1] = y0;
+    vx[7][0] = x1; vx[7][1] = y0;
+
+    glBegin(GL_TRIANGLE_FAN);
+       SetColor(COLOR_WHITE);
+       glVertex2i(0, 0);
+       for (i = 0; i < 8; i++) {
+           SetColor(COLOR_WHITE-i);
+           glVertex2iv(vx[i]);
+       }
+    glEnd();
+
+    glBegin(GL_TRIANGLE_FAN);
+       glVertex2i(0, 0);
+       glVertex2i(-100, 100);
+    glEnd();
+}
+
+static void Rect(void)
+{
+
+    SetColor(COLOR_GREEN);
+    glRecti(-boxW/4, -boxH/4, boxW/4, boxH/4);
+}
+
+static void PolygonFunc(void)
+{
+    GLint vx[8][2];
+    GLint x0, y0, x1, y1, x2, y2, x3, y3;
+    GLint i;
+
+    y0 = -boxH/4;
+    y1 = y0 + boxH/2/3;
+    y2 = y1 + boxH/2/3;
+    y3 = boxH/4;
+    x0 = -boxW/4;
+    x1 = x0 + boxW/2/3;
+    x2 = x1 + boxW/2/3;
+    x3 = boxW/4;
+
+    vx[0][0] = x0; vx[0][1] = y1;
+    vx[1][0] = x0; vx[1][1] = y2;
+    vx[2][0] = x1; vx[2][1] = y3;
+    vx[3][0] = x2; vx[3][1] = y3;
+    vx[4][0] = x3; vx[4][1] = y2;
+    vx[5][0] = x3; vx[5][1] = y1;
+    vx[6][0] = x2; vx[6][1] = y0;
+    vx[7][0] = x1; vx[7][1] = y0;
+
+    glBegin(GL_POLYGON);
+       for (i = 0; i < 8; i++) {
+           SetColor(COLOR_WHITE-i);
+           glVertex2iv(vx[i]);
+       }
+    glEnd();
+
+    glBegin(GL_POLYGON);
+       glVertex2i(0, 0);
+       glVertex2i(100, 100);
+    glEnd();
+}
+
+static void Quads(void)
+{
+
+    glBegin(GL_QUADS);
+       SetColor(COLOR_GREEN);
+       glVertex2i(-boxW/4, -boxH/4);
+       SetColor(COLOR_RED);
+       glVertex2i(-boxW/8, -boxH/16);
+       SetColor(COLOR_BLUE);
+       glVertex2i(boxW/8, -boxH/16);
+       SetColor(COLOR_WHITE);
+       glVertex2i(boxW/4, -boxH/4);
+
+       SetColor(COLOR_GREEN);
+       glVertex2i(-boxW/4, boxH/4);
+       SetColor(COLOR_RED);
+       glVertex2i(-boxW/8, boxH/16);
+       SetColor(COLOR_BLUE);
+       glVertex2i(boxW/8, boxH/16);
+       SetColor(COLOR_WHITE);
+       glVertex2i(boxW/4, boxH/4);
+    glEnd();
+
+    glBegin(GL_QUADS);
+       glVertex2i(0, 0);
+       glVertex2i(100, 100);
+       glVertex2i(-100, 100);
+    glEnd();
+}
+
+static void QuadStrip(void)
+{
+
+    glBegin(GL_QUAD_STRIP);
+       SetColor(COLOR_GREEN);
+       glVertex2i(-boxW/4, -boxH/4);
+       SetColor(COLOR_RED);
+       glVertex2i(-boxW/4, boxH/4);
+       SetColor(COLOR_BLUE);
+       glVertex2i(0, -boxH/4);
+       SetColor(COLOR_WHITE);
+       glVertex2i(0, boxH/4);
+       SetColor(COLOR_CYAN);
+       glVertex2i(boxW/4, -boxH/4);
+       SetColor(COLOR_YELLOW);
+       glVertex2i(boxW/4, boxH/4);
+    glEnd();
+
+    glBegin(GL_QUAD_STRIP);
+       glVertex2i(0, 0);
+       glVertex2i(100, 100);
+       glVertex2i(-100, 100);
+    glEnd();
+}
+
+static void Draw(EGLDisplay dpy, EGLSurface surf)
+{
+
+    glViewport(0, 0, windW, windH);
+    glDisable(GL_SCISSOR_TEST);
+
+    glPushAttrib(GL_COLOR_BUFFER_BIT);
+
+    glColorMask(1, 1, 1, 1);
+    glIndexMask(~0);
+
+    glClearColor(0.0, 0.0, 0.0, 0.0);
+    glClear(GL_COLOR_BUFFER_BIT);
+
+    glPopAttrib();
+
+    if (mode1) {
+       glShadeModel(GL_SMOOTH);
+    } else {
+       glShadeModel(GL_FLAT);
+    }
+
+    if (mode2) {
+       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+    } else {
+       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+    }
+
+    Viewport(0, 0); Point();
+    Viewport(0, 1); Lines();
+    Viewport(0, 2); LineStrip();
+    Viewport(0, 3); LineLoop();
+
+    Viewport(1, 0); Bitmap();
+
+    Viewport(1, 1); TriangleFan();
+    Viewport(1, 2); Triangles();
+    Viewport(1, 3); TriangleStrip();
+
+    Viewport(2, 0); Rect();
+    Viewport(2, 1); PolygonFunc();
+    Viewport(2, 2); Quads();
+    Viewport(2, 3); QuadStrip();
+
+    glFlush();
+
+    if (doubleBuffer) {
+       eglSwapBuffers(dpy, surf);
+    }
+}
+
+static void
+write_ppm(const char *filename, const GLubyte *buffer, int width, int height)
+{
+   const int binary = 0;
+   FILE *f = fopen( filename, "w" );
+   if (f) {
+      int i, x, y;
+      const GLubyte *ptr = buffer;
+      if (binary) {
+         fprintf(f,"P6\n");
+         fprintf(f,"# ppm-file created by osdemo.c\n");
+         fprintf(f,"%i %i\n", width,height);
+         fprintf(f,"255\n");
+         fclose(f);
+         f = fopen( filename, "ab" );  /* reopen in binary append mode */
+         for (y=height-1; y>=0; y--) {
+            for (x=0; x<width; x++) {
+               i = (y*width + x) * 4;
+               fputc(ptr[i], f);   /* write red */
+               fputc(ptr[i+1], f); /* write green */
+               fputc(ptr[i+2], f); /* write blue */
+            }
+         }
+      }
+      else {
+         /*ASCII*/
+         int counter = 0;
+         fprintf(f,"P3\n");
+         fprintf(f,"# ascii ppm file created by osdemo.c\n");
+         fprintf(f,"%i %i\n", width, height);
+         fprintf(f,"255\n");
+         for (y=height-1; y>=0; y--) {
+            for (x=0; x<width; x++) {
+               i = (y*width + x) * 4;
+               fprintf(f, " %3d %3d %3d", ptr[i], ptr[i+1], ptr[i+2]);
+               counter++;
+               if (counter % 5 == 0)
+                  fprintf(f, "\n");
+            }
+         }
+      }
+      fclose(f);
+   }
+}
+
+int
+main(int argc, char *argv[])
+{
+   int maj, min;
+   EGLContext ctx;
+   EGLSurface screen_surf;
+   EGLConfig configs[10];
+   EGLScreenMESA screen;
+   EGLModeMESA mode;
+   EGLint numConfigs, count;
+   EGLBoolean b;
+   const GLubyte *bitmap;
+   EGLint screenAttribs[32];
+   EGLint i;
+
+   EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+   assert(d);
+
+   if (!eglInitialize(d, &maj, &min)) {
+      printf("demo: eglInitialize failed\n");
+      exit(1);
+   }
+
+   printf("EGL version = %d.%d\n", maj, min);
+   printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
+   if (!strstr(eglQueryString(d, EGL_EXTENSIONS),
+               "EGL_MESA_screen_surface")) {
+      printf("EGL_MESA_screen_surface is not supported\n");
+      exit(1);
+   }
+
+   eglGetConfigs(d, configs, 10, &numConfigs);
+   eglGetScreensMESA(d, &screen, 1, &count);
+   eglGetModesMESA(d, screen, &mode, 1, &count);
+
+   eglBindAPI(EGL_OPENGL_API);
+   ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
+   if (ctx == EGL_NO_CONTEXT) {
+      printf("failed to create context\n");
+      return 0;
+   }
+
+   i = 0;
+   screenAttribs[i++] = EGL_WIDTH;
+   eglGetModeAttribMESA(d, mode, EGL_WIDTH, &screenAttribs[i++]);
+   screenAttribs[i++] = EGL_HEIGHT;
+   eglGetModeAttribMESA(d, mode, EGL_HEIGHT, &screenAttribs[i++]);
+   screenAttribs[i] = EGL_NONE;
+
+   screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
+   if (screen_surf == EGL_NO_SURFACE) {
+      printf("failed to create screen surface\n");
+      return 0;
+   }
+
+   eglShowScreenSurfaceMESA(d, screen, screen_surf, mode);
+
+   b = eglMakeCurrent(d, screen_surf, screen_surf, ctx);
+   if (!b) {
+      printf("make current failed\n");
+      return 0;
+   }
+   glViewport(0, 0, 1024, 768);
+
+
+   Init();
+   Reshape(1024, 768);
+
+   /* some drivers crash when rendering to front buffer */
+#if 0
+   glDrawBuffer( GL_FRONT );
+   glClearColor( 0, 1.0, 0, 1);
+
+   glClear( GL_COLOR_BUFFER_BIT );
+#endif
+
+   doubleBuffer = 1;
+   glDrawBuffer( GL_BACK );
+
+   Draw(d, screen_surf);
+   sleep(2);
+
+   /* TODO EGL_KHR_lock_surface */
+   bitmap = NULL;
+   if (bitmap)
+      write_ppm("dump.ppm", bitmap, 1024, 768);
+
+   eglDestroySurface(d, screen_surf);
+   eglDestroyContext(d, ctx);
+   eglTerminate(d);
+
+   return 0;
+}
diff --git a/progs/egl/opengl/eglgears.c b/progs/egl/opengl/eglgears.c
new file mode 100644 (file)
index 0000000..6349095
--- /dev/null
@@ -0,0 +1,482 @@
+/*
+ * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This is a port of the infamous "glxgears" demo to straight EGL
+ * Port by Dane Rushton 10 July 2005
+ * 
+ * No command line options.
+ * Program runs for 5 seconds then exits, outputing framerate to console
+ */
+
+#define EGL_EGLEXT_PROTOTYPES
+
+#include <assert.h>
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <GL/gl.h>
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#define MAX_CONFIGS 10
+#define MAX_MODES 100
+
+#define BENCHMARK
+
+#ifdef BENCHMARK
+
+/* XXX this probably isn't very portable */
+
+#include <sys/time.h>
+#include <unistd.h>
+
+/* return current time (in seconds) */
+static double
+current_time(void)
+{
+   struct timeval tv;
+#ifdef __VMS
+   (void) gettimeofday(&tv, NULL );
+#else
+   struct timezone tz;
+   (void) gettimeofday(&tv, &tz);
+#endif
+   return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
+}
+
+#else /*BENCHMARK*/
+
+/* dummy */
+static double
+current_time(void)
+{
+   /* update this function for other platforms! */
+   static double t = 0.0;
+   static int warn = 1;
+   if (warn) {
+      fprintf(stderr, "Warning: current_time() not implemented!!\n");
+      warn = 0;
+   }
+   return t += 1.0;
+}
+
+#endif /*BENCHMARK*/
+
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+
+static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
+static GLint gear1, gear2, gear3;
+static GLfloat angle = 0.0;
+
+#if 0
+static GLfloat eyesep = 5.0;           /* Eye separation. */
+static GLfloat fix_point = 40.0;       /* Fixation point distance.  */
+static GLfloat left, right, asp;       /* Stereo frustum params.  */
+#endif
+
+
+/*
+ *
+ *  Draw a gear wheel.  You'll probably want to call this function when
+ *  building a display list since we do a lot of trig here.
+ * 
+ *  Input:  inner_radius - radius of hole at center
+ *          outer_radius - radius at center of teeth
+ *          width - width of gear
+ *          teeth - number of teeth
+ *          tooth_depth - depth of tooth
+ */
+static void
+gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
+     GLint teeth, GLfloat tooth_depth)
+{
+   GLint i;
+   GLfloat r0, r1, r2;
+   GLfloat angle, da;
+   GLfloat u, v, len;
+
+   r0 = inner_radius;
+   r1 = outer_radius - tooth_depth / 2.0;
+   r2 = outer_radius + tooth_depth / 2.0;
+
+   da = 2.0 * M_PI / teeth / 4.0;
+
+   glShadeModel(GL_FLAT);
+
+   glNormal3f(0.0, 0.0, 1.0);
+
+   /* draw front face */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      if (i < teeth) {
+        glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                   width * 0.5);
+      }
+   }
+   glEnd();
+
+   /* draw front sides of teeth */
+   glBegin(GL_QUADS);
+   da = 2.0 * M_PI / teeth / 4.0;
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                width * 0.5);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                width * 0.5);
+   }
+   glEnd();
+
+   glNormal3f(0.0, 0.0, -1.0);
+
+   /* draw back face */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      if (i < teeth) {
+        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                   -width * 0.5);
+        glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      }
+   }
+   glEnd();
+
+   /* draw back sides of teeth */
+   glBegin(GL_QUADS);
+   da = 2.0 * M_PI / teeth / 4.0;
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                -width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                -width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+   }
+   glEnd();
+
+   /* draw outward faces of teeth */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+      u = r2 * cos(angle + da) - r1 * cos(angle);
+      v = r2 * sin(angle + da) - r1 * sin(angle);
+      len = sqrt(u * u + v * v);
+      u /= len;
+      v /= len;
+      glNormal3f(v, -u, 0.0);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+      glNormal3f(cos(angle), sin(angle), 0.0);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                -width * 0.5);
+      u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
+      v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
+      glNormal3f(v, -u, 0.0);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                width * 0.5);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                -width * 0.5);
+      glNormal3f(cos(angle), sin(angle), 0.0);
+   }
+
+   glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
+   glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
+
+   glEnd();
+
+   glShadeModel(GL_SMOOTH);
+
+   /* draw inside radius cylinder */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glNormal3f(-cos(angle), -sin(angle), 0.0);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+   }
+   glEnd();
+}
+
+
+static void
+draw(void)
+{
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+   glPushMatrix();
+   glRotatef(view_rotx, 1.0, 0.0, 0.0);
+   glRotatef(view_roty, 0.0, 1.0, 0.0);
+   glRotatef(view_rotz, 0.0, 0.0, 1.0);
+
+   glPushMatrix();
+   glTranslatef(-3.0, -2.0, 0.0);
+   glRotatef(angle, 0.0, 0.0, 1.0);
+   glCallList(gear1);
+   glPopMatrix();
+
+   glPushMatrix();
+   glTranslatef(3.1, -2.0, 0.0);
+   glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
+   glCallList(gear2);
+   glPopMatrix();
+
+   glPushMatrix();
+   glTranslatef(-3.1, 4.2, 0.0);
+   glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
+   glCallList(gear3);
+   glPopMatrix();
+
+   glPopMatrix();
+}
+
+
+/* new window size or exposure */
+static void
+reshape(int width, int height)
+{
+   GLfloat h = (GLfloat) height / (GLfloat) width;
+
+   glViewport(0, 0, (GLint) width, (GLint) height);
+
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();
+   glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
+   
+   glMatrixMode(GL_MODELVIEW);
+   glLoadIdentity();
+   glTranslatef(0.0, 0.0, -40.0);
+}
+   
+
+
+static void
+init(void)
+{
+   static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 };
+   static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 };
+   static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 };
+   static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };
+
+   glLightfv(GL_LIGHT0, GL_POSITION, pos);
+   glEnable(GL_CULL_FACE);
+   glEnable(GL_LIGHTING);
+   glEnable(GL_LIGHT0);
+   glEnable(GL_DEPTH_TEST);
+
+   /* make the gears */
+   gear1 = glGenLists(1);
+   glNewList(gear1, GL_COMPILE);
+   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+   gear(1.0, 4.0, 1.0, 20, 0.7);
+   glEndList();
+
+   gear2 = glGenLists(1);
+   glNewList(gear2, GL_COMPILE);
+   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+   gear(0.5, 2.0, 2.0, 10, 0.7);
+   glEndList();
+
+   gear3 = glGenLists(1);
+   glNewList(gear3, GL_COMPILE);
+   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+   gear(1.3, 2.0, 0.5, 10, 0.7);
+   glEndList();
+
+   glEnable(GL_NORMALIZE);
+}
+
+
+
+
+static void run_gears(EGLDisplay dpy, EGLSurface surf, int ttr)
+{
+       double st = current_time();
+       double ct = st;
+       int frames = 0;
+       GLfloat seconds, fps;
+
+       while (ct - st < ttr)
+       {
+               double tt = current_time();
+               double dt = tt - ct;
+               ct = tt;
+               
+               /* advance rotation for next frame */
+               angle += 70.0 * dt;  /* 70 degrees per second */
+               if (angle > 3600.0)
+                       angle -= 3600.0;
+               
+               draw();
+               
+               eglSwapBuffers(dpy, surf);
+       
+               
+               frames++;
+       }
+       
+       seconds = ct - st;
+       fps = frames / seconds;
+       printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, fps);
+       
+}
+
+
+int
+main(int argc, char *argv[])
+{
+       int maj, min;
+       EGLContext ctx;
+       EGLSurface screen_surf;
+       EGLConfig configs[MAX_CONFIGS];
+       EGLint numConfigs, i;
+       EGLBoolean b;
+       EGLDisplay d;
+       EGLint screenAttribs[10];
+       EGLModeMESA mode[MAX_MODES];
+       EGLScreenMESA screen;
+       EGLint count;
+       EGLint chosenMode = 0;
+       GLboolean printInfo = GL_FALSE;
+       EGLint width = 0, height = 0;
+       
+        /* parse cmd line args */
+       for (i = 1; i < argc; i++)
+       {
+               if (strcmp(argv[i], "-info") == 0)
+               {
+                       printInfo = GL_TRUE;
+               }
+               else
+                       printf("Warning: unknown parameter: %s\n", argv[i]);
+       }
+       
+       /* DBR : Create EGL context/surface etc */
+       d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+       assert(d);
+
+       if (!eglInitialize(d, &maj, &min)) {
+               printf("eglgears: eglInitialize failed\n");
+               exit(1);
+       }
+       
+       printf("eglgears: EGL version = %d.%d\n", maj, min);
+       printf("eglgears: EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
+       
+        /* XXX use ChooseConfig */
+       eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);
+       eglGetScreensMESA(d, &screen, 1, &count);
+
+       if (!eglGetModesMESA(d, screen, mode, MAX_MODES, &count) || count == 0) {
+               printf("eglgears: eglGetModesMESA failed!\n");
+               return 0;
+       }
+
+        /* Print list of modes, and find the one to use */
+       printf("eglgears: Found %d modes:\n", count);
+       for (i = 0; i < count; i++) {
+               EGLint w, h;
+               eglGetModeAttribMESA(d, mode[i], EGL_WIDTH, &w);
+               eglGetModeAttribMESA(d, mode[i], EGL_HEIGHT, &h);
+               printf("%3d: %d x %d\n", i, w, h);
+               if (w > width && h > height) {
+                       width = w;
+                       height = h;
+                        chosenMode = i;
+               }
+       }
+       printf("eglgears: Using screen mode/size %d: %d x %d\n", chosenMode, width, height);
+
+       eglBindAPI(EGL_OPENGL_API);
+       ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
+       if (ctx == EGL_NO_CONTEXT) {
+               printf("eglgears: failed to create context\n");
+               return 0;
+       }
+       
+       /* build up screenAttribs array */
+       i = 0;
+       screenAttribs[i++] = EGL_WIDTH;
+       screenAttribs[i++] = width;
+       screenAttribs[i++] = EGL_HEIGHT;
+       screenAttribs[i++] = height;
+       screenAttribs[i++] = EGL_NONE;
+
+       screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
+       if (screen_surf == EGL_NO_SURFACE) {
+               printf("eglgears: failed to create screen surface\n");
+               return 0;
+       }
+       
+       b = eglShowScreenSurfaceMESA(d, screen, screen_surf, mode[chosenMode]);
+       if (!b) {
+               printf("eglgears: show surface failed\n");
+               return 0;
+       }
+
+       b = eglMakeCurrent(d, screen_surf, screen_surf, ctx);
+       if (!b) {
+               printf("eglgears: make current failed\n");
+               return 0;
+       }
+       
+       if (printInfo)
+       {
+               printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
+               printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
+               printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
+               printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
+       }
+       
+       init();
+       reshape(width, height);
+
+        glDrawBuffer( GL_BACK );
+
+       run_gears(d, screen_surf, 5.0);
+       
+       eglDestroySurface(d, screen_surf);
+       eglDestroyContext(d, ctx);
+       eglTerminate(d);
+       
+       return 0;
+}
diff --git a/progs/egl/opengl/eglinfo.c b/progs/egl/opengl/eglinfo.c
new file mode 100644 (file)
index 0000000..961fd9c
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ * eglinfo - like glxinfo but for EGL
+ *
+ * Brian Paul
+ * 11 March 2005
+ *
+ * Copyright (C) 2005  Brian Paul   All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define EGL_EGLEXT_PROTOTYPES
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define MAX_CONFIGS 1000
+#define MAX_MODES 1000
+#define MAX_SCREENS 10
+
+/* These are X visual types, so if you're running eglinfo under
+ * something not X, they probably don't make sense. */
+static const char *vnames[] = { "SG", "GS", "SC", "PC", "TC", "DC" };
+
+/**
+ * Print table of all available configurations.
+ */
+static void
+PrintConfigs(EGLDisplay d)
+{
+   EGLConfig configs[MAX_CONFIGS];
+   EGLint numConfigs, i;
+
+   eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);
+
+   printf("Configurations:\n");
+   printf("     bf lv colorbuffer dp st  ms    vis   cav bi  renderable  supported\n");
+   printf("  id sz  l  r  g  b  a th cl ns b    id   eat nd gl es es2 vg surfaces \n");
+   printf("---------------------------------------------------------------------\n");
+   for (i = 0; i < numConfigs; i++) {
+      EGLint id, size, level;
+      EGLint red, green, blue, alpha;
+      EGLint depth, stencil;
+      EGLint renderable, surfaces;
+      EGLint vid, vtype, caveat, bindRgb, bindRgba;
+      EGLint samples, sampleBuffers;
+      char surfString[100] = "";
+
+      eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id);
+      eglGetConfigAttrib(d, configs[i], EGL_BUFFER_SIZE, &size);
+      eglGetConfigAttrib(d, configs[i], EGL_LEVEL, &level);
+
+      eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red);
+      eglGetConfigAttrib(d, configs[i], EGL_GREEN_SIZE, &green);
+      eglGetConfigAttrib(d, configs[i], EGL_BLUE_SIZE, &blue);
+      eglGetConfigAttrib(d, configs[i], EGL_ALPHA_SIZE, &alpha);
+      eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth);
+      eglGetConfigAttrib(d, configs[i], EGL_STENCIL_SIZE, &stencil);
+      eglGetConfigAttrib(d, configs[i], EGL_NATIVE_VISUAL_ID, &vid);
+      eglGetConfigAttrib(d, configs[i], EGL_NATIVE_VISUAL_TYPE, &vtype);
+
+      eglGetConfigAttrib(d, configs[i], EGL_CONFIG_CAVEAT, &caveat);
+      eglGetConfigAttrib(d, configs[i], EGL_BIND_TO_TEXTURE_RGB, &bindRgb);
+      eglGetConfigAttrib(d, configs[i], EGL_BIND_TO_TEXTURE_RGBA, &bindRgba);
+      eglGetConfigAttrib(d, configs[i], EGL_RENDERABLE_TYPE, &renderable);
+      eglGetConfigAttrib(d, configs[i], EGL_SURFACE_TYPE, &surfaces);
+
+      eglGetConfigAttrib(d, configs[i], EGL_SAMPLES, &samples);
+      eglGetConfigAttrib(d, configs[i], EGL_SAMPLE_BUFFERS, &sampleBuffers);
+
+      if (surfaces & EGL_WINDOW_BIT)
+         strcat(surfString, "win,");
+      if (surfaces & EGL_PBUFFER_BIT)
+         strcat(surfString, "pb,");
+      if (surfaces & EGL_PIXMAP_BIT)
+         strcat(surfString, "pix,");
+#ifdef EGL_MESA_screen_surface
+      if (surfaces & EGL_SCREEN_BIT_MESA)
+         strcat(surfString, "scrn,");
+#endif
+      if (strlen(surfString) > 0)
+         surfString[strlen(surfString) - 1] = 0;
+
+      printf("0x%02x %2d %2d %2d %2d %2d %2d %2d %2d %2d%2d 0x%02x%s ",
+             id, size, level,
+             red, green, blue, alpha,
+             depth, stencil,
+             samples, sampleBuffers, vid, vtype < 6 ? vnames[vtype] : "--");
+      printf("  %c  %c  %c  %c  %c   %c %s\n",
+             (caveat != EGL_NONE) ? 'y' : ' ',
+             (bindRgba) ? 'a' : (bindRgb) ? 'y' : ' ',
+             (renderable & EGL_OPENGL_BIT) ? 'y' : ' ',
+             (renderable & EGL_OPENGL_ES_BIT) ? 'y' : ' ',
+             (renderable & EGL_OPENGL_ES2_BIT) ? 'y' : ' ',
+             (renderable & EGL_OPENVG_BIT) ? 'y' : ' ',
+             surfString);
+   }
+}
+
+
+/**
+ * Print table of all available configurations.
+ */
+static void
+PrintModes(EGLDisplay d)
+{
+#ifdef EGL_MESA_screen_surface
+   const char *extensions = eglQueryString(d, EGL_EXTENSIONS);
+   if (strstr(extensions, "EGL_MESA_screen_surface")) {
+      EGLScreenMESA screens[MAX_SCREENS];
+      EGLint numScreens = 1, scrn;
+      EGLModeMESA modes[MAX_MODES];
+
+      eglGetScreensMESA(d, screens, MAX_SCREENS, &numScreens);
+      printf("Number of Screens: %d\n\n", numScreens);
+
+      for (scrn = 0; scrn < numScreens; scrn++) {
+         EGLint numModes, i;
+
+         eglGetModesMESA(d, screens[scrn], modes, MAX_MODES, &numModes);
+
+         printf("Screen %d Modes:\n", scrn);
+         printf("  id  width height refresh  name\n");
+         printf("-----------------------------------------\n");
+         for (i = 0; i < numModes; i++) {
+            EGLint id, w, h, r;
+            const char *str;
+            eglGetModeAttribMESA(d, modes[i], EGL_MODE_ID_MESA, &id);
+            eglGetModeAttribMESA(d, modes[i], EGL_WIDTH, &w);
+            eglGetModeAttribMESA(d, modes[i], EGL_HEIGHT, &h);
+            eglGetModeAttribMESA(d, modes[i], EGL_REFRESH_RATE_MESA, &r);
+            str = eglQueryModeStringMESA(d, modes[i]);
+            printf("0x%02x %5d  %5d   %.3f  %s\n", id, w, h, r / 1000.0, str);
+         }
+      }
+   }
+#endif
+}
+
+static void
+PrintExtensions(EGLDisplay d)
+{
+   const char *extensions, *p, *end, *next;
+   int column;
+
+   printf("EGL extensions string:\n");
+
+   extensions = eglQueryString(d, EGL_EXTENSIONS);
+
+   column = 0;
+   end = extensions + strlen(extensions);
+
+   for (p = extensions; p < end; p = next + 1) {
+      next = strchr(p, ' ');
+      if (next == NULL)
+         next = end;
+
+      if (column > 0 && column + next - p + 1 > 70) {
+        printf("\n");
+        column = 0;
+      }
+      if (column == 0)
+        printf("    ");
+      else
+        printf(" ");
+      column += next - p + 1;
+
+      printf("%.*s", (int) (next - p), p);
+
+      p = next + 1;
+   }
+
+   if (column > 0)
+      printf("\n");
+}
+
+int
+main(int argc, char *argv[])
+{
+   int maj, min;
+   EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+
+   if (!eglInitialize(d, &maj, &min)) {
+      printf("eglinfo: eglInitialize failed\n");
+      exit(1);
+   }
+
+   printf("EGL API version: %d.%d\n", maj, min);
+   printf("EGL vendor string: %s\n", eglQueryString(d, EGL_VENDOR));
+   printf("EGL version string: %s\n", eglQueryString(d, EGL_VERSION));
+#ifdef EGL_VERSION_1_2
+   printf("EGL client APIs: %s\n", eglQueryString(d, EGL_CLIENT_APIS));
+#endif
+
+   PrintExtensions(d);
+
+   PrintConfigs(d);
+
+   PrintModes(d);
+
+   eglTerminate(d);
+
+   return 0;
+}
diff --git a/progs/egl/opengl/eglscreen.c b/progs/egl/opengl/eglscreen.c
new file mode 100644 (file)
index 0000000..520f76e
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Stolen from eglgears
+ *
+ * Creates a surface and show that on the first screen
+ */
+
+#define EGL_EGLEXT_PROTOTYPES
+
+#include <assert.h>
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <GL/gl.h>
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#define MAX_CONFIGS 10
+#define MAX_MODES 100
+
+int
+main(int argc, char *argv[])
+{
+       int maj, min;
+       EGLSurface screen_surf;
+       EGLConfig configs[MAX_CONFIGS];
+       EGLint numConfigs, i;
+       EGLBoolean b;
+       EGLDisplay d;
+       EGLint screenAttribs[10];
+       EGLModeMESA mode[MAX_MODES];
+       EGLScreenMESA screen;
+       EGLint count;
+       EGLint chosenMode = 0;
+       EGLint width = 0, height = 0;
+
+       d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+       assert(d);
+
+       if (!eglInitialize(d, &maj, &min)) {
+               printf("eglscreen: eglInitialize failed\n");
+               exit(1);
+       }
+
+       printf("eglscreen: EGL version = %d.%d\n", maj, min);
+       printf("eglscreen: EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
+
+       /* XXX use ChooseConfig */
+       eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);
+       eglGetScreensMESA(d, &screen, 1, &count);
+
+       if (!eglGetModesMESA(d, screen, mode, MAX_MODES, &count) || count == 0) {
+               printf("eglscreen: eglGetModesMESA failed!\n");
+               return 0;
+       }
+
+       /* Print list of modes, and find the one to use */
+       printf("eglscreen: Found %d modes:\n", count);
+       for (i = 0; i < count; i++) {
+               EGLint w, h;
+               eglGetModeAttribMESA(d, mode[i], EGL_WIDTH, &w);
+               eglGetModeAttribMESA(d, mode[i], EGL_HEIGHT, &h);
+               printf("%3d: %d x %d\n", i, w, h);
+               if (w > width && h > height) {
+                       width = w;
+                       height = h;
+                       chosenMode = i;
+               }
+       }
+       printf("eglscreen: Using screen mode/size %d: %d x %d\n", chosenMode, width, height);
+
+       /* build up screenAttribs array */
+       i = 0;
+       screenAttribs[i++] = EGL_WIDTH;
+       screenAttribs[i++] = width;
+       screenAttribs[i++] = EGL_HEIGHT;
+       screenAttribs[i++] = height;
+       screenAttribs[i++] = EGL_NONE;
+
+       screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
+       if (screen_surf == EGL_NO_SURFACE) {
+               printf("eglscreen: Failed to create screen surface\n");
+               return 0;
+       }
+
+       b = eglShowScreenSurfaceMESA(d, screen, screen_surf, mode[chosenMode]);
+       if (!b) {
+               printf("eglscreen: Show surface failed\n");
+               return 0;
+       }
+
+       usleep(5000000);
+
+       eglDestroySurface(d, screen_surf);
+       eglTerminate(d);
+
+       return 0;
+}
diff --git a/progs/egl/opengl/egltri.c b/progs/egl/opengl/egltri.c
new file mode 100644 (file)
index 0000000..006e06e
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2008  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2008  Jakob Bornecrantz   All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This program is based on eglgears and xegl_tri.
+ * Remixed by Jakob Bornecrantz
+ *
+ * No command line options.
+ * Program runs for 5 seconds then exits, outputing framerate to console
+ */
+
+#define EGL_EGLEXT_PROTOTYPES
+
+#include <assert.h>
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <GL/gl.h>
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#define MAX_CONFIGS 10
+#define MAX_MODES 100
+
+
+/* XXX this probably isn't very portable */
+
+#include <sys/time.h>
+#include <unistd.h>
+
+/* return current time (in seconds) */
+static double
+current_time(void)
+{
+   struct timeval tv;
+#ifdef __VMS
+   (void) gettimeofday(&tv, NULL );
+#else
+   struct timezone tz;
+   (void) gettimeofday(&tv, &tz);
+#endif
+   return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
+}
+
+
+static GLfloat view_rotx = 0.0, view_roty = 0.0, view_rotz = 0.0;
+
+static void draw()
+{
+       static const GLfloat verts[3][2] = {
+               { -1, -1 },
+               {  1, -1 },
+               {  0,  1 }
+       };
+       static const GLfloat colors[3][3] = {
+               { 1, 0, 0 },
+               { 0, 1, 0 },
+               { 0, 0, 1 }
+       };
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glPushMatrix();
+       glRotatef(view_rotx, 1, 0, 0);
+       glRotatef(view_roty, 0, 1, 0);
+       glRotatef(view_rotz, 0, 0, 1);
+
+       {
+               glVertexPointer(2, GL_FLOAT, 0, verts);
+               glColorPointer(3, GL_FLOAT, 0, colors);
+               glEnableClientState(GL_VERTEX_ARRAY);
+               glEnableClientState(GL_COLOR_ARRAY);
+
+               glDrawArrays(GL_TRIANGLES, 0, 3);
+
+               glDisableClientState(GL_VERTEX_ARRAY);
+               glDisableClientState(GL_COLOR_ARRAY);
+       }
+
+       glPopMatrix();
+}
+
+static void init()
+{
+       glClearColor(0.4, 0.4, 0.4, 0.0);
+}
+
+/* new window size or exposure */
+static void reshape(int width, int height)
+{
+       GLfloat ar = (GLfloat) width / (GLfloat) height;
+
+       glViewport(0, 0, (GLint) width, (GLint) height);
+
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       glFrustum(-ar, ar, -1, 1, 5.0, 60.0);
+
+       glMatrixMode(GL_MODELVIEW);
+       glLoadIdentity();
+       glTranslatef(0.0, 0.0, -10.0);
+}
+
+static void run(EGLDisplay dpy, EGLSurface surf, int ttr)
+{
+       double st = current_time();
+       double ct = st;
+       int frames = 0;
+       GLfloat seconds, fps;
+
+       while (ct - st < ttr)
+       {
+               ct = current_time();
+
+               draw();
+
+               eglSwapBuffers(dpy, surf);
+
+               frames++;
+       }
+
+       seconds = ct - st;
+       fps = frames / seconds;
+       printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, fps);
+}
+
+int main(int argc, char *argv[])
+{
+       int maj, min;
+       EGLContext ctx;
+       EGLSurface screen_surf;
+       EGLConfig configs[MAX_CONFIGS];
+       EGLint numConfigs, i;
+       EGLBoolean b;
+       EGLDisplay d;
+       EGLint screenAttribs[10];
+       EGLModeMESA mode[MAX_MODES];
+       EGLScreenMESA screen;
+       EGLint count, chosenMode = 0;
+       GLboolean printInfo = GL_FALSE;
+       EGLint width = 0, height = 0;
+
+       /* parse cmd line args */
+       for (i = 1; i < argc; i++)
+       {
+               if (strcmp(argv[i], "-info") == 0)
+               {
+                       printInfo = GL_TRUE;
+               }
+               else
+                       printf("Warning: unknown parameter: %s\n", argv[i]);
+       }
+
+       /* DBR : Create EGL context/surface etc */
+       d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+       assert(d);
+
+       if (!eglInitialize(d, &maj, &min)) {
+               printf("egltri: eglInitialize failed\n");
+               exit(1);
+       }
+
+       printf("egltri: EGL version = %d.%d\n", maj, min);
+       printf("egltri: EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
+
+       /* XXX use ChooseConfig */
+       eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);
+       eglGetScreensMESA(d, &screen, 1, &count);
+
+       if (!eglGetModesMESA(d, screen, mode, MAX_MODES, &count) || count == 0) {
+               printf("egltri: eglGetModesMESA failed!\n");
+               return 0;
+       }
+
+       /* Print list of modes, and find the one to use */
+       printf("egltri: Found %d modes:\n", count);
+       for (i = 0; i < count; i++) {
+               EGLint w, h;
+               eglGetModeAttribMESA(d, mode[i], EGL_WIDTH, &w);
+               eglGetModeAttribMESA(d, mode[i], EGL_HEIGHT, &h);
+               printf("%3d: %d x %d\n", i, w, h);
+               if (w > width && h > height) {
+                       width = w;
+                       height = h;
+                       chosenMode = i;
+               }
+       }
+       printf("egltri: Using screen mode/size %d: %d x %d\n", chosenMode, width, height);
+
+       eglBindAPI(EGL_OPENGL_API);
+       ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
+       if (ctx == EGL_NO_CONTEXT) {
+               printf("egltri: failed to create context\n");
+               return 0;
+       }
+
+       /* build up screenAttribs array */
+       i = 0;
+       screenAttribs[i++] = EGL_WIDTH;
+       screenAttribs[i++] = width;
+       screenAttribs[i++] = EGL_HEIGHT;
+       screenAttribs[i++] = height;
+       screenAttribs[i++] = EGL_NONE;
+
+       screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
+       if (screen_surf == EGL_NO_SURFACE) {
+               printf("egltri: failed to create screen surface\n");
+               return 0;
+       }
+
+       b = eglShowScreenSurfaceMESA(d, screen, screen_surf, mode[chosenMode]);
+       if (!b) {
+               printf("egltri: show surface failed\n");
+               return 0;
+       }
+
+       b = eglMakeCurrent(d, screen_surf, screen_surf, ctx);
+       if (!b) {
+               printf("egltri: make current failed\n");
+               return 0;
+       }
+
+       if (printInfo)
+       {
+               printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
+               printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
+               printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
+               printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
+       }
+
+       init();
+       reshape(width, height);
+
+       glDrawBuffer( GL_BACK );
+
+       run(d, screen_surf, 5.0);
+
+       eglDestroySurface(d, screen_surf);
+       eglDestroyContext(d, ctx);
+       eglTerminate(d);
+
+       return 0;
+}
diff --git a/progs/egl/opengl/peglgears.c b/progs/egl/opengl/peglgears.c
new file mode 100644 (file)
index 0000000..212d1ac
--- /dev/null
@@ -0,0 +1,451 @@
+/*
+ * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This is a port of the infamous "glxgears" demo to straight EGL
+ * Port by Dane Rushton 10 July 2005
+ * 
+ * No command line options.
+ * Program runs for 5 seconds then exits, outputing framerate to console
+ */
+
+#define EGL_EGLEXT_PROTOTYPES
+
+#include <assert.h>
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <GL/gl.h>
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#define MAX_CONFIGS 10
+#define MAX_MODES 100
+
+#define BENCHMARK
+
+#ifdef BENCHMARK
+
+/* XXX this probably isn't very portable */
+
+#include <sys/time.h>
+#include <unistd.h>
+
+/* return current time (in seconds) */
+static double
+current_time(void)
+{
+   struct timeval tv;
+#ifdef __VMS
+   (void) gettimeofday(&tv, NULL );
+#else
+   struct timezone tz;
+   (void) gettimeofday(&tv, &tz);
+#endif
+   return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
+}
+
+#else /*BENCHMARK*/
+
+/* dummy */
+static double
+current_time(void)
+{
+   /* update this function for other platforms! */
+   static double t = 0.0;
+   static int warn = 1;
+   if (warn) {
+      fprintf(stderr, "Warning: current_time() not implemented!!\n");
+      warn = 0;
+   }
+   return t += 1.0;
+}
+
+#endif /*BENCHMARK*/
+
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+
+static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
+static GLint gear1, gear2, gear3;
+static GLfloat angle = 0.0;
+
+#if 0
+static GLfloat eyesep = 5.0;           /* Eye separation. */
+static GLfloat fix_point = 40.0;       /* Fixation point distance.  */
+static GLfloat left, right, asp;       /* Stereo frustum params.  */
+#endif
+
+
+/*
+ *
+ *  Draw a gear wheel.  You'll probably want to call this function when
+ *  building a display list since we do a lot of trig here.
+ * 
+ *  Input:  inner_radius - radius of hole at center
+ *          outer_radius - radius at center of teeth
+ *          width - width of gear
+ *          teeth - number of teeth
+ *          tooth_depth - depth of tooth
+ */
+static void
+gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
+     GLint teeth, GLfloat tooth_depth)
+{
+   GLint i;
+   GLfloat r0, r1, r2;
+   GLfloat angle, da;
+   GLfloat u, v, len;
+
+   r0 = inner_radius;
+   r1 = outer_radius - tooth_depth / 2.0;
+   r2 = outer_radius + tooth_depth / 2.0;
+
+   da = 2.0 * M_PI / teeth / 4.0;
+
+   glShadeModel(GL_FLAT);
+
+   glNormal3f(0.0, 0.0, 1.0);
+
+   /* draw front face */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      if (i < teeth) {
+        glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                   width * 0.5);
+      }
+   }
+   glEnd();
+
+   /* draw front sides of teeth */
+   glBegin(GL_QUADS);
+   da = 2.0 * M_PI / teeth / 4.0;
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                width * 0.5);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                width * 0.5);
+   }
+   glEnd();
+
+   glNormal3f(0.0, 0.0, -1.0);
+
+   /* draw back face */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      if (i < teeth) {
+        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                   -width * 0.5);
+        glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      }
+   }
+   glEnd();
+
+   /* draw back sides of teeth */
+   glBegin(GL_QUADS);
+   da = 2.0 * M_PI / teeth / 4.0;
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                -width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                -width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+   }
+   glEnd();
+
+   /* draw outward faces of teeth */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+      u = r2 * cos(angle + da) - r1 * cos(angle);
+      v = r2 * sin(angle + da) - r1 * sin(angle);
+      len = sqrt(u * u + v * v);
+      u /= len;
+      v /= len;
+      glNormal3f(v, -u, 0.0);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+      glNormal3f(cos(angle), sin(angle), 0.0);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                -width * 0.5);
+      u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
+      v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
+      glNormal3f(v, -u, 0.0);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                width * 0.5);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                -width * 0.5);
+      glNormal3f(cos(angle), sin(angle), 0.0);
+   }
+
+   glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
+   glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
+
+   glEnd();
+
+   glShadeModel(GL_SMOOTH);
+
+   /* draw inside radius cylinder */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glNormal3f(-cos(angle), -sin(angle), 0.0);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+   }
+   glEnd();
+}
+
+
+static void
+draw(void)
+{
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+   glPushMatrix();
+   glRotatef(view_rotx, 1.0, 0.0, 0.0);
+   glRotatef(view_roty, 0.0, 1.0, 0.0);
+   glRotatef(view_rotz, 0.0, 0.0, 1.0);
+
+   glPushMatrix();
+   glTranslatef(-3.0, -2.0, 0.0);
+   glRotatef(angle, 0.0, 0.0, 1.0);
+   glCallList(gear1);
+   glPopMatrix();
+
+   glPushMatrix();
+   glTranslatef(3.1, -2.0, 0.0);
+   glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
+   glCallList(gear2);
+   glPopMatrix();
+
+   glPushMatrix();
+   glTranslatef(-3.1, 4.2, 0.0);
+   glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
+   glCallList(gear3);
+   glPopMatrix();
+
+   glPopMatrix();
+}
+
+
+/* new window size or exposure */
+static void
+reshape(int width, int height)
+{
+   GLfloat h = (GLfloat) height / (GLfloat) width;
+
+   glViewport(0, 0, (GLint) width, (GLint) height);
+
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();
+   glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
+   
+   glMatrixMode(GL_MODELVIEW);
+   glLoadIdentity();
+   glTranslatef(0.0, 0.0, -40.0);
+}
+   
+
+
+static void
+init(void)
+{
+   static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 };
+   static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 };
+   static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 };
+   static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };
+
+   glLightfv(GL_LIGHT0, GL_POSITION, pos);
+   glEnable(GL_CULL_FACE);
+   glEnable(GL_LIGHTING);
+   glEnable(GL_LIGHT0);
+   glEnable(GL_DEPTH_TEST);
+
+   /* make the gears */
+   gear1 = glGenLists(1);
+   glNewList(gear1, GL_COMPILE);
+   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+   gear(1.0, 4.0, 1.0, 20, 0.7);
+   glEndList();
+
+   gear2 = glGenLists(1);
+   glNewList(gear2, GL_COMPILE);
+   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+   gear(0.5, 2.0, 2.0, 10, 0.7);
+   glEndList();
+
+   gear3 = glGenLists(1);
+   glNewList(gear3, GL_COMPILE);
+   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+   gear(1.3, 2.0, 0.5, 10, 0.7);
+   glEndList();
+
+   glEnable(GL_NORMALIZE);
+}
+
+
+
+
+static void run_gears(EGLDisplay dpy, EGLSurface surf, int ttr)
+{
+       double st = current_time();
+       double ct = st;
+       int frames = 0;
+       GLfloat seconds, fps;
+
+       while (ct - st < ttr)
+       {
+               double tt = current_time();
+               double dt = tt - ct;
+               ct = tt;
+               
+               /* advance rotation for next frame */
+               angle += 70.0 * dt;  /* 70 degrees per second */
+               if (angle > 3600.0)
+                       angle -= 3600.0;
+               
+               draw();
+               
+               eglSwapBuffers(dpy, surf);
+       
+               
+               frames++;
+       }
+       
+       seconds = ct - st;
+       fps = frames / seconds;
+       printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, fps);
+       
+}
+
+
+int
+main(int argc, char *argv[])
+{
+       int major, minor;
+       EGLContext ctx;
+       EGLSurface surface;
+       EGLConfig configs[MAX_CONFIGS];
+       EGLint numConfigs, i;
+       EGLBoolean b;
+       EGLDisplay d;
+       EGLint screenAttribs[10];
+       GLboolean printInfo = GL_FALSE;
+       EGLint width = 300, height = 300;
+       
+        /* parse cmd line args */
+       for (i = 1; i < argc; i++)
+       {
+               if (strcmp(argv[i], "-info") == 0)
+               {
+                       printInfo = GL_TRUE;
+               }
+               else
+                       printf("Warning: unknown parameter: %s\n", argv[i]);
+       }
+       
+       /* DBR : Create EGL context/surface etc */
+       d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+       assert(d);
+
+       if (!eglInitialize(d, &major, &minor)) {
+               printf("peglgears: eglInitialize failed\n");
+               return 0;
+       }
+
+       printf("peglgears: EGL version = %d.%d\n", major, minor);
+       printf("peglgears: EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
+
+       eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);
+
+       eglBindAPI(EGL_OPENGL_API);
+
+       ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
+       if (ctx == EGL_NO_CONTEXT) {
+               printf("peglgears: failed to create context\n");
+               return 0;
+       }
+       
+       /* build up screenAttribs array */
+       i = 0;
+       screenAttribs[i++] = EGL_WIDTH;
+       screenAttribs[i++] = width;
+       screenAttribs[i++] = EGL_HEIGHT;
+       screenAttribs[i++] = height;
+       screenAttribs[i++] = EGL_NONE;
+
+       surface = eglCreatePbufferSurface(d, configs[0], screenAttribs);
+       if (surface == EGL_NO_SURFACE) {
+               printf("peglgears: failed to create pbuffer surface\n");
+               return 0;
+       }
+       
+       b = eglMakeCurrent(d, surface, surface, ctx);
+       if (!b) {
+               printf("peglgears: make current failed\n");
+               return 0;
+       }
+       
+       if (printInfo)
+       {
+               printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
+               printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
+               printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
+               printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
+       }
+       
+       init();
+       reshape(width, height);
+
+       glDrawBuffer( GL_BACK );
+
+       run_gears(d, surface, 5.0);
+       
+       eglDestroySurface(d, surface);
+       eglDestroyContext(d, ctx);
+       eglTerminate(d);
+       
+       return 0;
+}
diff --git a/progs/egl/opengl/xegl_tri.c b/progs/egl/opengl/xegl_tri.c
new file mode 100644 (file)
index 0000000..1f1a005
--- /dev/null
@@ -0,0 +1,361 @@
+/*
+ * Copyright (C) 2008  Brian Paul   All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Draw a triangle with X/EGL.
+ * Brian Paul
+ * 3 June 2008
+ */
+
+
+#include <assert.h>
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/keysym.h>
+#include <GL/gl.h>  /* using full OpenGL for now */
+#include <GLES/egl.h>
+
+
+static GLfloat view_rotx = 0.0, view_roty = 0.0, view_rotz = 0.0;
+
+
+static void
+draw(void)
+{
+   static const GLfloat verts[3][2] = {
+      { -1, -1 },
+      {  1, -1 },
+      {  0,  1 }
+   };
+   static const GLfloat colors[3][3] = {
+      { 1, 0, 0 },
+      { 0, 1, 0 },
+      { 0, 0, 1 }
+   };
+
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+   glPushMatrix();
+   glRotatef(view_rotx, 1, 0, 0);
+   glRotatef(view_roty, 0, 1, 0);
+   glRotatef(view_rotz, 0, 0, 1);
+
+   {
+      glVertexPointer(2, GL_FLOAT, 0, verts);
+      glColorPointer(3, GL_FLOAT, 0, colors);
+      glEnableClientState(GL_VERTEX_ARRAY);
+      glEnableClientState(GL_COLOR_ARRAY);
+
+      glDrawArrays(GL_TRIANGLES, 0, 3);
+
+      glDisableClientState(GL_VERTEX_ARRAY);
+      glDisableClientState(GL_COLOR_ARRAY);
+   }
+
+   glPopMatrix();
+}
+
+
+/* new window size or exposure */
+static void
+reshape(int width, int height)
+{
+   GLfloat ar = (GLfloat) width / (GLfloat) height;
+
+   glViewport(0, 0, (GLint) width, (GLint) height);
+
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();
+   glFrustum(-ar, ar, -1, 1, 5.0, 60.0);
+   
+   glMatrixMode(GL_MODELVIEW);
+   glLoadIdentity();
+   glTranslatef(0.0, 0.0, -10.0);
+}
+
+
+static void
+init(void)
+{
+   glClearColor(0.4, 0.4, 0.4, 0.0);
+}
+
+
+/*
+ * Create an RGB, double-buffered X window.
+ * Return the window and context handles.
+ */
+static void
+make_x_window(Display *x_dpy, EGLDisplay egl_dpy,
+              const char *name,
+              int x, int y, int width, int height,
+              Window *winRet,
+              EGLContext *ctxRet,
+              EGLSurface *surfRet)
+{
+   static const EGLint attribs[] = {
+      EGL_RED_SIZE, 1,
+      EGL_GREEN_SIZE, 1,
+      EGL_BLUE_SIZE, 1,
+      EGL_DEPTH_SIZE, 1,
+      EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
+      EGL_NONE
+   };
+
+   int scrnum;
+   XSetWindowAttributes attr;
+   unsigned long mask;
+   Window root;
+   Window win;
+   XVisualInfo *visInfo, visTemplate;
+   int num_visuals;
+   EGLContext ctx;
+   EGLConfig config;
+   EGLint num_configs;
+   EGLint vid;
+
+   scrnum = DefaultScreen( x_dpy );
+   root = RootWindow( x_dpy, scrnum );
+
+   if (!eglChooseConfig( egl_dpy, attribs, &config, 1, &num_configs) ||
+       !num_configs) {
+      printf("Error: couldn't get an EGL visual config\n");
+      exit(1);
+   }
+
+   assert(config);
+   assert(num_configs > 0);
+
+   if (!eglGetConfigAttrib(egl_dpy, config, EGL_NATIVE_VISUAL_ID, &vid)) {
+      printf("Error: eglGetConfigAttrib() failed\n");
+      exit(1);
+   }
+
+   /* The X window visual must match the EGL config */
+   visTemplate.visualid = vid;
+   visInfo = XGetVisualInfo(x_dpy, VisualIDMask, &visTemplate, &num_visuals);
+   if (!visInfo) {
+      printf("Error: couldn't get X visual\n");
+      exit(1);
+   }
+
+   /* window attributes */
+   attr.background_pixel = 0;
+   attr.border_pixel = 0;
+   attr.colormap = XCreateColormap( x_dpy, root, visInfo->visual, AllocNone);
+   attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
+   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
+
+   win = XCreateWindow( x_dpy, root, 0, 0, width, height,
+                       0, visInfo->depth, InputOutput,
+                       visInfo->visual, mask, &attr );
+
+   /* set hints and properties */
+   {
+      XSizeHints sizehints;
+      sizehints.x = x;
+      sizehints.y = y;
+      sizehints.width  = width;
+      sizehints.height = height;
+      sizehints.flags = USSize | USPosition;
+      XSetNormalHints(x_dpy, win, &sizehints);
+      XSetStandardProperties(x_dpy, win, name, name,
+                              None, (char **)NULL, 0, &sizehints);
+   }
+
+   eglBindAPI(EGL_OPENGL_API);
+
+   ctx = eglCreateContext(egl_dpy, config, EGL_NO_CONTEXT, NULL );
+   if (!ctx) {
+      printf("Error: glXCreateContext failed\n");
+      exit(1);
+   }
+
+   *surfRet = eglCreateWindowSurface(egl_dpy, config, win, NULL);
+
+   if (!*surfRet) {
+      printf("Error: eglCreateWindowSurface failed\n");
+      exit(1);
+   }
+
+   XFree(visInfo);
+
+   *winRet = win;
+   *ctxRet = ctx;
+}
+
+
+static void
+event_loop(Display *dpy, Window win,
+           EGLDisplay egl_dpy, EGLSurface egl_surf)
+{
+   while (1) {
+      int redraw = 0;
+      XEvent event;
+
+      XNextEvent(dpy, &event);
+
+      switch (event.type) {
+      case Expose:
+         redraw = 1;
+         break;
+      case ConfigureNotify:
+         reshape(event.xconfigure.width, event.xconfigure.height);
+         break;
+      case KeyPress:
+         {
+            char buffer[10];
+            int r, code;
+            code = XLookupKeysym(&event.xkey, 0);
+            if (code == XK_Left) {
+               view_roty += 5.0;
+            }
+            else if (code == XK_Right) {
+               view_roty -= 5.0;
+            }
+            else if (code == XK_Up) {
+               view_rotx += 5.0;
+            }
+            else if (code == XK_Down) {
+               view_rotx -= 5.0;
+            }
+            else {
+               r = XLookupString(&event.xkey, buffer, sizeof(buffer),
+                                 NULL, NULL);
+               if (buffer[0] == 27) {
+                  /* escape */
+                  return;
+               }
+            }
+         }
+         redraw = 1;
+         break;
+      default:
+         ; /*no-op*/
+      }
+
+      if (redraw) {
+         draw();
+         eglSwapBuffers(egl_dpy, egl_surf);
+      }
+   }
+}
+
+
+static void
+usage(void)
+{
+   printf("Usage:\n");
+   printf("  -display <displayname>  set the display to run on\n");
+   printf("  -info                   display OpenGL renderer info\n");
+}
+
+int
+main(int argc, char *argv[])
+{
+   const int winWidth = 300, winHeight = 300;
+   Display *x_dpy;
+   Window win;
+   EGLSurface egl_surf;
+   EGLContext egl_ctx;
+   EGLDisplay egl_dpy;
+   char *dpyName = NULL;
+   GLboolean printInfo = GL_FALSE;
+   EGLint egl_major, egl_minor;
+   int i;
+   const char *s;
+
+   for (i = 1; i < argc; i++) {
+      if (strcmp(argv[i], "-display") == 0) {
+         dpyName = argv[i+1];
+         i++;
+      }
+      else if (strcmp(argv[i], "-info") == 0) {
+         printInfo = GL_TRUE;
+      }
+      else {
+         usage();
+         return -1;
+      }
+   }
+
+   x_dpy = XOpenDisplay(dpyName);
+   if (!x_dpy) {
+      printf("Error: couldn't open display %s\n",
+            dpyName ? dpyName : getenv("DISPLAY"));
+      return -1;
+   }
+
+   egl_dpy = eglGetDisplay(x_dpy);
+   if (!egl_dpy) {
+      printf("Error: eglGetDisplay() failed\n");
+      return -1;
+   }
+
+   if (!eglInitialize(egl_dpy, &egl_major, &egl_minor)) {
+      printf("Error: eglInitialize() failed\n");
+      return -1;
+   }
+
+   s = eglQueryString(egl_dpy, EGL_VERSION);
+   printf("EGL_VERSION = %s\n", s);
+
+   make_x_window(x_dpy, egl_dpy,
+                 "xegl_tri", 0, 0, winWidth, winHeight,
+                 &win, &egl_ctx, &egl_surf);
+
+   XMapWindow(x_dpy, win);
+   if (!eglMakeCurrent(egl_dpy, egl_surf, egl_surf, egl_ctx)) {
+      printf("Error: eglMakeCurrent() failed\n");
+      return -1;
+   }
+
+   if (printInfo) {
+      printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
+      printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
+      printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
+   }
+
+   init();
+
+   /* Set initial projection/viewing transformation.
+    * We can't be sure we'll get a ConfigureNotify event when the window
+    * first appears.
+    */
+   reshape(winWidth, winHeight);
+
+   event_loop(x_dpy, win, egl_dpy, egl_surf);
+
+   eglDestroyContext(egl_dpy, egl_ctx);
+   eglDestroySurface(egl_dpy, egl_surf);
+   eglTerminate(egl_dpy);
+
+
+   XDestroyWindow(x_dpy, win);
+   XCloseDisplay(x_dpy);
+
+   return 0;
+}
diff --git a/progs/egl/opengl/xeglgears.c b/progs/egl/opengl/xeglgears.c
new file mode 100644 (file)
index 0000000..a6a977d
--- /dev/null
@@ -0,0 +1,954 @@
+/*
+ * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Ported to X/EGL/GLES.   XXX Actually, uses full OpenGL ATM.
+ * Brian Paul
+ * 30 May 2008
+ */
+
+/*
+ * Command line options:
+ *    -info      print GL implementation information
+ *
+ */
+
+
+#define GL_GLEXT_PROTOTYPES
+#define EGL_EGLEXT_PROTOTYPES
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/keysym.h>
+#include <GL/gl.h>
+#include <EGL/egl.h>
+
+#include <EGL/eglext.h>
+
+
+#define BENCHMARK
+
+#ifdef BENCHMARK
+
+/* XXX this probably isn't very portable */
+
+#include <sys/time.h>
+#include <unistd.h>
+
+/* return current time (in seconds) */
+static double
+current_time(void)
+{
+   struct timeval tv;
+#ifdef __VMS
+   (void) gettimeofday(&tv, NULL );
+#else
+   struct timezone tz;
+   (void) gettimeofday(&tv, &tz);
+#endif
+   return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
+}
+
+#else /*BENCHMARK*/
+
+/* dummy */
+static double
+current_time(void)
+{
+   /* update this function for other platforms! */
+   static double t = 0.0;
+   static int warn = 1;
+   if (warn) {
+      fprintf(stderr, "Warning: current_time() not implemented!!\n");
+      warn = 0;
+   }
+   return t += 1.0;
+}
+
+#endif /*BENCHMARK*/
+
+
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+
+static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
+static GLint gear1, gear2, gear3;
+static GLfloat angle = 0.0;
+
+/*
+ *
+ *  Draw a gear wheel.  You'll probably want to call this function when
+ *  building a display list since we do a lot of trig here.
+ * 
+ *  Input:  inner_radius - radius of hole at center
+ *          outer_radius - radius at center of teeth
+ *          width - width of gear
+ *          teeth - number of teeth
+ *          tooth_depth - depth of tooth
+ */
+static void
+gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
+     GLint teeth, GLfloat tooth_depth)
+{
+   GLint i;
+   GLfloat r0, r1, r2;
+   GLfloat angle, da;
+   GLfloat u, v, len;
+
+   r0 = inner_radius;
+   r1 = outer_radius - tooth_depth / 2.0;
+   r2 = outer_radius + tooth_depth / 2.0;
+
+   da = 2.0 * M_PI / teeth / 4.0;
+
+   glShadeModel(GL_FLAT);
+
+   glNormal3f(0.0, 0.0, 1.0);
+
+   /* draw front face */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      if (i < teeth) {
+        glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                   width * 0.5);
+      }
+   }
+   glEnd();
+
+   /* draw front sides of teeth */
+   glBegin(GL_QUADS);
+   da = 2.0 * M_PI / teeth / 4.0;
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                width * 0.5);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                width * 0.5);
+   }
+   glEnd();
+
+   glNormal3f(0.0, 0.0, -1.0);
+
+   /* draw back face */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      if (i < teeth) {
+        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                   -width * 0.5);
+        glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      }
+   }
+   glEnd();
+
+   /* draw back sides of teeth */
+   glBegin(GL_QUADS);
+   da = 2.0 * M_PI / teeth / 4.0;
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                -width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                -width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+   }
+   glEnd();
+
+   /* draw outward faces of teeth */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+      u = r2 * cos(angle + da) - r1 * cos(angle);
+      v = r2 * sin(angle + da) - r1 * sin(angle);
+      len = sqrt(u * u + v * v);
+      u /= len;
+      v /= len;
+      glNormal3f(v, -u, 0.0);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+      glNormal3f(cos(angle), sin(angle), 0.0);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                -width * 0.5);
+      u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
+      v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
+      glNormal3f(v, -u, 0.0);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                width * 0.5);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                -width * 0.5);
+      glNormal3f(cos(angle), sin(angle), 0.0);
+   }
+
+   glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
+   glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
+
+   glEnd();
+
+   glShadeModel(GL_SMOOTH);
+
+   /* draw inside radius cylinder */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glNormal3f(-cos(angle), -sin(angle), 0.0);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+   }
+   glEnd();
+}
+
+
+static void
+draw(void)
+{
+   glClearColor(0.2, 0.2, 0.2, 0.2);
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+   glPushMatrix();
+   glRotatef(view_rotx, 1.0, 0.0, 0.0);
+   glRotatef(view_roty, 0.0, 1.0, 0.0);
+   glRotatef(view_rotz, 0.0, 0.0, 1.0);
+
+   glPushMatrix();
+   glTranslatef(-3.0, -2.0, 0.0);
+   glRotatef(angle, 0.0, 0.0, 1.0);
+   glCallList(gear1);
+   glPopMatrix();
+
+   glPushMatrix();
+   glTranslatef(3.1, -2.0, 0.0);
+   glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
+   glCallList(gear2);
+   glPopMatrix();
+
+   glPushMatrix();
+   glTranslatef(-3.1, 4.2, 0.0);
+   glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
+   glCallList(gear3);
+   glPopMatrix();
+
+   glPopMatrix();
+}
+
+
+/* new window size or exposure */
+static void
+reshape(int width, int height)
+{
+   GLfloat ar = (GLfloat) width / (GLfloat) height;
+
+   glViewport(0, 0, (GLint) width, (GLint) height);
+
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();
+   glFrustum(-ar, ar, -1, 1, 5.0, 60.0);
+   
+   glMatrixMode(GL_MODELVIEW);
+   glLoadIdentity();
+   glTranslatef(0.0, 0.0, -40.0);
+}
+   
+
+
+static void
+init(void)
+{
+   static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 };
+   static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 };
+   static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 };
+   static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };
+
+   glLightfv(GL_LIGHT0, GL_POSITION, pos);
+   glEnable(GL_CULL_FACE);
+   glEnable(GL_LIGHTING);
+   glEnable(GL_LIGHT0);
+   glEnable(GL_DEPTH_TEST);
+
+   /* make the gears */
+   gear1 = glGenLists(1);
+   glNewList(gear1, GL_COMPILE);
+   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+   gear(1.0, 4.0, 1.0, 20, 0.7);
+   glEndList();
+
+   gear2 = glGenLists(1);
+   glNewList(gear2, GL_COMPILE);
+   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+   gear(0.5, 2.0, 2.0, 10, 0.7);
+   glEndList();
+
+   gear3 = glGenLists(1);
+   glNewList(gear3, GL_COMPILE);
+   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+   gear(1.3, 2.0, 0.5, 10, 0.7);
+   glEndList();
+
+   glEnable(GL_NORMALIZE);
+}
+
+
+struct egl_manager {
+   EGLNativeDisplayType xdpy;
+   EGLNativeWindowType xwin;
+   EGLNativePixmapType xpix;
+
+   EGLDisplay dpy;
+   EGLConfig conf;
+   EGLContext ctx;
+
+   EGLSurface win;
+   EGLSurface pix;
+   EGLSurface pbuf;
+   EGLImageKHR image;
+
+   EGLBoolean verbose;
+   EGLint major, minor;
+
+   GC gc;
+   GLuint fbo;
+};
+
+static struct egl_manager *
+egl_manager_new(EGLNativeDisplayType xdpy, const EGLint *attrib_list,
+                EGLBoolean verbose)
+{
+   struct egl_manager *eman;
+   const char *ver;
+   EGLint num_conf;
+
+   eman = calloc(1, sizeof(*eman));
+   if (!eman)
+      return NULL;
+
+   eman->verbose = verbose;
+   eman->xdpy = xdpy;
+
+   eman->dpy = eglGetDisplay(eman->xdpy);
+   if (eman->dpy == EGL_NO_DISPLAY) {
+      printf("eglGetDisplay() failed\n");
+      free(eman);
+      return NULL;
+   }
+
+   if (!eglInitialize(eman->dpy, &eman->major, &eman->minor)) {
+      printf("eglInitialize() failed\n");
+      free(eman);
+      return NULL;
+   }
+
+   ver = eglQueryString(eman->dpy, EGL_VERSION);
+   printf("EGL_VERSION = %s\n", ver);
+
+   if (!eglChooseConfig(eman->dpy, attrib_list, &eman->conf, 1, &num_conf) ||
+       !num_conf) {
+      printf("eglChooseConfig() failed\n");
+      eglTerminate(eman->dpy);
+      free(eman);
+      return NULL;
+   }
+
+   eman->ctx = eglCreateContext(eman->dpy, eman->conf, EGL_NO_CONTEXT, NULL);
+   if (eman->ctx == EGL_NO_CONTEXT) {
+      printf("eglCreateContext() failed\n");
+      eglTerminate(eman->dpy);
+      free(eman);
+      return NULL;
+   }
+
+   return eman;
+}
+
+static EGLBoolean
+egl_manager_create_window(struct egl_manager *eman, const char *name,
+                          EGLint w, EGLint h, EGLBoolean need_surface,
+                          EGLBoolean fullscreen, const EGLint *attrib_list)
+{
+   XVisualInfo vinfo_template, *vinfo = NULL;
+   EGLint val, num_vinfo;
+   Window root;
+   XSetWindowAttributes attrs;
+   unsigned long mask;
+   EGLint x = 0, y = 0;
+
+   if (!eglGetConfigAttrib(eman->dpy, eman->conf,
+                           EGL_NATIVE_VISUAL_ID, &val)) {
+      printf("eglGetConfigAttrib() failed\n");
+      return EGL_FALSE;
+   }
+   if (val) {
+      vinfo_template.visualid = (VisualID) val;
+      vinfo = XGetVisualInfo(eman->xdpy, VisualIDMask, &vinfo_template, &num_vinfo);
+   }
+   /* try harder if window surface is not needed */
+   if (!vinfo && !need_surface &&
+       eglGetConfigAttrib(eman->dpy, eman->conf, EGL_BUFFER_SIZE, &val)) {
+      if (val == 32)
+         val = 24;
+      vinfo_template.depth = val;
+      vinfo = XGetVisualInfo(eman->xdpy, VisualDepthMask, &vinfo_template, &num_vinfo);
+   }
+
+   if (!vinfo) {
+      printf("XGetVisualInfo() failed\n");
+      return EGL_FALSE;
+   }
+
+   root = DefaultRootWindow(eman->xdpy);
+   if (fullscreen) {
+      x = y = 0;
+      w = DisplayWidth(eman->xdpy, DefaultScreen(eman->xdpy));
+      h = DisplayHeight(eman->xdpy, DefaultScreen(eman->xdpy));
+   }
+
+   /* window attributes */
+   attrs.background_pixel = 0;
+   attrs.border_pixel = 0;
+   attrs.colormap = XCreateColormap(eman->xdpy, root, vinfo->visual, AllocNone);
+   attrs.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
+   attrs.override_redirect = fullscreen;
+   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect;
+
+   eman->xwin = XCreateWindow(eman->xdpy, root, x, y, w, h,
+                              0, vinfo->depth, InputOutput,
+                              vinfo->visual, mask, &attrs);
+   XFree(vinfo);
+
+   /* set hints and properties */
+   {
+      XSizeHints sizehints;
+      sizehints.x = x;
+      sizehints.y = y;
+      sizehints.width  = w;
+      sizehints.height = h;
+      sizehints.flags = USSize | USPosition;
+      XSetNormalHints(eman->xdpy, eman->xwin, &sizehints);
+      XSetStandardProperties(eman->xdpy, eman->xwin, name, name,
+                             None, (char **)NULL, 0, &sizehints);
+   }
+
+   if (need_surface) {
+      eman->win = eglCreateWindowSurface(eman->dpy, eman->conf,
+                                         eman->xwin, attrib_list);
+      if (eman->win == EGL_NO_SURFACE) {
+         printf("eglCreateWindowSurface() failed\n");
+         XDestroyWindow(eman->xdpy, eman->xwin);
+         eman->xwin = None;
+         return EGL_FALSE;
+      }
+   }
+
+   eman->gc = XCreateGC(eman->xdpy, eman->xwin, 0, NULL);
+
+   XMapWindow(eman->xdpy, eman->xwin);
+
+   return EGL_TRUE;
+}
+
+static EGLBoolean
+egl_manager_create_pixmap(struct egl_manager *eman, EGLNativeWindowType xwin,
+                          EGLBoolean need_surface, const EGLint *attrib_list)
+{
+   XWindowAttributes attrs;
+
+   if (!XGetWindowAttributes(eman->xdpy, xwin, &attrs)) {
+      printf("XGetWindowAttributes() failed\n");
+      return EGL_FALSE;
+   }
+
+   eman->xpix = XCreatePixmap(eman->xdpy, xwin,
+                              attrs.width, attrs.height, attrs.depth);
+
+   if (need_surface) {
+      eman->pix = eglCreatePixmapSurface(eman->dpy, eman->conf,
+                                         eman->xpix, attrib_list);
+      if (eman->pix == EGL_NO_SURFACE) {
+         printf("eglCreatePixmapSurface() failed\n");
+         XFreePixmap(eman->xdpy, eman->xpix);
+         eman->xpix = None;
+         return EGL_FALSE;
+      }
+   }
+
+   return EGL_TRUE;
+}
+
+static EGLBoolean
+egl_manager_create_pbuffer(struct egl_manager *eman, const EGLint *attrib_list)
+{
+   eman->pbuf = eglCreatePbufferSurface(eman->dpy, eman->conf, attrib_list);
+   if (eman->pbuf == EGL_NO_SURFACE) {
+      printf("eglCreatePbufferSurface() failed\n");
+      return EGL_FALSE;
+   }
+
+   return EGL_TRUE;
+}
+
+static void
+egl_manager_destroy(struct egl_manager *eman)
+{
+   eglMakeCurrent(eman->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+   eglTerminate(eman->dpy);
+
+   if (eman->xwin != None)
+      XDestroyWindow(eman->xdpy, eman->xwin);
+   if (eman->xpix != None)
+      XFreePixmap(eman->xdpy, eman->xpix);
+
+   XFreeGC(eman->xdpy, eman->gc);
+
+   free(eman);
+}
+
+enum {
+   GEARS_WINDOW,
+   GEARS_PIXMAP,
+   GEARS_PIXMAP_TEXTURE,
+   GEARS_PBUFFER,
+   GEARS_PBUFFER_TEXTURE,
+   GEARS_RENDERBUFFER
+};
+
+static void
+texture_gears(struct egl_manager *eman, int surface_type)
+{
+   static const GLint verts[12] =
+      { -5, -6, -10,  5, -6, -10,  -5, 4, 10,  5, 4, 10 };
+   static const GLint tex_coords[8] = { 0, 0,  1, 0,  0, 1,  1, 1 };
+
+   eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx);
+
+   glClearColor(0, 0, 0, 0);
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+   glEnable(GL_TEXTURE_2D);
+   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT);
+   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   
+   glEnableClientState(GL_VERTEX_ARRAY);
+   glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+   glVertexPointer(3, GL_INT, 0, verts);
+   glTexCoordPointer(2, GL_INT, 0, tex_coords);
+
+   if (surface_type == GEARS_PBUFFER_TEXTURE)
+      eglBindTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER);
+
+   glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+   glDisableClientState(GL_VERTEX_ARRAY);
+   glDisableClientState(GL_COLOR_ARRAY);
+   glDisable(GL_TEXTURE_2D);
+
+   if (surface_type == GEARS_PBUFFER_TEXTURE)
+      eglReleaseTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER);
+
+   eglSwapBuffers(eman->dpy, eman->win); 
+}
+
+static void
+copy_gears(struct egl_manager *eman,
+          EGLint tile_w, EGLint tile_h, EGLint w, EGLint h)
+{
+   int x, y;
+
+   eglWaitClient();
+
+   for (x = 0; x < w; x += tile_w) {
+      for (y = 0; y < h; y += tile_h) {
+
+        XCopyArea(eman->xdpy, eman->xpix, eman->xwin, eman->gc,
+                  0, 0, tile_w, tile_h, x, y);
+      }
+   }
+}
+
+static void
+event_loop(struct egl_manager *eman, EGLint surface_type, EGLint w, EGLint h)
+{
+   int window_w = w, window_h = h;
+
+   if (surface_type == EGL_PBUFFER_BIT)
+      printf("there will be no screen update if "
+             "eglCopyBuffers() is not implemented\n");
+
+   while (1) {
+      while (XPending(eman->xdpy) > 0) {
+         XEvent event;
+         XNextEvent(eman->xdpy, &event);
+         switch (event.type) {
+         case Expose:
+            /* we'll redraw below */
+            break;
+         case ConfigureNotify:
+            window_w = event.xconfigure.width;
+            window_h = event.xconfigure.height;
+            if (surface_type == EGL_WINDOW_BIT)
+               reshape(window_w, window_h);
+            break;
+         case KeyPress:
+            {
+               char buffer[10];
+               int r, code;
+               code = XLookupKeysym(&event.xkey, 0);
+               if (code == XK_Left) {
+                  view_roty += 5.0;
+               }
+               else if (code == XK_Right) {
+                  view_roty -= 5.0;
+               }
+               else if (code == XK_Up) {
+                  view_rotx += 5.0;
+               }
+               else if (code == XK_Down) {
+                  view_rotx -= 5.0;
+               }
+               else {
+                  r = XLookupString(&event.xkey, buffer, sizeof(buffer),
+                                    NULL, NULL);
+                  if (buffer[0] == 27) {
+                     /* escape */
+                     return;
+                  }
+               }
+            }
+         }
+      }
+
+      {
+         static int frames = 0;
+         static double tRot0 = -1.0, tRate0 = -1.0;
+         double dt, t = current_time();
+         if (tRot0 < 0.0)
+            tRot0 = t;
+         dt = t - tRot0;
+         tRot0 = t;
+
+         /* advance rotation for next frame */
+         angle += 70.0 * dt;  /* 70 degrees per second */
+         if (angle > 3600.0)
+             angle -= 3600.0;
+
+         switch (surface_type) {
+         case GEARS_WINDOW:
+           draw();
+            eglSwapBuffers(eman->dpy, eman->win);
+            break;
+
+        case GEARS_PBUFFER:
+           draw();
+           if (!eglCopyBuffers(eman->dpy, eman->pbuf, eman->xpix))
+              break;
+           copy_gears(eman, w, h, window_w, window_h);
+           break;
+
+        case GEARS_PBUFFER_TEXTURE:
+            eglMakeCurrent(eman->dpy, eman->pbuf, eman->pbuf, eman->ctx);
+           draw();
+           texture_gears(eman, surface_type);
+           break;
+
+        case GEARS_PIXMAP:
+           draw();
+           copy_gears(eman, w, h, window_w, window_h);
+           break;
+
+        case GEARS_PIXMAP_TEXTURE:
+            eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx);
+           draw();
+           texture_gears(eman, surface_type);
+           break;
+
+        case GEARS_RENDERBUFFER:
+           glBindFramebuffer(GL_FRAMEBUFFER_EXT, eman->fbo);
+           draw();
+           glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
+           texture_gears(eman, surface_type);
+           break;
+        }
+
+         frames++;
+
+         if (tRate0 < 0.0)
+            tRate0 = t;
+         if (t - tRate0 >= 5.0) {
+            GLfloat seconds = t - tRate0;
+            GLfloat fps = frames / seconds;
+            printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds,
+                   fps);
+            tRate0 = t;
+            frames = 0;
+         }
+      }
+   }
+}
+
+
+static void
+usage(void)
+{
+   printf("Usage:\n");
+   printf("  -display <displayname>  set the display to run on\n");
+   printf("  -fullscreen             run in fullscreen mode\n");
+   printf("  -info                   display OpenGL renderer info\n");
+   printf("  -pixmap                 use pixmap surface\n");
+   printf("  -pixmap-texture         use pixmap surface and texture using EGLImage\n");
+   printf("  -pbuffer                use pbuffer surface and eglCopyBuffers\n");
+   printf("  -pbuffer-texture        use pbuffer surface and eglBindTexImage\n");
+   printf("  -renderbuffer           renderbuffer as EGLImage and bind as texture from\n");
+}
+static const char *names[] = {
+   "window",
+   "pixmap",
+   "pixmap_texture",
+   "pbuffer",
+   "pbuffer_texture",
+   "renderbuffer"
+};
+
+int
+main(int argc, char *argv[])
+{
+   const int winWidth = 300, winHeight = 300;
+   Display *x_dpy;
+   char *dpyName = NULL;
+   struct egl_manager *eman;
+   EGLint attribs[] = {
+      EGL_SURFACE_TYPE, EGL_WINDOW_BIT, /* may be changed later */
+      EGL_RED_SIZE, 1,
+      EGL_GREEN_SIZE, 1,
+      EGL_BLUE_SIZE, 1,
+      EGL_DEPTH_SIZE, 1,
+      EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
+      EGL_NONE
+   };
+   char win_title[] = "xeglgears (window/pixmap/pbuffer)";
+   EGLint surface_type = GEARS_WINDOW;
+   GLboolean printInfo = GL_FALSE;
+   GLboolean fullscreen = GL_FALSE;
+   EGLBoolean ret;
+   GLuint texture, color_rb, depth_rb;
+   int i;
+
+   for (i = 1; i < argc; i++) {
+      if (strcmp(argv[i], "-display") == 0) {
+         dpyName = argv[i+1];
+         i++;
+      }
+      else if (strcmp(argv[i], "-info") == 0) {
+         printInfo = GL_TRUE;
+      }
+      else if (strcmp(argv[i], "-fullscreen") == 0) {
+         fullscreen = GL_TRUE;
+      }
+      else if (strcmp(argv[i], "-pixmap") == 0) {
+         surface_type = GEARS_PIXMAP;
+        attribs[1] = EGL_PIXMAP_BIT;
+      }
+      else if (strcmp(argv[i], "-pixmap-texture") == 0) {
+         surface_type = GEARS_PIXMAP_TEXTURE;
+        attribs[1] = EGL_PIXMAP_BIT;
+      }
+      else if (strcmp(argv[i], "-pbuffer") == 0) {
+         surface_type = GEARS_PBUFFER;
+        attribs[1] = EGL_PBUFFER_BIT;
+      }
+      else if (strcmp(argv[i], "-pbuffer-texture") == 0) {
+         surface_type = GEARS_PBUFFER_TEXTURE;
+        attribs[1] = EGL_PBUFFER_BIT;
+      }
+      else if (strcmp(argv[i], "-renderbuffer") == 0) {
+         surface_type = GEARS_RENDERBUFFER;
+      }
+      else {
+         usage();
+         return -1;
+      }
+   }
+
+   x_dpy = XOpenDisplay(dpyName);
+   if (!x_dpy) {
+      printf("Error: couldn't open display %s\n",
+            dpyName ? dpyName : getenv("DISPLAY"));
+      return -1;
+   }
+
+   eglBindAPI(EGL_OPENGL_API);
+
+   eman = egl_manager_new(x_dpy, attribs, printInfo);
+   if (!eman) {
+      XCloseDisplay(x_dpy);
+      return -1;
+   }
+
+   snprintf(win_title, sizeof(win_title),
+           "xeglgears (%s)", names[surface_type]);
+
+   ret = egl_manager_create_window(eman, win_title, winWidth, winHeight,
+                                  EGL_TRUE, fullscreen, NULL);
+   if (!ret)
+      return -1;
+
+   /* create surface(s) */
+   switch (surface_type) {
+   case GEARS_WINDOW:
+      if (ret)
+         ret = eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx);
+      break;
+   case GEARS_PIXMAP:
+   case GEARS_PIXMAP_TEXTURE:
+      ret = egl_manager_create_pixmap(eman, eman->xwin, EGL_TRUE, NULL);
+      if (surface_type == GEARS_PIXMAP_TEXTURE)
+        eman->image = eglCreateImageKHR (eman->dpy, eman->ctx,
+                                         EGL_NATIVE_PIXMAP_KHR,
+                                         (EGLClientBuffer) eman->xpix, NULL);
+      if (ret)
+         ret = eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx);
+      break;
+   case GEARS_PBUFFER:
+   case GEARS_PBUFFER_TEXTURE:
+      {
+         EGLint pbuf_attribs[] = {
+            EGL_WIDTH, winWidth,
+            EGL_HEIGHT, winHeight,
+           EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB,
+           EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
+            EGL_NONE
+         };
+         ret = (egl_manager_create_pixmap(eman, eman->xwin,
+                                         EGL_TRUE, NULL) &&
+                egl_manager_create_pbuffer(eman, pbuf_attribs));
+         if (ret)
+            ret = eglMakeCurrent(eman->dpy, eman->pbuf, eman->pbuf, eman->ctx);
+      }
+      break;
+
+
+   case GEARS_RENDERBUFFER:
+      ret = eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx);
+      if (ret == EGL_FALSE)
+        printf("failed to make context current\n");
+
+      glGenFramebuffers(1, &eman->fbo);
+      glBindFramebuffer(GL_FRAMEBUFFER_EXT, eman->fbo);
+      
+      glGenRenderbuffers(1, &color_rb);
+      glBindRenderbuffer(GL_RENDERBUFFER_EXT, color_rb);
+      glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_RGBA, winWidth, winHeight);
+      glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
+                                  GL_COLOR_ATTACHMENT0_EXT,
+                                  GL_RENDERBUFFER_EXT,
+                                  color_rb);
+
+      eman->image = eglCreateImageKHR(eman->dpy, eman->ctx,
+                                     EGL_GL_RENDERBUFFER_KHR,
+                                     (EGLClientBuffer) color_rb, NULL);
+
+      glGenRenderbuffers(1, &depth_rb);
+      glBindRenderbuffer(GL_RENDERBUFFER_EXT, depth_rb);
+      glRenderbufferStorage(GL_RENDERBUFFER_EXT,
+                           GL_DEPTH_COMPONENT, winWidth, winHeight);
+      glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
+                                  GL_DEPTH_ATTACHMENT_EXT,
+                                  GL_RENDERBUFFER_EXT,
+                                  depth_rb);
+
+      if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE) {
+        printf("framebuffer not complete\n");
+        exit(1);
+      }
+
+      break;
+
+   default:
+      ret = EGL_FALSE;
+      break;
+   }
+
+   switch (surface_type) {
+   case GEARS_PIXMAP_TEXTURE:
+   case GEARS_RENDERBUFFER:
+          glGenTextures(1, &texture);
+          glBindTexture(GL_TEXTURE_2D, texture);
+          glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eman->image);
+          break;
+   case GEARS_PBUFFER_TEXTURE:
+          glGenTextures(1, &texture);
+          glBindTexture(GL_TEXTURE_2D, texture);
+          break;
+   }
+
+   if (!ret) {
+      egl_manager_destroy(eman);
+      XCloseDisplay(x_dpy);
+      return -1;
+   }
+
+   if (printInfo) {
+      printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
+      printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
+      printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
+   }
+
+   init();
+
+   /* Set initial projection/viewing transformation.
+    * We can't be sure we'll get a ConfigureNotify event when the window
+    * first appears.
+    */
+   reshape(winWidth, winHeight);
+
+   event_loop(eman, surface_type, winWidth, winHeight);
+
+   glDeleteLists(gear1, 1);
+   glDeleteLists(gear2, 1);
+   glDeleteLists(gear3, 1);
+
+   egl_manager_destroy(eman);
+   XCloseDisplay(x_dpy);
+
+   return 0;
+}
diff --git a/progs/egl/opengl/xeglthreads.c b/progs/egl/opengl/xeglthreads.c
new file mode 100644 (file)
index 0000000..5787fae
--- /dev/null
@@ -0,0 +1,775 @@
+/*
+ * Copyright (C) 2000  Brian Paul   All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Ported to EGL by Chia-I Wu <olvaffe@gmail.com>
+ */
+
+
+/*
+ * This program tests EGL thread safety.
+ * Command line options:
+ *  -p                       Open a display connection for each thread
+ *  -l                       Enable application-side locking
+ *  -n <num threads>         Number of threads to create (default is 2)
+ *  -display <display name>  Specify X display (default is $DISPLAY)
+ *  -t                       Use texture mapping
+ *
+ * Brian Paul  20 July 2000
+ */
+
+
+/*
+ * Notes:
+ * - Each thread gets its own EGL context.
+ *
+ * - The EGL contexts share texture objects.
+ *
+ * - When 't' is pressed to update the texture image, the window/thread which
+ *   has input focus is signalled to change the texture.  The other threads
+ *   should see the updated texture the next time they call glBindTexture.
+ */
+
+
+#if defined(PTHREADS)   /* defined by Mesa on Linux and other platforms */
+
+#include <assert.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <GL/gl.h>
+#include <EGL/egl.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <pthread.h>
+
+
+/*
+ * Each window/thread/context:
+ */
+struct winthread {
+   Display *Dpy;
+   int Index;
+   pthread_t Thread;
+   Window Win;
+   EGLDisplay Display;
+   EGLContext Context;
+   EGLSurface Surface;
+   float Angle;
+   int WinWidth, WinHeight;
+   GLboolean NewSize;
+   GLboolean Initialized;
+   GLboolean MakeNewTexture;
+};
+
+
+#define MAX_WINTHREADS 100
+static struct winthread WinThreads[MAX_WINTHREADS];
+static int NumWinThreads = 0;
+static volatile GLboolean ExitFlag = GL_FALSE;
+
+static GLboolean MultiDisplays = 0;
+static GLboolean Locking = 0;
+static GLboolean Texture = GL_FALSE;
+static GLuint TexObj = 12;
+static GLboolean Animate = GL_TRUE;
+
+static pthread_mutex_t Mutex;
+static pthread_cond_t CondVar;
+static pthread_mutex_t CondMutex;
+
+
+static void
+Error(const char *msg)
+{
+   fprintf(stderr, "Error: %s\n", msg);
+   exit(1);
+}
+
+
+static void
+signal_redraw(void)
+{
+   pthread_mutex_lock(&CondMutex);
+   pthread_cond_broadcast(&CondVar);
+   pthread_mutex_unlock(&CondMutex);
+}
+
+
+static void
+MakeNewTexture(struct winthread *wt)
+{
+#define TEX_SIZE 128
+   static float step = 0.0;
+   GLfloat image[TEX_SIZE][TEX_SIZE][4];
+   GLint width;
+   int i, j;
+
+   for (j = 0; j < TEX_SIZE; j++) {
+      for (i = 0; i < TEX_SIZE; i++) {
+         float dt = 5.0 * (j - 0.5 * TEX_SIZE) / TEX_SIZE;
+         float ds = 5.0 * (i - 0.5 * TEX_SIZE) / TEX_SIZE;
+         float r = dt * dt + ds * ds + step;
+         image[j][i][0] =
+         image[j][i][1] =
+         image[j][i][2] = 0.75 + 0.25 * cos(r);
+         image[j][i][3] = 1.0;
+      }
+   }
+
+   step += 0.5;
+
+   glBindTexture(GL_TEXTURE_2D, TexObj);
+
+   glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
+   if (width) {
+      assert(width == TEX_SIZE);
+      /* sub-tex replace */
+      glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TEX_SIZE, TEX_SIZE,
+                   GL_RGBA, GL_FLOAT, image);
+   }
+   else {
+      /* create new */
+      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0,
+                   GL_RGBA, GL_FLOAT, image);
+   }
+}
+
+
+
+/* draw a colored cube */
+static void
+draw_object(void)
+{
+   glPushMatrix();
+   glScalef(0.75, 0.75, 0.75);
+
+   glColor3f(1, 0, 0);
+
+   if (Texture) {
+      glBindTexture(GL_TEXTURE_2D, TexObj);
+      glEnable(GL_TEXTURE_2D);
+   }
+   else {
+      glDisable(GL_TEXTURE_2D);
+   }
+
+   glBegin(GL_QUADS);
+
+   /* -X */
+   glColor3f(0, 1, 1);
+   glTexCoord2f(0, 0);  glVertex3f(-1, -1, -1);
+   glTexCoord2f(1, 0);  glVertex3f(-1,  1, -1);
+   glTexCoord2f(1, 1);  glVertex3f(-1,  1,  1);
+   glTexCoord2f(0, 1);  glVertex3f(-1, -1,  1);
+
+   /* +X */
+   glColor3f(1, 0, 0);
+   glTexCoord2f(0, 0);  glVertex3f(1, -1, -1);
+   glTexCoord2f(1, 0);  glVertex3f(1,  1, -1);
+   glTexCoord2f(1, 1);  glVertex3f(1,  1,  1);
+   glTexCoord2f(0, 1);  glVertex3f(1, -1,  1);
+
+   /* -Y */
+   glColor3f(1, 0, 1);
+   glTexCoord2f(0, 0);  glVertex3f(-1, -1, -1);
+   glTexCoord2f(1, 0);  glVertex3f( 1, -1, -1);
+   glTexCoord2f(1, 1);  glVertex3f( 1, -1,  1);
+   glTexCoord2f(0, 1);  glVertex3f(-1, -1,  1);
+
+   /* +Y */
+   glColor3f(0, 1, 0);
+   glTexCoord2f(0, 0);  glVertex3f(-1, 1, -1);
+   glTexCoord2f(1, 0);  glVertex3f( 1, 1, -1);
+   glTexCoord2f(1, 1);  glVertex3f( 1, 1,  1);
+   glTexCoord2f(0, 1);  glVertex3f(-1, 1,  1);
+
+   /* -Z */
+   glColor3f(1, 1, 0);
+   glTexCoord2f(0, 0);  glVertex3f(-1, -1, -1);
+   glTexCoord2f(1, 0);  glVertex3f( 1, -1, -1);
+   glTexCoord2f(1, 1);  glVertex3f( 1,  1, -1);
+   glTexCoord2f(0, 1);  glVertex3f(-1,  1, -1);
+
+   /* +Y */
+   glColor3f(0, 0, 1);
+   glTexCoord2f(0, 0);  glVertex3f(-1, -1, 1);
+   glTexCoord2f(1, 0);  glVertex3f( 1, -1, 1);
+   glTexCoord2f(1, 1);  glVertex3f( 1,  1, 1);
+   glTexCoord2f(0, 1);  glVertex3f(-1,  1, 1);
+
+   glEnd();
+
+   glPopMatrix();
+}
+
+
+/* signal resize of given window */
+static void
+resize(struct winthread *wt, int w, int h)
+{
+   wt->NewSize = GL_TRUE;
+   wt->WinWidth = w;
+   wt->WinHeight = h;
+   if (!Animate)
+      signal_redraw();
+}
+
+
+/*
+ * We have an instance of this for each thread.
+ */
+static void
+draw_loop(struct winthread *wt)
+{
+   while (!ExitFlag) {
+
+      if (Locking)
+         pthread_mutex_lock(&Mutex);
+
+      if (!wt->Initialized) {
+         eglMakeCurrent(wt->Display, wt->Surface, wt->Surface, wt->Context);
+         printf("xeglthreads: %d: GL_RENDERER = %s\n", wt->Index,
+                (char *) glGetString(GL_RENDERER));
+         if (Texture /*&& wt->Index == 0*/) {
+            MakeNewTexture(wt);
+         }
+         wt->Initialized = GL_TRUE;
+      }
+
+      if (Locking)
+         pthread_mutex_unlock(&Mutex);
+
+      eglBindAPI(EGL_OPENGL_API);
+      if (eglGetCurrentContext() != wt->Context) {
+         printf("xeglthreads: current context %p != %p\n",
+               eglGetCurrentContext(), wt->Context);
+      }
+
+      glEnable(GL_DEPTH_TEST);
+
+      if (wt->NewSize) {
+         GLfloat w = (float) wt->WinWidth / (float) wt->WinHeight;
+         glViewport(0, 0, wt->WinWidth, wt->WinHeight);
+         glMatrixMode(GL_PROJECTION);
+         glLoadIdentity();
+         glFrustum(-w, w, -1.0, 1.0, 1.5, 10);
+         glMatrixMode(GL_MODELVIEW);
+         glLoadIdentity();
+         glTranslatef(0, 0, -2.5);
+         wt->NewSize = GL_FALSE;
+      }
+
+      if (wt->MakeNewTexture) {
+         MakeNewTexture(wt);
+         wt->MakeNewTexture = GL_FALSE;
+      }
+
+      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+      glPushMatrix();
+         glRotatef(wt->Angle, 0, 1, 0);
+         glRotatef(wt->Angle, 1, 0, 0);
+         glScalef(0.7, 0.7, 0.7);
+         draw_object();
+      glPopMatrix();
+
+      if (Locking)
+         pthread_mutex_lock(&Mutex);
+
+      eglSwapBuffers(wt->Display, wt->Surface);
+
+      if (Locking)
+         pthread_mutex_unlock(&Mutex);
+
+      if (Animate) {
+         usleep(5000);
+      }
+      else {
+         /* wait for signal to draw */
+         pthread_mutex_lock(&CondMutex);
+         pthread_cond_wait(&CondVar, &CondMutex);
+         pthread_mutex_unlock(&CondMutex);
+      }
+      wt->Angle += 1.0;
+   }
+   eglMakeCurrent(wt->Display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+}
+
+
+static void
+keypress(XEvent *event, struct winthread *wt)
+{
+   char buf[100];
+   KeySym keySym;
+   XComposeStatus stat;
+
+   XLookupString(&event->xkey, buf, sizeof(buf), &keySym, &stat);
+
+   switch (keySym) {
+   case XK_Escape:
+      /* tell all threads to exit */
+      if (!Animate) {
+         signal_redraw();
+      }
+      ExitFlag = GL_TRUE;
+      /*printf("exit draw_loop %d\n", wt->Index);*/
+      return;
+   case XK_t:
+   case XK_T:
+      if (Texture) {
+         wt->MakeNewTexture = GL_TRUE;
+         if (!Animate)
+            signal_redraw();
+      }
+      break;
+   case XK_a:
+   case XK_A:
+      Animate = !Animate;
+      if (Animate)  /* yes, prev Animate state! */
+         signal_redraw();
+      break;
+   case XK_s:
+   case XK_S:
+      if (!Animate)
+         signal_redraw();
+      break;
+   default:
+      ; /* nop */
+   }
+}
+
+
+/*
+ * The main process thread runs this loop.
+ * Single display connection for all threads.
+ */
+static void
+event_loop(Display *dpy)
+{
+   XEvent event;
+   int i;
+
+   assert(!MultiDisplays);
+
+   while (!ExitFlag) {
+
+      if (Locking) {
+         while (1) {
+            int k;
+            pthread_mutex_lock(&Mutex);
+            k = XPending(dpy);
+            if (k) {
+               XNextEvent(dpy, &event);
+               pthread_mutex_unlock(&Mutex);
+               break;
+            }
+            pthread_mutex_unlock(&Mutex);
+            usleep(5000);
+         }
+      }
+      else {
+         XNextEvent(dpy, &event);
+      }
+
+      switch (event.type) {
+         case ConfigureNotify:
+            /* Find winthread for this event's window */
+            for (i = 0; i < NumWinThreads; i++) {
+               struct winthread *wt = &WinThreads[i];
+               if (event.xconfigure.window == wt->Win) {
+                  resize(wt, event.xconfigure.width,
+                         event.xconfigure.height);
+                  break;
+               }
+            }
+            break;
+         case KeyPress:
+            for (i = 0; i < NumWinThreads; i++) {
+               struct winthread *wt = &WinThreads[i];
+               if (event.xkey.window == wt->Win) {
+                  keypress(&event, wt);
+                  break;
+               }
+            }
+            break;
+         default:
+            /*no-op*/ ;
+      }
+   }
+}
+
+
+/*
+ * Separate display connection for each thread.
+ */
+static void
+event_loop_multi(void)
+{
+   XEvent event;
+   int w = 0;
+
+   assert(MultiDisplays);
+
+   while (!ExitFlag) {
+      struct winthread *wt = &WinThreads[w];
+      if (XPending(wt->Dpy)) {
+         XNextEvent(wt->Dpy, &event);
+         switch (event.type) {
+         case ConfigureNotify:
+            resize(wt, event.xconfigure.width, event.xconfigure.height);
+            break;
+         case KeyPress:
+            keypress(&event, wt);
+            break;
+         default:
+            ; /* nop */
+         }
+      }
+      w = (w + 1) % NumWinThreads;
+      usleep(5000);
+   }
+}
+
+
+
+/*
+ * we'll call this once for each thread, before the threads are created.
+ */
+static void
+create_window(struct winthread *wt, EGLContext shareCtx)
+{
+   Window win;
+   EGLContext ctx;
+   EGLSurface surf;
+   EGLint attribs[] = { EGL_RED_SIZE, 1,
+                        EGL_GREEN_SIZE, 1,
+                        EGL_BLUE_SIZE, 1,
+                        EGL_DEPTH_SIZE, 1,
+                        EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
+                        EGL_NONE };
+   EGLConfig config;
+   EGLint num_configs;
+   EGLint vid;
+   int scrnum;
+   XSetWindowAttributes attr;
+   unsigned long mask;
+   Window root;
+   XVisualInfo *visinfo, visTemplate;
+   int num_visuals;
+   int width = 160, height = 160;
+   int xpos = (wt->Index % 8) * (width + 10);
+   int ypos = (wt->Index / 8) * (width + 20);
+
+   scrnum = DefaultScreen(wt->Dpy);
+   root = RootWindow(wt->Dpy, scrnum);
+
+   if (!eglChooseConfig(wt->Display, attribs, &config, 1, &num_configs) ||
+       !num_configs) {
+      Error("Unable to choose an EGL config");
+   }
+
+   assert(config);
+   assert(num_configs > 0);
+
+   if (!eglGetConfigAttrib(wt->Display, config, EGL_NATIVE_VISUAL_ID, &vid)) {
+      Error("Unable to get visual id of EGL config\n");
+   }
+
+   visTemplate.visualid = vid;
+   visinfo = XGetVisualInfo(wt->Dpy, VisualIDMask,
+                        &visTemplate, &num_visuals);
+   if (!visinfo) {
+      Error("Unable to find RGB, Z, double-buffered visual");
+   }
+
+   /* window attributes */
+   attr.background_pixel = 0;
+   attr.border_pixel = 0;
+   attr.colormap = XCreateColormap(wt->Dpy, root, visinfo->visual, AllocNone);
+   attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
+   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
+
+   win = XCreateWindow(wt->Dpy, root, xpos, ypos, width, height,
+                        0, visinfo->depth, InputOutput,
+                        visinfo->visual, mask, &attr);
+   if (!win) {
+      Error("Couldn't create window");
+   }
+
+   XFree(visinfo);
+
+   {
+      XSizeHints sizehints;
+      sizehints.x = xpos;
+      sizehints.y = ypos;
+      sizehints.width  = width;
+      sizehints.height = height;
+      sizehints.flags = USSize | USPosition;
+      XSetNormalHints(wt->Dpy, win, &sizehints);
+      XSetStandardProperties(wt->Dpy, win, "xeglthreads", "xeglthreads",
+                              None, (char **)NULL, 0, &sizehints);
+   }
+
+   eglBindAPI(EGL_OPENGL_API);
+
+   ctx = eglCreateContext(wt->Display, config, shareCtx, NULL);
+   if (!ctx) {
+      Error("Couldn't create EGL context");
+   }
+   surf = eglCreateWindowSurface(wt->Display, config, win, NULL);
+   if (!surf) {
+      Error("Couldn't create EGL surface");
+   }
+
+   XMapWindow(wt->Dpy, win);
+   XSync(wt->Dpy, 0);
+
+   /* save the info for this window/context */
+   wt->Win = win;
+   wt->Context = ctx;
+   wt->Surface = surf;
+   wt->Angle = 0.0;
+   wt->WinWidth = width;
+   wt->WinHeight = height;
+   wt->NewSize = GL_TRUE;
+}
+
+
+/*
+ * Called by pthread_create()
+ */
+static void *
+thread_function(void *p)
+{
+   struct winthread *wt = (struct winthread *) p;
+   draw_loop(wt);
+   return NULL;
+}
+
+
+/*
+ * called before exit to wait for all threads to finish
+ */
+static void
+clean_up(void)
+{
+   int i;
+
+   /* wait for threads to finish */
+   for (i = 0; i < NumWinThreads; i++) {
+      pthread_join(WinThreads[i].Thread, NULL);
+   }
+
+   for (i = 0; i < NumWinThreads; i++) {
+      eglDestroyContext(WinThreads[i].Display, WinThreads[i].Context);
+      XDestroyWindow(WinThreads[i].Dpy, WinThreads[i].Win);
+   }
+}
+
+
+static void
+usage(void)
+{
+   printf("xeglthreads: test of EGL/GL thread safety (any key = exit)\n");
+   printf("Usage:\n");
+   printf("  xeglthreads [options]\n");
+   printf("Options:\n");
+   printf("   -display DISPLAYNAME  Specify display string\n");
+   printf("   -n NUMTHREADS  Number of threads to create\n");
+   printf("   -p  Use a separate display connection for each thread\n");
+   printf("   -l  Use application-side locking\n");
+   printf("   -t  Enable texturing\n");
+   printf("Keyboard:\n");
+   printf("   Esc  Exit\n");
+   printf("   t    Change texture image (requires -t option)\n");
+   printf("   a    Toggle animation\n");
+   printf("   s    Step rotation (when not animating)\n");
+}
+
+
+int
+main(int argc, char *argv[])
+{
+   char *displayName = NULL;
+   int numThreads = 2;
+   Display *dpy = NULL;
+   EGLDisplay *egl_dpy = NULL;
+   int i;
+   Status threadStat;
+
+   if (argc == 1) {
+      usage();
+   }
+   else {
+      int i;
+      for (i = 1; i < argc; i++) {
+         if (strcmp(argv[i], "-display") == 0 && i + 1 < argc) {
+            displayName = argv[i + 1];
+            i++;
+         }
+         else if (strcmp(argv[i], "-p") == 0) {
+            MultiDisplays = 1;
+         }
+         else if (strcmp(argv[i], "-l") == 0) {
+            Locking = 1;
+         }
+         else if (strcmp(argv[i], "-t") == 0) {
+            Texture = 1;
+         }
+         else if (strcmp(argv[i], "-n") == 0 && i + 1 < argc) {
+            numThreads = atoi(argv[i + 1]);
+            if (numThreads < 1)
+               numThreads = 1;
+            else if (numThreads > MAX_WINTHREADS)
+               numThreads = MAX_WINTHREADS;
+            i++;
+         }
+         else {
+            usage();
+            exit(1);
+         }
+      }
+   }
+
+   if (Locking)
+      printf("xeglthreads: Using explicit locks around Xlib calls.\n");
+   else
+      printf("xeglthreads: No explict locking.\n");
+
+   if (MultiDisplays)
+      printf("xeglthreads: Per-thread display connections.\n");
+   else
+      printf("xeglthreads: Single display connection.\n");
+
+   /*
+    * VERY IMPORTANT: call XInitThreads() before any other Xlib functions.
+    */
+   if (!MultiDisplays) {
+       if (!Locking) {
+           threadStat = XInitThreads();
+           if (threadStat) {
+               printf("XInitThreads() returned %d (success)\n",
+                      (int) threadStat);
+           }
+           else {
+               printf("XInitThreads() returned 0 "
+                      "(failure- this program may fail)\n");
+           }
+       }
+
+      dpy = XOpenDisplay(displayName);
+      if (!dpy) {
+         fprintf(stderr, "Unable to open display %s\n",
+                 XDisplayName(displayName));
+         return -1;
+      }
+      egl_dpy = eglGetDisplay(dpy);
+      if (!egl_dpy) {
+         fprintf(stderr, "Unable to get EGL display\n");
+         XCloseDisplay(dpy);
+         return -1;
+      }
+      if (!eglInitialize(egl_dpy, NULL, NULL)) {
+          fprintf(stderr, "Unable to initialize EGL display\n");
+          return -1;
+      }
+   }
+
+   pthread_mutex_init(&Mutex, NULL);
+   pthread_mutex_init(&CondMutex, NULL);
+   pthread_cond_init(&CondVar, NULL);
+
+   printf("xeglthreads: creating windows\n");
+
+   NumWinThreads = numThreads;
+
+   /* Create the EGL windows and contexts */
+   for (i = 0; i < numThreads; i++) {
+      EGLContext share;
+
+      if (MultiDisplays) {
+         WinThreads[i].Dpy = XOpenDisplay(displayName);
+         assert(WinThreads[i].Dpy);
+         WinThreads[i].Display = eglGetDisplay(WinThreads[i].Dpy);
+         assert(eglInitialize(WinThreads[i].Display, NULL, NULL));
+      }
+      else {
+         WinThreads[i].Dpy = dpy;
+         WinThreads[i].Display = egl_dpy;
+      }
+      WinThreads[i].Index = i;
+      WinThreads[i].Initialized = GL_FALSE;
+
+      share = (Texture && i > 0) ? WinThreads[0].Context : 0;
+
+      create_window(&WinThreads[i], share);
+   }
+
+   printf("xeglthreads: creating threads\n");
+
+   /* Create the threads */
+   for (i = 0; i < numThreads; i++) {
+      pthread_create(&WinThreads[i].Thread, NULL, thread_function,
+                     (void*) &WinThreads[i]);
+      printf("xeglthreads: Created thread %p\n",
+              (void *) WinThreads[i].Thread);
+   }
+
+   if (MultiDisplays)
+      event_loop_multi();
+   else
+      event_loop(dpy);
+
+   clean_up();
+
+   if (MultiDisplays) {
+      for (i = 0; i < numThreads; i++) {
+          eglTerminate(WinThreads[i].Display);
+          XCloseDisplay(WinThreads[i].Dpy);
+      }
+   }
+   else {
+      eglTerminate(egl_dpy);
+      XCloseDisplay(dpy);
+   }
+
+   return 0;
+}
+
+
+#else /* PTHREADS */
+
+
+#include <stdio.h>
+
+int
+main(int argc, char *argv[])
+{
+   printf("Sorry, this program wasn't compiled with PTHREADS defined.\n");
+   return 0;
+}
+
+
+#endif /* PTHREADS */
diff --git a/progs/egl/peglgears.c b/progs/egl/peglgears.c
deleted file mode 100644 (file)
index 212d1ac..0000000
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * This is a port of the infamous "glxgears" demo to straight EGL
- * Port by Dane Rushton 10 July 2005
- * 
- * No command line options.
- * Program runs for 5 seconds then exits, outputing framerate to console
- */
-
-#define EGL_EGLEXT_PROTOTYPES
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <GL/gl.h>
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-#define MAX_CONFIGS 10
-#define MAX_MODES 100
-
-#define BENCHMARK
-
-#ifdef BENCHMARK
-
-/* XXX this probably isn't very portable */
-
-#include <sys/time.h>
-#include <unistd.h>
-
-/* return current time (in seconds) */
-static double
-current_time(void)
-{
-   struct timeval tv;
-#ifdef __VMS
-   (void) gettimeofday(&tv, NULL );
-#else
-   struct timezone tz;
-   (void) gettimeofday(&tv, &tz);
-#endif
-   return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
-}
-
-#else /*BENCHMARK*/
-
-/* dummy */
-static double
-current_time(void)
-{
-   /* update this function for other platforms! */
-   static double t = 0.0;
-   static int warn = 1;
-   if (warn) {
-      fprintf(stderr, "Warning: current_time() not implemented!!\n");
-      warn = 0;
-   }
-   return t += 1.0;
-}
-
-#endif /*BENCHMARK*/
-
-
-#ifndef M_PI
-#define M_PI 3.14159265
-#endif
-
-
-static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
-static GLint gear1, gear2, gear3;
-static GLfloat angle = 0.0;
-
-#if 0
-static GLfloat eyesep = 5.0;           /* Eye separation. */
-static GLfloat fix_point = 40.0;       /* Fixation point distance.  */
-static GLfloat left, right, asp;       /* Stereo frustum params.  */
-#endif
-
-
-/*
- *
- *  Draw a gear wheel.  You'll probably want to call this function when
- *  building a display list since we do a lot of trig here.
- * 
- *  Input:  inner_radius - radius of hole at center
- *          outer_radius - radius at center of teeth
- *          width - width of gear
- *          teeth - number of teeth
- *          tooth_depth - depth of tooth
- */
-static void
-gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
-     GLint teeth, GLfloat tooth_depth)
-{
-   GLint i;
-   GLfloat r0, r1, r2;
-   GLfloat angle, da;
-   GLfloat u, v, len;
-
-   r0 = inner_radius;
-   r1 = outer_radius - tooth_depth / 2.0;
-   r2 = outer_radius + tooth_depth / 2.0;
-
-   da = 2.0 * M_PI / teeth / 4.0;
-
-   glShadeModel(GL_FLAT);
-
-   glNormal3f(0.0, 0.0, 1.0);
-
-   /* draw front face */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i <= teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
-      if (i < teeth) {
-        glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
-        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                   width * 0.5);
-      }
-   }
-   glEnd();
-
-   /* draw front sides of teeth */
-   glBegin(GL_QUADS);
-   da = 2.0 * M_PI / teeth / 4.0;
-   for (i = 0; i < teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                width * 0.5);
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                width * 0.5);
-   }
-   glEnd();
-
-   glNormal3f(0.0, 0.0, -1.0);
-
-   /* draw back face */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i <= teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
-      if (i < teeth) {
-        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                   -width * 0.5);
-        glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
-      }
-   }
-   glEnd();
-
-   /* draw back sides of teeth */
-   glBegin(GL_QUADS);
-   da = 2.0 * M_PI / teeth / 4.0;
-   for (i = 0; i < teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                -width * 0.5);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                -width * 0.5);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
-   }
-   glEnd();
-
-   /* draw outward faces of teeth */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i < teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
-      u = r2 * cos(angle + da) - r1 * cos(angle);
-      v = r2 * sin(angle + da) - r1 * sin(angle);
-      len = sqrt(u * u + v * v);
-      u /= len;
-      v /= len;
-      glNormal3f(v, -u, 0.0);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
-      glNormal3f(cos(angle), sin(angle), 0.0);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                width * 0.5);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                -width * 0.5);
-      u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
-      v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
-      glNormal3f(v, -u, 0.0);
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                width * 0.5);
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                -width * 0.5);
-      glNormal3f(cos(angle), sin(angle), 0.0);
-   }
-
-   glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
-   glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
-
-   glEnd();
-
-   glShadeModel(GL_SMOOTH);
-
-   /* draw inside radius cylinder */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i <= teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-      glNormal3f(-cos(angle), -sin(angle), 0.0);
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
-   }
-   glEnd();
-}
-
-
-static void
-draw(void)
-{
-   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-   glPushMatrix();
-   glRotatef(view_rotx, 1.0, 0.0, 0.0);
-   glRotatef(view_roty, 0.0, 1.0, 0.0);
-   glRotatef(view_rotz, 0.0, 0.0, 1.0);
-
-   glPushMatrix();
-   glTranslatef(-3.0, -2.0, 0.0);
-   glRotatef(angle, 0.0, 0.0, 1.0);
-   glCallList(gear1);
-   glPopMatrix();
-
-   glPushMatrix();
-   glTranslatef(3.1, -2.0, 0.0);
-   glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
-   glCallList(gear2);
-   glPopMatrix();
-
-   glPushMatrix();
-   glTranslatef(-3.1, 4.2, 0.0);
-   glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
-   glCallList(gear3);
-   glPopMatrix();
-
-   glPopMatrix();
-}
-
-
-/* new window size or exposure */
-static void
-reshape(int width, int height)
-{
-   GLfloat h = (GLfloat) height / (GLfloat) width;
-
-   glViewport(0, 0, (GLint) width, (GLint) height);
-
-   glMatrixMode(GL_PROJECTION);
-   glLoadIdentity();
-   glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
-   
-   glMatrixMode(GL_MODELVIEW);
-   glLoadIdentity();
-   glTranslatef(0.0, 0.0, -40.0);
-}
-   
-
-
-static void
-init(void)
-{
-   static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 };
-   static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 };
-   static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 };
-   static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };
-
-   glLightfv(GL_LIGHT0, GL_POSITION, pos);
-   glEnable(GL_CULL_FACE);
-   glEnable(GL_LIGHTING);
-   glEnable(GL_LIGHT0);
-   glEnable(GL_DEPTH_TEST);
-
-   /* make the gears */
-   gear1 = glGenLists(1);
-   glNewList(gear1, GL_COMPILE);
-   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
-   gear(1.0, 4.0, 1.0, 20, 0.7);
-   glEndList();
-
-   gear2 = glGenLists(1);
-   glNewList(gear2, GL_COMPILE);
-   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
-   gear(0.5, 2.0, 2.0, 10, 0.7);
-   glEndList();
-
-   gear3 = glGenLists(1);
-   glNewList(gear3, GL_COMPILE);
-   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
-   gear(1.3, 2.0, 0.5, 10, 0.7);
-   glEndList();
-
-   glEnable(GL_NORMALIZE);
-}
-
-
-
-
-static void run_gears(EGLDisplay dpy, EGLSurface surf, int ttr)
-{
-       double st = current_time();
-       double ct = st;
-       int frames = 0;
-       GLfloat seconds, fps;
-
-       while (ct - st < ttr)
-       {
-               double tt = current_time();
-               double dt = tt - ct;
-               ct = tt;
-               
-               /* advance rotation for next frame */
-               angle += 70.0 * dt;  /* 70 degrees per second */
-               if (angle > 3600.0)
-                       angle -= 3600.0;
-               
-               draw();
-               
-               eglSwapBuffers(dpy, surf);
-       
-               
-               frames++;
-       }
-       
-       seconds = ct - st;
-       fps = frames / seconds;
-       printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, fps);
-       
-}
-
-
-int
-main(int argc, char *argv[])
-{
-       int major, minor;
-       EGLContext ctx;
-       EGLSurface surface;
-       EGLConfig configs[MAX_CONFIGS];
-       EGLint numConfigs, i;
-       EGLBoolean b;
-       EGLDisplay d;
-       EGLint screenAttribs[10];
-       GLboolean printInfo = GL_FALSE;
-       EGLint width = 300, height = 300;
-       
-        /* parse cmd line args */
-       for (i = 1; i < argc; i++)
-       {
-               if (strcmp(argv[i], "-info") == 0)
-               {
-                       printInfo = GL_TRUE;
-               }
-               else
-                       printf("Warning: unknown parameter: %s\n", argv[i]);
-       }
-       
-       /* DBR : Create EGL context/surface etc */
-       d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-       assert(d);
-
-       if (!eglInitialize(d, &major, &minor)) {
-               printf("peglgears: eglInitialize failed\n");
-               return 0;
-       }
-
-       printf("peglgears: EGL version = %d.%d\n", major, minor);
-       printf("peglgears: EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
-
-       eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);
-
-       eglBindAPI(EGL_OPENGL_API);
-
-       ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
-       if (ctx == EGL_NO_CONTEXT) {
-               printf("peglgears: failed to create context\n");
-               return 0;
-       }
-       
-       /* build up screenAttribs array */
-       i = 0;
-       screenAttribs[i++] = EGL_WIDTH;
-       screenAttribs[i++] = width;
-       screenAttribs[i++] = EGL_HEIGHT;
-       screenAttribs[i++] = height;
-       screenAttribs[i++] = EGL_NONE;
-
-       surface = eglCreatePbufferSurface(d, configs[0], screenAttribs);
-       if (surface == EGL_NO_SURFACE) {
-               printf("peglgears: failed to create pbuffer surface\n");
-               return 0;
-       }
-       
-       b = eglMakeCurrent(d, surface, surface, ctx);
-       if (!b) {
-               printf("peglgears: make current failed\n");
-               return 0;
-       }
-       
-       if (printInfo)
-       {
-               printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
-               printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
-               printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
-               printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
-       }
-       
-       init();
-       reshape(width, height);
-
-       glDrawBuffer( GL_BACK );
-
-       run_gears(d, surface, 5.0);
-       
-       eglDestroySurface(d, surface);
-       eglDestroyContext(d, ctx);
-       eglTerminate(d);
-       
-       return 0;
-}
diff --git a/progs/egl/xegl_tri.c b/progs/egl/xegl_tri.c
deleted file mode 100644 (file)
index 1f1a005..0000000
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright (C) 2008  Brian Paul   All Rights Reserved.
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * Draw a triangle with X/EGL.
- * Brian Paul
- * 3 June 2008
- */
-
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/keysym.h>
-#include <GL/gl.h>  /* using full OpenGL for now */
-#include <GLES/egl.h>
-
-
-static GLfloat view_rotx = 0.0, view_roty = 0.0, view_rotz = 0.0;
-
-
-static void
-draw(void)
-{
-   static const GLfloat verts[3][2] = {
-      { -1, -1 },
-      {  1, -1 },
-      {  0,  1 }
-   };
-   static const GLfloat colors[3][3] = {
-      { 1, 0, 0 },
-      { 0, 1, 0 },
-      { 0, 0, 1 }
-   };
-
-   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-   glPushMatrix();
-   glRotatef(view_rotx, 1, 0, 0);
-   glRotatef(view_roty, 0, 1, 0);
-   glRotatef(view_rotz, 0, 0, 1);
-
-   {
-      glVertexPointer(2, GL_FLOAT, 0, verts);
-      glColorPointer(3, GL_FLOAT, 0, colors);
-      glEnableClientState(GL_VERTEX_ARRAY);
-      glEnableClientState(GL_COLOR_ARRAY);
-
-      glDrawArrays(GL_TRIANGLES, 0, 3);
-
-      glDisableClientState(GL_VERTEX_ARRAY);
-      glDisableClientState(GL_COLOR_ARRAY);
-   }
-
-   glPopMatrix();
-}
-
-
-/* new window size or exposure */
-static void
-reshape(int width, int height)
-{
-   GLfloat ar = (GLfloat) width / (GLfloat) height;
-
-   glViewport(0, 0, (GLint) width, (GLint) height);
-
-   glMatrixMode(GL_PROJECTION);
-   glLoadIdentity();
-   glFrustum(-ar, ar, -1, 1, 5.0, 60.0);
-   
-   glMatrixMode(GL_MODELVIEW);
-   glLoadIdentity();
-   glTranslatef(0.0, 0.0, -10.0);
-}
-
-
-static void
-init(void)
-{
-   glClearColor(0.4, 0.4, 0.4, 0.0);
-}
-
-
-/*
- * Create an RGB, double-buffered X window.
- * Return the window and context handles.
- */
-static void
-make_x_window(Display *x_dpy, EGLDisplay egl_dpy,
-              const char *name,
-              int x, int y, int width, int height,
-              Window *winRet,
-              EGLContext *ctxRet,
-              EGLSurface *surfRet)
-{
-   static const EGLint attribs[] = {
-      EGL_RED_SIZE, 1,
-      EGL_GREEN_SIZE, 1,
-      EGL_BLUE_SIZE, 1,
-      EGL_DEPTH_SIZE, 1,
-      EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
-      EGL_NONE
-   };
-
-   int scrnum;
-   XSetWindowAttributes attr;
-   unsigned long mask;
-   Window root;
-   Window win;
-   XVisualInfo *visInfo, visTemplate;
-   int num_visuals;
-   EGLContext ctx;
-   EGLConfig config;
-   EGLint num_configs;
-   EGLint vid;
-
-   scrnum = DefaultScreen( x_dpy );
-   root = RootWindow( x_dpy, scrnum );
-
-   if (!eglChooseConfig( egl_dpy, attribs, &config, 1, &num_configs) ||
-       !num_configs) {
-      printf("Error: couldn't get an EGL visual config\n");
-      exit(1);
-   }
-
-   assert(config);
-   assert(num_configs > 0);
-
-   if (!eglGetConfigAttrib(egl_dpy, config, EGL_NATIVE_VISUAL_ID, &vid)) {
-      printf("Error: eglGetConfigAttrib() failed\n");
-      exit(1);
-   }
-
-   /* The X window visual must match the EGL config */
-   visTemplate.visualid = vid;
-   visInfo = XGetVisualInfo(x_dpy, VisualIDMask, &visTemplate, &num_visuals);
-   if (!visInfo) {
-      printf("Error: couldn't get X visual\n");
-      exit(1);
-   }
-
-   /* window attributes */
-   attr.background_pixel = 0;
-   attr.border_pixel = 0;
-   attr.colormap = XCreateColormap( x_dpy, root, visInfo->visual, AllocNone);
-   attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
-   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
-
-   win = XCreateWindow( x_dpy, root, 0, 0, width, height,
-                       0, visInfo->depth, InputOutput,
-                       visInfo->visual, mask, &attr );
-
-   /* set hints and properties */
-   {
-      XSizeHints sizehints;
-      sizehints.x = x;
-      sizehints.y = y;
-      sizehints.width  = width;
-      sizehints.height = height;
-      sizehints.flags = USSize | USPosition;
-      XSetNormalHints(x_dpy, win, &sizehints);
-      XSetStandardProperties(x_dpy, win, name, name,
-                              None, (char **)NULL, 0, &sizehints);
-   }
-
-   eglBindAPI(EGL_OPENGL_API);
-
-   ctx = eglCreateContext(egl_dpy, config, EGL_NO_CONTEXT, NULL );
-   if (!ctx) {
-      printf("Error: glXCreateContext failed\n");
-      exit(1);
-   }
-
-   *surfRet = eglCreateWindowSurface(egl_dpy, config, win, NULL);
-
-   if (!*surfRet) {
-      printf("Error: eglCreateWindowSurface failed\n");
-      exit(1);
-   }
-
-   XFree(visInfo);
-
-   *winRet = win;
-   *ctxRet = ctx;
-}
-
-
-static void
-event_loop(Display *dpy, Window win,
-           EGLDisplay egl_dpy, EGLSurface egl_surf)
-{
-   while (1) {
-      int redraw = 0;
-      XEvent event;
-
-      XNextEvent(dpy, &event);
-
-      switch (event.type) {
-      case Expose:
-         redraw = 1;
-         break;
-      case ConfigureNotify:
-         reshape(event.xconfigure.width, event.xconfigure.height);
-         break;
-      case KeyPress:
-         {
-            char buffer[10];
-            int r, code;
-            code = XLookupKeysym(&event.xkey, 0);
-            if (code == XK_Left) {
-               view_roty += 5.0;
-            }
-            else if (code == XK_Right) {
-               view_roty -= 5.0;
-            }
-            else if (code == XK_Up) {
-               view_rotx += 5.0;
-            }
-            else if (code == XK_Down) {
-               view_rotx -= 5.0;
-            }
-            else {
-               r = XLookupString(&event.xkey, buffer, sizeof(buffer),
-                                 NULL, NULL);
-               if (buffer[0] == 27) {
-                  /* escape */
-                  return;
-               }
-            }
-         }
-         redraw = 1;
-         break;
-      default:
-         ; /*no-op*/
-      }
-
-      if (redraw) {
-         draw();
-         eglSwapBuffers(egl_dpy, egl_surf);
-      }
-   }
-}
-
-
-static void
-usage(void)
-{
-   printf("Usage:\n");
-   printf("  -display <displayname>  set the display to run on\n");
-   printf("  -info                   display OpenGL renderer info\n");
-}
-
-int
-main(int argc, char *argv[])
-{
-   const int winWidth = 300, winHeight = 300;
-   Display *x_dpy;
-   Window win;
-   EGLSurface egl_surf;
-   EGLContext egl_ctx;
-   EGLDisplay egl_dpy;
-   char *dpyName = NULL;
-   GLboolean printInfo = GL_FALSE;
-   EGLint egl_major, egl_minor;
-   int i;
-   const char *s;
-
-   for (i = 1; i < argc; i++) {
-      if (strcmp(argv[i], "-display") == 0) {
-         dpyName = argv[i+1];
-         i++;
-      }
-      else if (strcmp(argv[i], "-info") == 0) {
-         printInfo = GL_TRUE;
-      }
-      else {
-         usage();
-         return -1;
-      }
-   }
-
-   x_dpy = XOpenDisplay(dpyName);
-   if (!x_dpy) {
-      printf("Error: couldn't open display %s\n",
-            dpyName ? dpyName : getenv("DISPLAY"));
-      return -1;
-   }
-
-   egl_dpy = eglGetDisplay(x_dpy);
-   if (!egl_dpy) {
-      printf("Error: eglGetDisplay() failed\n");
-      return -1;
-   }
-
-   if (!eglInitialize(egl_dpy, &egl_major, &egl_minor)) {
-      printf("Error: eglInitialize() failed\n");
-      return -1;
-   }
-
-   s = eglQueryString(egl_dpy, EGL_VERSION);
-   printf("EGL_VERSION = %s\n", s);
-
-   make_x_window(x_dpy, egl_dpy,
-                 "xegl_tri", 0, 0, winWidth, winHeight,
-                 &win, &egl_ctx, &egl_surf);
-
-   XMapWindow(x_dpy, win);
-   if (!eglMakeCurrent(egl_dpy, egl_surf, egl_surf, egl_ctx)) {
-      printf("Error: eglMakeCurrent() failed\n");
-      return -1;
-   }
-
-   if (printInfo) {
-      printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
-      printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
-      printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
-   }
-
-   init();
-
-   /* Set initial projection/viewing transformation.
-    * We can't be sure we'll get a ConfigureNotify event when the window
-    * first appears.
-    */
-   reshape(winWidth, winHeight);
-
-   event_loop(x_dpy, win, egl_dpy, egl_surf);
-
-   eglDestroyContext(egl_dpy, egl_ctx);
-   eglDestroySurface(egl_dpy, egl_surf);
-   eglTerminate(egl_dpy);
-
-
-   XDestroyWindow(x_dpy, win);
-   XCloseDisplay(x_dpy);
-
-   return 0;
-}
diff --git a/progs/egl/xeglgears.c b/progs/egl/xeglgears.c
deleted file mode 100644 (file)
index a6a977d..0000000
+++ /dev/null
@@ -1,954 +0,0 @@
-/*
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * Ported to X/EGL/GLES.   XXX Actually, uses full OpenGL ATM.
- * Brian Paul
- * 30 May 2008
- */
-
-/*
- * Command line options:
- *    -info      print GL implementation information
- *
- */
-
-
-#define GL_GLEXT_PROTOTYPES
-#define EGL_EGLEXT_PROTOTYPES
-
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/keysym.h>
-#include <GL/gl.h>
-#include <EGL/egl.h>
-
-#include <EGL/eglext.h>
-
-
-#define BENCHMARK
-
-#ifdef BENCHMARK
-
-/* XXX this probably isn't very portable */
-
-#include <sys/time.h>
-#include <unistd.h>
-
-/* return current time (in seconds) */
-static double
-current_time(void)
-{
-   struct timeval tv;
-#ifdef __VMS
-   (void) gettimeofday(&tv, NULL );
-#else
-   struct timezone tz;
-   (void) gettimeofday(&tv, &tz);
-#endif
-   return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
-}
-
-#else /*BENCHMARK*/
-
-/* dummy */
-static double
-current_time(void)
-{
-   /* update this function for other platforms! */
-   static double t = 0.0;
-   static int warn = 1;
-   if (warn) {
-      fprintf(stderr, "Warning: current_time() not implemented!!\n");
-      warn = 0;
-   }
-   return t += 1.0;
-}
-
-#endif /*BENCHMARK*/
-
-
-
-#ifndef M_PI
-#define M_PI 3.14159265
-#endif
-
-
-static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
-static GLint gear1, gear2, gear3;
-static GLfloat angle = 0.0;
-
-/*
- *
- *  Draw a gear wheel.  You'll probably want to call this function when
- *  building a display list since we do a lot of trig here.
- * 
- *  Input:  inner_radius - radius of hole at center
- *          outer_radius - radius at center of teeth
- *          width - width of gear
- *          teeth - number of teeth
- *          tooth_depth - depth of tooth
- */
-static void
-gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
-     GLint teeth, GLfloat tooth_depth)
-{
-   GLint i;
-   GLfloat r0, r1, r2;
-   GLfloat angle, da;
-   GLfloat u, v, len;
-
-   r0 = inner_radius;
-   r1 = outer_radius - tooth_depth / 2.0;
-   r2 = outer_radius + tooth_depth / 2.0;
-
-   da = 2.0 * M_PI / teeth / 4.0;
-
-   glShadeModel(GL_FLAT);
-
-   glNormal3f(0.0, 0.0, 1.0);
-
-   /* draw front face */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i <= teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
-      if (i < teeth) {
-        glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
-        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                   width * 0.5);
-      }
-   }
-   glEnd();
-
-   /* draw front sides of teeth */
-   glBegin(GL_QUADS);
-   da = 2.0 * M_PI / teeth / 4.0;
-   for (i = 0; i < teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                width * 0.5);
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                width * 0.5);
-   }
-   glEnd();
-
-   glNormal3f(0.0, 0.0, -1.0);
-
-   /* draw back face */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i <= teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
-      if (i < teeth) {
-        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                   -width * 0.5);
-        glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
-      }
-   }
-   glEnd();
-
-   /* draw back sides of teeth */
-   glBegin(GL_QUADS);
-   da = 2.0 * M_PI / teeth / 4.0;
-   for (i = 0; i < teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                -width * 0.5);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                -width * 0.5);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
-   }
-   glEnd();
-
-   /* draw outward faces of teeth */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i < teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
-      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
-      u = r2 * cos(angle + da) - r1 * cos(angle);
-      v = r2 * sin(angle + da) - r1 * sin(angle);
-      len = sqrt(u * u + v * v);
-      u /= len;
-      v /= len;
-      glNormal3f(v, -u, 0.0);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
-      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
-      glNormal3f(cos(angle), sin(angle), 0.0);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                width * 0.5);
-      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
-                -width * 0.5);
-      u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
-      v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
-      glNormal3f(v, -u, 0.0);
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                width * 0.5);
-      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
-                -width * 0.5);
-      glNormal3f(cos(angle), sin(angle), 0.0);
-   }
-
-   glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
-   glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
-
-   glEnd();
-
-   glShadeModel(GL_SMOOTH);
-
-   /* draw inside radius cylinder */
-   glBegin(GL_QUAD_STRIP);
-   for (i = 0; i <= teeth; i++) {
-      angle = i * 2.0 * M_PI / teeth;
-      glNormal3f(-cos(angle), -sin(angle), 0.0);
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
-      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
-   }
-   glEnd();
-}
-
-
-static void
-draw(void)
-{
-   glClearColor(0.2, 0.2, 0.2, 0.2);
-   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-   glPushMatrix();
-   glRotatef(view_rotx, 1.0, 0.0, 0.0);
-   glRotatef(view_roty, 0.0, 1.0, 0.0);
-   glRotatef(view_rotz, 0.0, 0.0, 1.0);
-
-   glPushMatrix();
-   glTranslatef(-3.0, -2.0, 0.0);
-   glRotatef(angle, 0.0, 0.0, 1.0);
-   glCallList(gear1);
-   glPopMatrix();
-
-   glPushMatrix();
-   glTranslatef(3.1, -2.0, 0.0);
-   glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
-   glCallList(gear2);
-   glPopMatrix();
-
-   glPushMatrix();
-   glTranslatef(-3.1, 4.2, 0.0);
-   glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
-   glCallList(gear3);
-   glPopMatrix();
-
-   glPopMatrix();
-}
-
-
-/* new window size or exposure */
-static void
-reshape(int width, int height)
-{
-   GLfloat ar = (GLfloat) width / (GLfloat) height;
-
-   glViewport(0, 0, (GLint) width, (GLint) height);
-
-   glMatrixMode(GL_PROJECTION);
-   glLoadIdentity();
-   glFrustum(-ar, ar, -1, 1, 5.0, 60.0);
-   
-   glMatrixMode(GL_MODELVIEW);
-   glLoadIdentity();
-   glTranslatef(0.0, 0.0, -40.0);
-}
-   
-
-
-static void
-init(void)
-{
-   static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 };
-   static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 };
-   static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 };
-   static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };
-
-   glLightfv(GL_LIGHT0, GL_POSITION, pos);
-   glEnable(GL_CULL_FACE);
-   glEnable(GL_LIGHTING);
-   glEnable(GL_LIGHT0);
-   glEnable(GL_DEPTH_TEST);
-
-   /* make the gears */
-   gear1 = glGenLists(1);
-   glNewList(gear1, GL_COMPILE);
-   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
-   gear(1.0, 4.0, 1.0, 20, 0.7);
-   glEndList();
-
-   gear2 = glGenLists(1);
-   glNewList(gear2, GL_COMPILE);
-   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
-   gear(0.5, 2.0, 2.0, 10, 0.7);
-   glEndList();
-
-   gear3 = glGenLists(1);
-   glNewList(gear3, GL_COMPILE);
-   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
-   gear(1.3, 2.0, 0.5, 10, 0.7);
-   glEndList();
-
-   glEnable(GL_NORMALIZE);
-}
-
-
-struct egl_manager {
-   EGLNativeDisplayType xdpy;
-   EGLNativeWindowType xwin;
-   EGLNativePixmapType xpix;
-
-   EGLDisplay dpy;
-   EGLConfig conf;
-   EGLContext ctx;
-
-   EGLSurface win;
-   EGLSurface pix;
-   EGLSurface pbuf;
-   EGLImageKHR image;
-
-   EGLBoolean verbose;
-   EGLint major, minor;
-
-   GC gc;
-   GLuint fbo;
-};
-
-static struct egl_manager *
-egl_manager_new(EGLNativeDisplayType xdpy, const EGLint *attrib_list,
-                EGLBoolean verbose)
-{
-   struct egl_manager *eman;
-   const char *ver;
-   EGLint num_conf;
-
-   eman = calloc(1, sizeof(*eman));
-   if (!eman)
-      return NULL;
-
-   eman->verbose = verbose;
-   eman->xdpy = xdpy;
-
-   eman->dpy = eglGetDisplay(eman->xdpy);
-   if (eman->dpy == EGL_NO_DISPLAY) {
-      printf("eglGetDisplay() failed\n");
-      free(eman);
-      return NULL;
-   }
-
-   if (!eglInitialize(eman->dpy, &eman->major, &eman->minor)) {
-      printf("eglInitialize() failed\n");
-      free(eman);
-      return NULL;
-   }
-
-   ver = eglQueryString(eman->dpy, EGL_VERSION);
-   printf("EGL_VERSION = %s\n", ver);
-
-   if (!eglChooseConfig(eman->dpy, attrib_list, &eman->conf, 1, &num_conf) ||
-       !num_conf) {
-      printf("eglChooseConfig() failed\n");
-      eglTerminate(eman->dpy);
-      free(eman);
-      return NULL;
-   }
-
-   eman->ctx = eglCreateContext(eman->dpy, eman->conf, EGL_NO_CONTEXT, NULL);
-   if (eman->ctx == EGL_NO_CONTEXT) {
-      printf("eglCreateContext() failed\n");
-      eglTerminate(eman->dpy);
-      free(eman);
-      return NULL;
-   }
-
-   return eman;
-}
-
-static EGLBoolean
-egl_manager_create_window(struct egl_manager *eman, const char *name,
-                          EGLint w, EGLint h, EGLBoolean need_surface,
-                          EGLBoolean fullscreen, const EGLint *attrib_list)
-{
-   XVisualInfo vinfo_template, *vinfo = NULL;
-   EGLint val, num_vinfo;
-   Window root;
-   XSetWindowAttributes attrs;
-   unsigned long mask;
-   EGLint x = 0, y = 0;
-
-   if (!eglGetConfigAttrib(eman->dpy, eman->conf,
-                           EGL_NATIVE_VISUAL_ID, &val)) {
-      printf("eglGetConfigAttrib() failed\n");
-      return EGL_FALSE;
-   }
-   if (val) {
-      vinfo_template.visualid = (VisualID) val;
-      vinfo = XGetVisualInfo(eman->xdpy, VisualIDMask, &vinfo_template, &num_vinfo);
-   }
-   /* try harder if window surface is not needed */
-   if (!vinfo && !need_surface &&
-       eglGetConfigAttrib(eman->dpy, eman->conf, EGL_BUFFER_SIZE, &val)) {
-      if (val == 32)
-         val = 24;
-      vinfo_template.depth = val;
-      vinfo = XGetVisualInfo(eman->xdpy, VisualDepthMask, &vinfo_template, &num_vinfo);
-   }
-
-   if (!vinfo) {
-      printf("XGetVisualInfo() failed\n");
-      return EGL_FALSE;
-   }
-
-   root = DefaultRootWindow(eman->xdpy);
-   if (fullscreen) {
-      x = y = 0;
-      w = DisplayWidth(eman->xdpy, DefaultScreen(eman->xdpy));
-      h = DisplayHeight(eman->xdpy, DefaultScreen(eman->xdpy));
-   }
-
-   /* window attributes */
-   attrs.background_pixel = 0;
-   attrs.border_pixel = 0;
-   attrs.colormap = XCreateColormap(eman->xdpy, root, vinfo->visual, AllocNone);
-   attrs.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
-   attrs.override_redirect = fullscreen;
-   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect;
-
-   eman->xwin = XCreateWindow(eman->xdpy, root, x, y, w, h,
-                              0, vinfo->depth, InputOutput,
-                              vinfo->visual, mask, &attrs);
-   XFree(vinfo);
-
-   /* set hints and properties */
-   {
-      XSizeHints sizehints;
-      sizehints.x = x;
-      sizehints.y = y;
-      sizehints.width  = w;
-      sizehints.height = h;
-      sizehints.flags = USSize | USPosition;
-      XSetNormalHints(eman->xdpy, eman->xwin, &sizehints);
-      XSetStandardProperties(eman->xdpy, eman->xwin, name, name,
-                             None, (char **)NULL, 0, &sizehints);
-   }
-
-   if (need_surface) {
-      eman->win = eglCreateWindowSurface(eman->dpy, eman->conf,
-                                         eman->xwin, attrib_list);
-      if (eman->win == EGL_NO_SURFACE) {
-         printf("eglCreateWindowSurface() failed\n");
-         XDestroyWindow(eman->xdpy, eman->xwin);
-         eman->xwin = None;
-         return EGL_FALSE;
-      }
-   }
-
-   eman->gc = XCreateGC(eman->xdpy, eman->xwin, 0, NULL);
-
-   XMapWindow(eman->xdpy, eman->xwin);
-
-   return EGL_TRUE;
-}
-
-static EGLBoolean
-egl_manager_create_pixmap(struct egl_manager *eman, EGLNativeWindowType xwin,
-                          EGLBoolean need_surface, const EGLint *attrib_list)
-{
-   XWindowAttributes attrs;
-
-   if (!XGetWindowAttributes(eman->xdpy, xwin, &attrs)) {
-      printf("XGetWindowAttributes() failed\n");
-      return EGL_FALSE;
-   }
-
-   eman->xpix = XCreatePixmap(eman->xdpy, xwin,
-                              attrs.width, attrs.height, attrs.depth);
-
-   if (need_surface) {
-      eman->pix = eglCreatePixmapSurface(eman->dpy, eman->conf,
-                                         eman->xpix, attrib_list);
-      if (eman->pix == EGL_NO_SURFACE) {
-         printf("eglCreatePixmapSurface() failed\n");
-         XFreePixmap(eman->xdpy, eman->xpix);
-         eman->xpix = None;
-         return EGL_FALSE;
-      }
-   }
-
-   return EGL_TRUE;
-}
-
-static EGLBoolean
-egl_manager_create_pbuffer(struct egl_manager *eman, const EGLint *attrib_list)
-{
-   eman->pbuf = eglCreatePbufferSurface(eman->dpy, eman->conf, attrib_list);
-   if (eman->pbuf == EGL_NO_SURFACE) {
-      printf("eglCreatePbufferSurface() failed\n");
-      return EGL_FALSE;
-   }
-
-   return EGL_TRUE;
-}
-
-static void
-egl_manager_destroy(struct egl_manager *eman)
-{
-   eglMakeCurrent(eman->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-   eglTerminate(eman->dpy);
-
-   if (eman->xwin != None)
-      XDestroyWindow(eman->xdpy, eman->xwin);
-   if (eman->xpix != None)
-      XFreePixmap(eman->xdpy, eman->xpix);
-
-   XFreeGC(eman->xdpy, eman->gc);
-
-   free(eman);
-}
-
-enum {
-   GEARS_WINDOW,
-   GEARS_PIXMAP,
-   GEARS_PIXMAP_TEXTURE,
-   GEARS_PBUFFER,
-   GEARS_PBUFFER_TEXTURE,
-   GEARS_RENDERBUFFER
-};
-
-static void
-texture_gears(struct egl_manager *eman, int surface_type)
-{
-   static const GLint verts[12] =
-      { -5, -6, -10,  5, -6, -10,  -5, 4, 10,  5, 4, 10 };
-   static const GLint tex_coords[8] = { 0, 0,  1, 0,  0, 1,  1, 1 };
-
-   eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx);
-
-   glClearColor(0, 0, 0, 0);
-   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-   glEnable(GL_TEXTURE_2D);
-   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
-   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT);
-   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-   
-   glEnableClientState(GL_VERTEX_ARRAY);
-   glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-   glVertexPointer(3, GL_INT, 0, verts);
-   glTexCoordPointer(2, GL_INT, 0, tex_coords);
-
-   if (surface_type == GEARS_PBUFFER_TEXTURE)
-      eglBindTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER);
-
-   glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-
-   glDisableClientState(GL_VERTEX_ARRAY);
-   glDisableClientState(GL_COLOR_ARRAY);
-   glDisable(GL_TEXTURE_2D);
-
-   if (surface_type == GEARS_PBUFFER_TEXTURE)
-      eglReleaseTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER);
-
-   eglSwapBuffers(eman->dpy, eman->win); 
-}
-
-static void
-copy_gears(struct egl_manager *eman,
-          EGLint tile_w, EGLint tile_h, EGLint w, EGLint h)
-{
-   int x, y;
-
-   eglWaitClient();
-
-   for (x = 0; x < w; x += tile_w) {
-      for (y = 0; y < h; y += tile_h) {
-
-        XCopyArea(eman->xdpy, eman->xpix, eman->xwin, eman->gc,
-                  0, 0, tile_w, tile_h, x, y);
-      }
-   }
-}
-
-static void
-event_loop(struct egl_manager *eman, EGLint surface_type, EGLint w, EGLint h)
-{
-   int window_w = w, window_h = h;
-
-   if (surface_type == EGL_PBUFFER_BIT)
-      printf("there will be no screen update if "
-             "eglCopyBuffers() is not implemented\n");
-
-   while (1) {
-      while (XPending(eman->xdpy) > 0) {
-         XEvent event;
-         XNextEvent(eman->xdpy, &event);
-         switch (event.type) {
-         case Expose:
-            /* we'll redraw below */
-            break;
-         case ConfigureNotify:
-            window_w = event.xconfigure.width;
-            window_h = event.xconfigure.height;
-            if (surface_type == EGL_WINDOW_BIT)
-               reshape(window_w, window_h);
-            break;
-         case KeyPress:
-            {
-               char buffer[10];
-               int r, code;
-               code = XLookupKeysym(&event.xkey, 0);
-               if (code == XK_Left) {
-                  view_roty += 5.0;
-               }
-               else if (code == XK_Right) {
-                  view_roty -= 5.0;
-               }
-               else if (code == XK_Up) {
-                  view_rotx += 5.0;
-               }
-               else if (code == XK_Down) {
-                  view_rotx -= 5.0;
-               }
-               else {
-                  r = XLookupString(&event.xkey, buffer, sizeof(buffer),
-                                    NULL, NULL);
-                  if (buffer[0] == 27) {
-                     /* escape */
-                     return;
-                  }
-               }
-            }
-         }
-      }
-
-      {
-         static int frames = 0;
-         static double tRot0 = -1.0, tRate0 = -1.0;
-         double dt, t = current_time();
-         if (tRot0 < 0.0)
-            tRot0 = t;
-         dt = t - tRot0;
-         tRot0 = t;
-
-         /* advance rotation for next frame */
-         angle += 70.0 * dt;  /* 70 degrees per second */
-         if (angle > 3600.0)
-             angle -= 3600.0;
-
-         switch (surface_type) {
-         case GEARS_WINDOW:
-           draw();
-            eglSwapBuffers(eman->dpy, eman->win);
-            break;
-
-        case GEARS_PBUFFER:
-           draw();
-           if (!eglCopyBuffers(eman->dpy, eman->pbuf, eman->xpix))
-              break;
-           copy_gears(eman, w, h, window_w, window_h);
-           break;
-
-        case GEARS_PBUFFER_TEXTURE:
-            eglMakeCurrent(eman->dpy, eman->pbuf, eman->pbuf, eman->ctx);
-           draw();
-           texture_gears(eman, surface_type);
-           break;
-
-        case GEARS_PIXMAP:
-           draw();
-           copy_gears(eman, w, h, window_w, window_h);
-           break;
-
-        case GEARS_PIXMAP_TEXTURE:
-            eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx);
-           draw();
-           texture_gears(eman, surface_type);
-           break;
-
-        case GEARS_RENDERBUFFER:
-           glBindFramebuffer(GL_FRAMEBUFFER_EXT, eman->fbo);
-           draw();
-           glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
-           texture_gears(eman, surface_type);
-           break;
-        }
-
-         frames++;
-
-         if (tRate0 < 0.0)
-            tRate0 = t;
-         if (t - tRate0 >= 5.0) {
-            GLfloat seconds = t - tRate0;
-            GLfloat fps = frames / seconds;
-            printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds,
-                   fps);
-            tRate0 = t;
-            frames = 0;
-         }
-      }
-   }
-}
-
-
-static void
-usage(void)
-{
-   printf("Usage:\n");
-   printf("  -display <displayname>  set the display to run on\n");
-   printf("  -fullscreen             run in fullscreen mode\n");
-   printf("  -info                   display OpenGL renderer info\n");
-   printf("  -pixmap                 use pixmap surface\n");
-   printf("  -pixmap-texture         use pixmap surface and texture using EGLImage\n");
-   printf("  -pbuffer                use pbuffer surface and eglCopyBuffers\n");
-   printf("  -pbuffer-texture        use pbuffer surface and eglBindTexImage\n");
-   printf("  -renderbuffer           renderbuffer as EGLImage and bind as texture from\n");
-}
-static const char *names[] = {
-   "window",
-   "pixmap",
-   "pixmap_texture",
-   "pbuffer",
-   "pbuffer_texture",
-   "renderbuffer"
-};
-
-int
-main(int argc, char *argv[])
-{
-   const int winWidth = 300, winHeight = 300;
-   Display *x_dpy;
-   char *dpyName = NULL;
-   struct egl_manager *eman;
-   EGLint attribs[] = {
-      EGL_SURFACE_TYPE, EGL_WINDOW_BIT, /* may be changed later */
-      EGL_RED_SIZE, 1,
-      EGL_GREEN_SIZE, 1,
-      EGL_BLUE_SIZE, 1,
-      EGL_DEPTH_SIZE, 1,
-      EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
-      EGL_NONE
-   };
-   char win_title[] = "xeglgears (window/pixmap/pbuffer)";
-   EGLint surface_type = GEARS_WINDOW;
-   GLboolean printInfo = GL_FALSE;
-   GLboolean fullscreen = GL_FALSE;
-   EGLBoolean ret;
-   GLuint texture, color_rb, depth_rb;
-   int i;
-
-   for (i = 1; i < argc; i++) {
-      if (strcmp(argv[i], "-display") == 0) {
-         dpyName = argv[i+1];
-         i++;
-      }
-      else if (strcmp(argv[i], "-info") == 0) {
-         printInfo = GL_TRUE;
-      }
-      else if (strcmp(argv[i], "-fullscreen") == 0) {
-         fullscreen = GL_TRUE;
-      }
-      else if (strcmp(argv[i], "-pixmap") == 0) {
-         surface_type = GEARS_PIXMAP;
-        attribs[1] = EGL_PIXMAP_BIT;
-      }
-      else if (strcmp(argv[i], "-pixmap-texture") == 0) {
-         surface_type = GEARS_PIXMAP_TEXTURE;
-        attribs[1] = EGL_PIXMAP_BIT;
-      }
-      else if (strcmp(argv[i], "-pbuffer") == 0) {
-         surface_type = GEARS_PBUFFER;
-        attribs[1] = EGL_PBUFFER_BIT;
-      }
-      else if (strcmp(argv[i], "-pbuffer-texture") == 0) {
-         surface_type = GEARS_PBUFFER_TEXTURE;
-        attribs[1] = EGL_PBUFFER_BIT;
-      }
-      else if (strcmp(argv[i], "-renderbuffer") == 0) {
-         surface_type = GEARS_RENDERBUFFER;
-      }
-      else {
-         usage();
-         return -1;
-      }
-   }
-
-   x_dpy = XOpenDisplay(dpyName);
-   if (!x_dpy) {
-      printf("Error: couldn't open display %s\n",
-            dpyName ? dpyName : getenv("DISPLAY"));
-      return -1;
-   }
-
-   eglBindAPI(EGL_OPENGL_API);
-
-   eman = egl_manager_new(x_dpy, attribs, printInfo);
-   if (!eman) {
-      XCloseDisplay(x_dpy);
-      return -1;
-   }
-
-   snprintf(win_title, sizeof(win_title),
-           "xeglgears (%s)", names[surface_type]);
-
-   ret = egl_manager_create_window(eman, win_title, winWidth, winHeight,
-                                  EGL_TRUE, fullscreen, NULL);
-   if (!ret)
-      return -1;
-
-   /* create surface(s) */
-   switch (surface_type) {
-   case GEARS_WINDOW:
-      if (ret)
-         ret = eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx);
-      break;
-   case GEARS_PIXMAP:
-   case GEARS_PIXMAP_TEXTURE:
-      ret = egl_manager_create_pixmap(eman, eman->xwin, EGL_TRUE, NULL);
-      if (surface_type == GEARS_PIXMAP_TEXTURE)
-        eman->image = eglCreateImageKHR (eman->dpy, eman->ctx,
-                                         EGL_NATIVE_PIXMAP_KHR,
-                                         (EGLClientBuffer) eman->xpix, NULL);
-      if (ret)
-         ret = eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx);
-      break;
-   case GEARS_PBUFFER:
-   case GEARS_PBUFFER_TEXTURE:
-      {
-         EGLint pbuf_attribs[] = {
-            EGL_WIDTH, winWidth,
-            EGL_HEIGHT, winHeight,
-           EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB,
-           EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
-            EGL_NONE
-         };
-         ret = (egl_manager_create_pixmap(eman, eman->xwin,
-                                         EGL_TRUE, NULL) &&
-                egl_manager_create_pbuffer(eman, pbuf_attribs));
-         if (ret)
-            ret = eglMakeCurrent(eman->dpy, eman->pbuf, eman->pbuf, eman->ctx);
-      }
-      break;
-
-
-   case GEARS_RENDERBUFFER:
-      ret = eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx);
-      if (ret == EGL_FALSE)
-        printf("failed to make context current\n");
-
-      glGenFramebuffers(1, &eman->fbo);
-      glBindFramebuffer(GL_FRAMEBUFFER_EXT, eman->fbo);
-      
-      glGenRenderbuffers(1, &color_rb);
-      glBindRenderbuffer(GL_RENDERBUFFER_EXT, color_rb);
-      glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_RGBA, winWidth, winHeight);
-      glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
-                                  GL_COLOR_ATTACHMENT0_EXT,
-                                  GL_RENDERBUFFER_EXT,
-                                  color_rb);
-
-      eman->image = eglCreateImageKHR(eman->dpy, eman->ctx,
-                                     EGL_GL_RENDERBUFFER_KHR,
-                                     (EGLClientBuffer) color_rb, NULL);
-
-      glGenRenderbuffers(1, &depth_rb);
-      glBindRenderbuffer(GL_RENDERBUFFER_EXT, depth_rb);
-      glRenderbufferStorage(GL_RENDERBUFFER_EXT,
-                           GL_DEPTH_COMPONENT, winWidth, winHeight);
-      glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
-                                  GL_DEPTH_ATTACHMENT_EXT,
-                                  GL_RENDERBUFFER_EXT,
-                                  depth_rb);
-
-      if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE) {
-        printf("framebuffer not complete\n");
-        exit(1);
-      }
-
-      break;
-
-   default:
-      ret = EGL_FALSE;
-      break;
-   }
-
-   switch (surface_type) {
-   case GEARS_PIXMAP_TEXTURE:
-   case GEARS_RENDERBUFFER:
-          glGenTextures(1, &texture);
-          glBindTexture(GL_TEXTURE_2D, texture);
-          glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eman->image);
-          break;
-   case GEARS_PBUFFER_TEXTURE:
-          glGenTextures(1, &texture);
-          glBindTexture(GL_TEXTURE_2D, texture);
-          break;
-   }
-
-   if (!ret) {
-      egl_manager_destroy(eman);
-      XCloseDisplay(x_dpy);
-      return -1;
-   }
-
-   if (printInfo) {
-      printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
-      printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
-      printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
-   }
-
-   init();
-
-   /* Set initial projection/viewing transformation.
-    * We can't be sure we'll get a ConfigureNotify event when the window
-    * first appears.
-    */
-   reshape(winWidth, winHeight);
-
-   event_loop(eman, surface_type, winWidth, winHeight);
-
-   glDeleteLists(gear1, 1);
-   glDeleteLists(gear2, 1);
-   glDeleteLists(gear3, 1);
-
-   egl_manager_destroy(eman);
-   XCloseDisplay(x_dpy);
-
-   return 0;
-}
diff --git a/progs/egl/xeglthreads.c b/progs/egl/xeglthreads.c
deleted file mode 100644 (file)
index 5787fae..0000000
+++ /dev/null
@@ -1,775 +0,0 @@
-/*
- * Copyright (C) 2000  Brian Paul   All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Ported to EGL by Chia-I Wu <olvaffe@gmail.com>
- */
-
-
-/*
- * This program tests EGL thread safety.
- * Command line options:
- *  -p                       Open a display connection for each thread
- *  -l                       Enable application-side locking
- *  -n <num threads>         Number of threads to create (default is 2)
- *  -display <display name>  Specify X display (default is $DISPLAY)
- *  -t                       Use texture mapping
- *
- * Brian Paul  20 July 2000
- */
-
-
-/*
- * Notes:
- * - Each thread gets its own EGL context.
- *
- * - The EGL contexts share texture objects.
- *
- * - When 't' is pressed to update the texture image, the window/thread which
- *   has input focus is signalled to change the texture.  The other threads
- *   should see the updated texture the next time they call glBindTexture.
- */
-
-
-#if defined(PTHREADS)   /* defined by Mesa on Linux and other platforms */
-
-#include <assert.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <GL/gl.h>
-#include <EGL/egl.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <pthread.h>
-
-
-/*
- * Each window/thread/context:
- */
-struct winthread {
-   Display *Dpy;
-   int Index;
-   pthread_t Thread;
-   Window Win;
-   EGLDisplay Display;
-   EGLContext Context;
-   EGLSurface Surface;
-   float Angle;
-   int WinWidth, WinHeight;
-   GLboolean NewSize;
-   GLboolean Initialized;
-   GLboolean MakeNewTexture;
-};
-
-
-#define MAX_WINTHREADS 100
-static struct winthread WinThreads[MAX_WINTHREADS];
-static int NumWinThreads = 0;
-static volatile GLboolean ExitFlag = GL_FALSE;
-
-static GLboolean MultiDisplays = 0;
-static GLboolean Locking = 0;
-static GLboolean Texture = GL_FALSE;
-static GLuint TexObj = 12;
-static GLboolean Animate = GL_TRUE;
-
-static pthread_mutex_t Mutex;
-static pthread_cond_t CondVar;
-static pthread_mutex_t CondMutex;
-
-
-static void
-Error(const char *msg)
-{
-   fprintf(stderr, "Error: %s\n", msg);
-   exit(1);
-}
-
-
-static void
-signal_redraw(void)
-{
-   pthread_mutex_lock(&CondMutex);
-   pthread_cond_broadcast(&CondVar);
-   pthread_mutex_unlock(&CondMutex);
-}
-
-
-static void
-MakeNewTexture(struct winthread *wt)
-{
-#define TEX_SIZE 128
-   static float step = 0.0;
-   GLfloat image[TEX_SIZE][TEX_SIZE][4];
-   GLint width;
-   int i, j;
-
-   for (j = 0; j < TEX_SIZE; j++) {
-      for (i = 0; i < TEX_SIZE; i++) {
-         float dt = 5.0 * (j - 0.5 * TEX_SIZE) / TEX_SIZE;
-         float ds = 5.0 * (i - 0.5 * TEX_SIZE) / TEX_SIZE;
-         float r = dt * dt + ds * ds + step;
-         image[j][i][0] =
-         image[j][i][1] =
-         image[j][i][2] = 0.75 + 0.25 * cos(r);
-         image[j][i][3] = 1.0;
-      }
-   }
-
-   step += 0.5;
-
-   glBindTexture(GL_TEXTURE_2D, TexObj);
-
-   glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
-   if (width) {
-      assert(width == TEX_SIZE);
-      /* sub-tex replace */
-      glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TEX_SIZE, TEX_SIZE,
-                   GL_RGBA, GL_FLOAT, image);
-   }
-   else {
-      /* create new */
-      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
-      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0,
-                   GL_RGBA, GL_FLOAT, image);
-   }
-}
-
-
-
-/* draw a colored cube */
-static void
-draw_object(void)
-{
-   glPushMatrix();
-   glScalef(0.75, 0.75, 0.75);
-
-   glColor3f(1, 0, 0);
-
-   if (Texture) {
-      glBindTexture(GL_TEXTURE_2D, TexObj);
-      glEnable(GL_TEXTURE_2D);
-   }
-   else {
-      glDisable(GL_TEXTURE_2D);
-   }
-
-   glBegin(GL_QUADS);
-
-   /* -X */
-   glColor3f(0, 1, 1);
-   glTexCoord2f(0, 0);  glVertex3f(-1, -1, -1);
-   glTexCoord2f(1, 0);  glVertex3f(-1,  1, -1);
-   glTexCoord2f(1, 1);  glVertex3f(-1,  1,  1);
-   glTexCoord2f(0, 1);  glVertex3f(-1, -1,  1);
-
-   /* +X */
-   glColor3f(1, 0, 0);
-   glTexCoord2f(0, 0);  glVertex3f(1, -1, -1);
-   glTexCoord2f(1, 0);  glVertex3f(1,  1, -1);
-   glTexCoord2f(1, 1);  glVertex3f(1,  1,  1);
-   glTexCoord2f(0, 1);  glVertex3f(1, -1,  1);
-
-   /* -Y */
-   glColor3f(1, 0, 1);
-   glTexCoord2f(0, 0);  glVertex3f(-1, -1, -1);
-   glTexCoord2f(1, 0);  glVertex3f( 1, -1, -1);
-   glTexCoord2f(1, 1);  glVertex3f( 1, -1,  1);
-   glTexCoord2f(0, 1);  glVertex3f(-1, -1,  1);
-
-   /* +Y */
-   glColor3f(0, 1, 0);
-   glTexCoord2f(0, 0);  glVertex3f(-1, 1, -1);
-   glTexCoord2f(1, 0);  glVertex3f( 1, 1, -1);
-   glTexCoord2f(1, 1);  glVertex3f( 1, 1,  1);
-   glTexCoord2f(0, 1);  glVertex3f(-1, 1,  1);
-
-   /* -Z */
-   glColor3f(1, 1, 0);
-   glTexCoord2f(0, 0);  glVertex3f(-1, -1, -1);
-   glTexCoord2f(1, 0);  glVertex3f( 1, -1, -1);
-   glTexCoord2f(1, 1);  glVertex3f( 1,  1, -1);
-   glTexCoord2f(0, 1);  glVertex3f(-1,  1, -1);
-
-   /* +Y */
-   glColor3f(0, 0, 1);
-   glTexCoord2f(0, 0);  glVertex3f(-1, -1, 1);
-   glTexCoord2f(1, 0);  glVertex3f( 1, -1, 1);
-   glTexCoord2f(1, 1);  glVertex3f( 1,  1, 1);
-   glTexCoord2f(0, 1);  glVertex3f(-1,  1, 1);
-
-   glEnd();
-
-   glPopMatrix();
-}
-
-
-/* signal resize of given window */
-static void
-resize(struct winthread *wt, int w, int h)
-{
-   wt->NewSize = GL_TRUE;
-   wt->WinWidth = w;
-   wt->WinHeight = h;
-   if (!Animate)
-      signal_redraw();
-}
-
-
-/*
- * We have an instance of this for each thread.
- */
-static void
-draw_loop(struct winthread *wt)
-{
-   while (!ExitFlag) {
-
-      if (Locking)
-         pthread_mutex_lock(&Mutex);
-
-      if (!wt->Initialized) {
-         eglMakeCurrent(wt->Display, wt->Surface, wt->Surface, wt->Context);
-         printf("xeglthreads: %d: GL_RENDERER = %s\n", wt->Index,
-                (char *) glGetString(GL_RENDERER));
-         if (Texture /*&& wt->Index == 0*/) {
-            MakeNewTexture(wt);
-         }
-         wt->Initialized = GL_TRUE;
-      }
-
-      if (Locking)
-         pthread_mutex_unlock(&Mutex);
-
-      eglBindAPI(EGL_OPENGL_API);
-      if (eglGetCurrentContext() != wt->Context) {
-         printf("xeglthreads: current context %p != %p\n",
-               eglGetCurrentContext(), wt->Context);
-      }
-
-      glEnable(GL_DEPTH_TEST);
-
-      if (wt->NewSize) {
-         GLfloat w = (float) wt->WinWidth / (float) wt->WinHeight;
-         glViewport(0, 0, wt->WinWidth, wt->WinHeight);
-         glMatrixMode(GL_PROJECTION);
-         glLoadIdentity();
-         glFrustum(-w, w, -1.0, 1.0, 1.5, 10);
-         glMatrixMode(GL_MODELVIEW);
-         glLoadIdentity();
-         glTranslatef(0, 0, -2.5);
-         wt->NewSize = GL_FALSE;
-      }
-
-      if (wt->MakeNewTexture) {
-         MakeNewTexture(wt);
-         wt->MakeNewTexture = GL_FALSE;
-      }
-
-      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-      glPushMatrix();
-         glRotatef(wt->Angle, 0, 1, 0);
-         glRotatef(wt->Angle, 1, 0, 0);
-         glScalef(0.7, 0.7, 0.7);
-         draw_object();
-      glPopMatrix();
-
-      if (Locking)
-         pthread_mutex_lock(&Mutex);
-
-      eglSwapBuffers(wt->Display, wt->Surface);
-
-      if (Locking)
-         pthread_mutex_unlock(&Mutex);
-
-      if (Animate) {
-         usleep(5000);
-      }
-      else {
-         /* wait for signal to draw */
-         pthread_mutex_lock(&CondMutex);
-         pthread_cond_wait(&CondVar, &CondMutex);
-         pthread_mutex_unlock(&CondMutex);
-      }
-      wt->Angle += 1.0;
-   }
-   eglMakeCurrent(wt->Display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-}
-
-
-static void
-keypress(XEvent *event, struct winthread *wt)
-{
-   char buf[100];
-   KeySym keySym;
-   XComposeStatus stat;
-
-   XLookupString(&event->xkey, buf, sizeof(buf), &keySym, &stat);
-
-   switch (keySym) {
-   case XK_Escape:
-      /* tell all threads to exit */
-      if (!Animate) {
-         signal_redraw();
-      }
-      ExitFlag = GL_TRUE;
-      /*printf("exit draw_loop %d\n", wt->Index);*/
-      return;
-   case XK_t:
-   case XK_T:
-      if (Texture) {
-         wt->MakeNewTexture = GL_TRUE;
-         if (!Animate)
-            signal_redraw();
-      }
-      break;
-   case XK_a:
-   case XK_A:
-      Animate = !Animate;
-      if (Animate)  /* yes, prev Animate state! */
-         signal_redraw();
-      break;
-   case XK_s:
-   case XK_S:
-      if (!Animate)
-         signal_redraw();
-      break;
-   default:
-      ; /* nop */
-   }
-}
-
-
-/*
- * The main process thread runs this loop.
- * Single display connection for all threads.
- */
-static void
-event_loop(Display *dpy)
-{
-   XEvent event;
-   int i;
-
-   assert(!MultiDisplays);
-
-   while (!ExitFlag) {
-
-      if (Locking) {
-         while (1) {
-            int k;
-            pthread_mutex_lock(&Mutex);
-            k = XPending(dpy);
-            if (k) {
-               XNextEvent(dpy, &event);
-               pthread_mutex_unlock(&Mutex);
-               break;
-            }
-            pthread_mutex_unlock(&Mutex);
-            usleep(5000);
-         }
-      }
-      else {
-         XNextEvent(dpy, &event);
-      }
-
-      switch (event.type) {
-         case ConfigureNotify:
-            /* Find winthread for this event's window */
-            for (i = 0; i < NumWinThreads; i++) {
-               struct winthread *wt = &WinThreads[i];
-               if (event.xconfigure.window == wt->Win) {
-                  resize(wt, event.xconfigure.width,
-                         event.xconfigure.height);
-                  break;
-               }
-            }
-            break;
-         case KeyPress:
-            for (i = 0; i < NumWinThreads; i++) {
-               struct winthread *wt = &WinThreads[i];
-               if (event.xkey.window == wt->Win) {
-                  keypress(&event, wt);
-                  break;
-               }
-            }
-            break;
-         default:
-            /*no-op*/ ;
-      }
-   }
-}
-
-
-/*
- * Separate display connection for each thread.
- */
-static void
-event_loop_multi(void)
-{
-   XEvent event;
-   int w = 0;
-
-   assert(MultiDisplays);
-
-   while (!ExitFlag) {
-      struct winthread *wt = &WinThreads[w];
-      if (XPending(wt->Dpy)) {
-         XNextEvent(wt->Dpy, &event);
-         switch (event.type) {
-         case ConfigureNotify:
-            resize(wt, event.xconfigure.width, event.xconfigure.height);
-            break;
-         case KeyPress:
-            keypress(&event, wt);
-            break;
-         default:
-            ; /* nop */
-         }
-      }
-      w = (w + 1) % NumWinThreads;
-      usleep(5000);
-   }
-}
-
-
-
-/*
- * we'll call this once for each thread, before the threads are created.
- */
-static void
-create_window(struct winthread *wt, EGLContext shareCtx)
-{
-   Window win;
-   EGLContext ctx;
-   EGLSurface surf;
-   EGLint attribs[] = { EGL_RED_SIZE, 1,
-                        EGL_GREEN_SIZE, 1,
-                        EGL_BLUE_SIZE, 1,
-                        EGL_DEPTH_SIZE, 1,
-                        EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
-                        EGL_NONE };
-   EGLConfig config;
-   EGLint num_configs;
-   EGLint vid;
-   int scrnum;
-   XSetWindowAttributes attr;
-   unsigned long mask;
-   Window root;
-   XVisualInfo *visinfo, visTemplate;
-   int num_visuals;
-   int width = 160, height = 160;
-   int xpos = (wt->Index % 8) * (width + 10);
-   int ypos = (wt->Index / 8) * (width + 20);
-
-   scrnum = DefaultScreen(wt->Dpy);
-   root = RootWindow(wt->Dpy, scrnum);
-
-   if (!eglChooseConfig(wt->Display, attribs, &config, 1, &num_configs) ||
-       !num_configs) {
-      Error("Unable to choose an EGL config");
-   }
-
-   assert(config);
-   assert(num_configs > 0);
-
-   if (!eglGetConfigAttrib(wt->Display, config, EGL_NATIVE_VISUAL_ID, &vid)) {
-      Error("Unable to get visual id of EGL config\n");
-   }
-
-   visTemplate.visualid = vid;
-   visinfo = XGetVisualInfo(wt->Dpy, VisualIDMask,
-                        &visTemplate, &num_visuals);
-   if (!visinfo) {
-      Error("Unable to find RGB, Z, double-buffered visual");
-   }
-
-   /* window attributes */
-   attr.background_pixel = 0;
-   attr.border_pixel = 0;
-   attr.colormap = XCreateColormap(wt->Dpy, root, visinfo->visual, AllocNone);
-   attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
-   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
-
-   win = XCreateWindow(wt->Dpy, root, xpos, ypos, width, height,
-                        0, visinfo->depth, InputOutput,
-                        visinfo->visual, mask, &attr);
-   if (!win) {
-      Error("Couldn't create window");
-   }
-
-   XFree(visinfo);
-
-   {
-      XSizeHints sizehints;
-      sizehints.x = xpos;
-      sizehints.y = ypos;
-      sizehints.width  = width;
-      sizehints.height = height;
-      sizehints.flags = USSize | USPosition;
-      XSetNormalHints(wt->Dpy, win, &sizehints);
-      XSetStandardProperties(wt->Dpy, win, "xeglthreads", "xeglthreads",
-                              None, (char **)NULL, 0, &sizehints);
-   }
-
-   eglBindAPI(EGL_OPENGL_API);
-
-   ctx = eglCreateContext(wt->Display, config, shareCtx, NULL);
-   if (!ctx) {
-      Error("Couldn't create EGL context");
-   }
-   surf = eglCreateWindowSurface(wt->Display, config, win, NULL);
-   if (!surf) {
-      Error("Couldn't create EGL surface");
-   }
-
-   XMapWindow(wt->Dpy, win);
-   XSync(wt->Dpy, 0);
-
-   /* save the info for this window/context */
-   wt->Win = win;
-   wt->Context = ctx;
-   wt->Surface = surf;
-   wt->Angle = 0.0;
-   wt->WinWidth = width;
-   wt->WinHeight = height;
-   wt->NewSize = GL_TRUE;
-}
-
-
-/*
- * Called by pthread_create()
- */
-static void *
-thread_function(void *p)
-{
-   struct winthread *wt = (struct winthread *) p;
-   draw_loop(wt);
-   return NULL;
-}
-
-
-/*
- * called before exit to wait for all threads to finish
- */
-static void
-clean_up(void)
-{
-   int i;
-
-   /* wait for threads to finish */
-   for (i = 0; i < NumWinThreads; i++) {
-      pthread_join(WinThreads[i].Thread, NULL);
-   }
-
-   for (i = 0; i < NumWinThreads; i++) {
-      eglDestroyContext(WinThreads[i].Display, WinThreads[i].Context);
-      XDestroyWindow(WinThreads[i].Dpy, WinThreads[i].Win);
-   }
-}
-
-
-static void
-usage(void)
-{
-   printf("xeglthreads: test of EGL/GL thread safety (any key = exit)\n");
-   printf("Usage:\n");
-   printf("  xeglthreads [options]\n");
-   printf("Options:\n");
-   printf("   -display DISPLAYNAME  Specify display string\n");
-   printf("   -n NUMTHREADS  Number of threads to create\n");
-   printf("   -p  Use a separate display connection for each thread\n");
-   printf("   -l  Use application-side locking\n");
-   printf("   -t  Enable texturing\n");
-   printf("Keyboard:\n");
-   printf("   Esc  Exit\n");
-   printf("   t    Change texture image (requires -t option)\n");
-   printf("   a    Toggle animation\n");
-   printf("   s    Step rotation (when not animating)\n");
-}
-
-
-int
-main(int argc, char *argv[])
-{
-   char *displayName = NULL;
-   int numThreads = 2;
-   Display *dpy = NULL;
-   EGLDisplay *egl_dpy = NULL;
-   int i;
-   Status threadStat;
-
-   if (argc == 1) {
-      usage();
-   }
-   else {
-      int i;
-      for (i = 1; i < argc; i++) {
-         if (strcmp(argv[i], "-display") == 0 && i + 1 < argc) {
-            displayName = argv[i + 1];
-            i++;
-         }
-         else if (strcmp(argv[i], "-p") == 0) {
-            MultiDisplays = 1;
-         }
-         else if (strcmp(argv[i], "-l") == 0) {
-            Locking = 1;
-         }
-         else if (strcmp(argv[i], "-t") == 0) {
-            Texture = 1;
-         }
-         else if (strcmp(argv[i], "-n") == 0 && i + 1 < argc) {
-            numThreads = atoi(argv[i + 1]);
-            if (numThreads < 1)
-               numThreads = 1;
-            else if (numThreads > MAX_WINTHREADS)
-               numThreads = MAX_WINTHREADS;
-            i++;
-         }
-         else {
-            usage();
-            exit(1);
-         }
-      }
-   }
-
-   if (Locking)
-      printf("xeglthreads: Using explicit locks around Xlib calls.\n");
-   else
-      printf("xeglthreads: No explict locking.\n");
-
-   if (MultiDisplays)
-      printf("xeglthreads: Per-thread display connections.\n");
-   else
-      printf("xeglthreads: Single display connection.\n");
-
-   /*
-    * VERY IMPORTANT: call XInitThreads() before any other Xlib functions.
-    */
-   if (!MultiDisplays) {
-       if (!Locking) {
-           threadStat = XInitThreads();
-           if (threadStat) {
-               printf("XInitThreads() returned %d (success)\n",
-                      (int) threadStat);
-           }
-           else {
-               printf("XInitThreads() returned 0 "
-                      "(failure- this program may fail)\n");
-           }
-       }
-
-      dpy = XOpenDisplay(displayName);
-      if (!dpy) {
-         fprintf(stderr, "Unable to open display %s\n",
-                 XDisplayName(displayName));
-         return -1;
-      }
-      egl_dpy = eglGetDisplay(dpy);
-      if (!egl_dpy) {
-         fprintf(stderr, "Unable to get EGL display\n");
-         XCloseDisplay(dpy);
-         return -1;
-      }
-      if (!eglInitialize(egl_dpy, NULL, NULL)) {
-          fprintf(stderr, "Unable to initialize EGL display\n");
-          return -1;
-      }
-   }
-
-   pthread_mutex_init(&Mutex, NULL);
-   pthread_mutex_init(&CondMutex, NULL);
-   pthread_cond_init(&CondVar, NULL);
-
-   printf("xeglthreads: creating windows\n");
-
-   NumWinThreads = numThreads;
-
-   /* Create the EGL windows and contexts */
-   for (i = 0; i < numThreads; i++) {
-      EGLContext share;
-
-      if (MultiDisplays) {
-         WinThreads[i].Dpy = XOpenDisplay(displayName);
-         assert(WinThreads[i].Dpy);
-         WinThreads[i].Display = eglGetDisplay(WinThreads[i].Dpy);
-         assert(eglInitialize(WinThreads[i].Display, NULL, NULL));
-      }
-      else {
-         WinThreads[i].Dpy = dpy;
-         WinThreads[i].Display = egl_dpy;
-      }
-      WinThreads[i].Index = i;
-      WinThreads[i].Initialized = GL_FALSE;
-
-      share = (Texture && i > 0) ? WinThreads[0].Context : 0;
-
-      create_window(&WinThreads[i], share);
-   }
-
-   printf("xeglthreads: creating threads\n");
-
-   /* Create the threads */
-   for (i = 0; i < numThreads; i++) {
-      pthread_create(&WinThreads[i].Thread, NULL, thread_function,
-                     (void*) &WinThreads[i]);
-      printf("xeglthreads: Created thread %p\n",
-              (void *) WinThreads[i].Thread);
-   }
-
-   if (MultiDisplays)
-      event_loop_multi();
-   else
-      event_loop(dpy);
-
-   clean_up();
-
-   if (MultiDisplays) {
-      for (i = 0; i < numThreads; i++) {
-          eglTerminate(WinThreads[i].Display);
-          XCloseDisplay(WinThreads[i].Dpy);
-      }
-   }
-   else {
-      eglTerminate(egl_dpy);
-      XCloseDisplay(dpy);
-   }
-
-   return 0;
-}
-
-
-#else /* PTHREADS */
-
-
-#include <stdio.h>
-
-int
-main(int argc, char *argv[])
-{
-   printf("Sorry, this program wasn't compiled with PTHREADS defined.\n");
-   return 0;
-}
-
-
-#endif /* PTHREADS */