Use FBOs instead of eagle-specific API
diff --git a/gears.c b/gears.c
index def1f99..9a8d503 100644
--- a/gears.c
+++ b/gears.c
@@ -32,6 +32,7 @@
 #include <glib.h>
 #include <cairo-drm.h>
 
+#define GL_GLEXT_PROTOTYPES
 #include <GL/gl.h>
 #include <eagle.h>
 
@@ -52,14 +53,13 @@
 	struct rectangle rectangle;
 
 	EGLDisplay display;
-	EGLConfig config;
-	EGLSurface surface;
 	EGLContext context;
 	int resized;
 	GLfloat angle;
 	cairo_surface_t *cairo_surface;
 
 	GLint gear_list[3];
+	GLuint fbo, color_rbo, depth_rbo;
 };
 
 struct gear_template {
@@ -258,19 +258,20 @@
 
 	window_draw(gears->window);
 
-	if (gears->surface != NULL)
-		eglDestroySurface(gears->display, gears->surface);
+	glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->color_rbo);
+	glRenderbufferStorage(GL_RENDERBUFFER_EXT,
+			      GL_RGBA,
+			      gears->rectangle.width,
+			      gears->rectangle.height);
 
-	gears->surface = eglCreateSurface(gears->display,
-					  gears->config,
-					  gears->rectangle.width,
-					  gears->rectangle.height,
-					  1, NULL);
-
-	eglMakeCurrent(gears->display,
-		       gears->surface, gears->surface, gears->context);
+	glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->depth_rbo);
+	glRenderbufferStorage(GL_RENDERBUFFER_EXT,
+			      GL_DEPTH_COMPONENT,
+			      gears->rectangle.width,
+			      gears->rectangle.height);
 
 	glViewport(0, 0, gears->rectangle.width, gears->rectangle.height);
+
 	gears->resized = 0;
 }
 
@@ -308,13 +309,12 @@
 {
 	struct gears *gears = data;
 
-	if (key != 0)
-		return;
+	if (key == 10) {
+		if (gears->resized)
+			resize_window(gears);
 
-	if (gears->resized)
-		resize_window(gears);
-
-	draw_gears(gears);
+		draw_gears(gears);
+	}
 }
 
 static void
@@ -322,14 +322,20 @@
 	     struct wl_compositor *compositor,
 	     uint32_t frame, uint32_t timestamp)
 {
-	struct gears *gears = data;
-	uint32_t name, handle, stride;
+  	struct gears *gears = data;
+	GLint name, stride;
 
-	eglGetColorBuffer(gears->surface, 0, &name, &handle, &stride);
+	glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->color_rbo);
+	glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT,
+				     GL_RENDERBUFFER_STRIDE_INTEL,
+				     &stride);
+	glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT,
+				     GL_RENDERBUFFER_NAME_INTEL,
+				     &name);
 	
 	window_copy(gears->window, &gears->rectangle, name, stride);
 
-	wl_compositor_commit(gears->compositor, 0);
+	window_commit(gears->window, 10);
 
 	gears->angle = (GLfloat) (timestamp % 8192) * 360 / 8192.0;
 }
@@ -339,19 +345,11 @@
 	handle_frame,
 };
 
-static const EGLint config_attribs[] = {
-	EGL_DEPTH_SIZE, 24,
-	EGL_CONFIG_CAVEAT, EGL_NONE,
-	EGL_RED_SIZE, 8,
-	EGL_NONE		
-};
-
 static struct gears *
 gears_create(struct display *display)
 {
 	const int x = 200, y = 200, width = 450, height = 500;
-	EGLint major, minor, count;
-	EGLConfig configs[64];
+	EGLint major, minor;
 	struct udev *udev;
 	struct udev_device *device;
 	struct gears *gears;
@@ -373,18 +371,29 @@
 	if (!eglInitialize(gears->display, &major, &minor))
 		die("failed to initialize display\n");
 
-	if (!eglGetConfigs(gears->display, configs, 64, &count))
-		die("failed to get configs\n");
-
-	if (!eglChooseConfig(gears->display, config_attribs, &gears->config, 1, NULL))
-		die("failed to pick a config\n");
-
-	gears->context = eglCreateContext(gears->display, gears->config, NULL, NULL);
+	gears->context = eglCreateContext(gears->display, NULL, NULL, NULL);
 	if (gears->context == NULL)
 		die("failed to create context\n");
 
-	resize_window(gears);
+	if (!eglMakeCurrent(gears->display, NULL, NULL, gears->context))
+		die("faile to make context current\n");
 
+	glGenFramebuffers(1, &gears->fbo);
+	glBindFramebuffer(GL_FRAMEBUFFER_EXT, gears->fbo);
+
+	glGenRenderbuffers(1, &gears->color_rbo);
+	glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->color_rbo);
+	glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT,
+				  GL_COLOR_ATTACHMENT0_EXT,
+				  GL_RENDERBUFFER_EXT,
+				  gears->color_rbo);
+
+	glGenRenderbuffers(1, &gears->depth_rbo);
+	glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->depth_rbo);
+	glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT,
+				  GL_DEPTH_ATTACHMENT_EXT,
+				  GL_RENDERBUFFER_EXT,
+				  gears->depth_rbo);
 	for (i = 0; i < 3; i++) {
 		gears->gear_list[i] = glGenLists(1);
 		glNewList(gears->gear_list[i], GL_COMPILE);
@@ -406,10 +415,13 @@
 	glEnable(GL_DEPTH_TEST);
 	glClearColor(0, 0, 0, 0.92);
 
+	if (glCheckFramebufferStatus (GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE)
+		fprintf(stderr, "framebuffer incomplete\n");
+
 	gears->compositor = display_get_compositor(display);
 
+	resize_window(gears);
 	draw_gears(gears);
-
 	handle_frame(gears, gears->compositor, 0, 0);
 
 	window_set_resize_handler(gears->window, resize_handler, gears);