Switch to using mesa EGL
diff --git a/gears.c b/gears.c
index 9a8d503..ff385a2 100644
--- a/gears.c
+++ b/gears.c
@@ -33,8 +33,10 @@
 #include <cairo-drm.h>
 
 #define GL_GLEXT_PROTOTYPES
+#define EGL_EGLEXT_PROTOTYPES
 #include <GL/gl.h>
-#include <eagle.h>
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
 
 #include "wayland-util.h"
 #include "wayland-client.h"
@@ -54,6 +56,8 @@
 
 	EGLDisplay display;
 	EGLContext context;
+	EGLImageKHR image;
+	int drm_fd;
 	int resized;
 	GLfloat angle;
 	cairo_surface_t *cairo_surface;
@@ -244,6 +248,15 @@
 static void
 resize_window(struct gears *gears)
 {
+	EGLint attribs[] = {
+		EGL_IMAGE_WIDTH_INTEL,	0,
+		EGL_IMAGE_HEIGHT_INTEL,	0,
+		EGL_IMAGE_FORMAT_INTEL,	EGL_FORMAT_RGBA_8888_KHR,
+		EGL_IMAGE_USE_INTEL,	EGL_IMAGE_USE_SHARE_INTEL |
+					EGL_IMAGE_USE_SCANOUT_INTEL,
+		EGL_NONE
+	};
+
 	/* Constrain child size to be square and at least 300x300 */
 	window_get_child_rectangle(gears->window, &gears->rectangle);
 	if (gears->rectangle.width > gears->rectangle.height)
@@ -258,11 +271,16 @@
 
 	window_draw(gears->window);
 
+	if (gears->image)
+		eglDestroyImageKHR(gears->display, gears->image);
+	attribs[1] = gears->rectangle.width;
+	attribs[1] = gears->rectangle.height;
+	gears->image = eglCreateImageKHR(gears->display, gears->context,
+					 EGL_SYSTEM_IMAGE_INTEL,
+					 NULL, attribs);
+
 	glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->color_rbo);
-	glRenderbufferStorage(GL_RENDERBUFFER_EXT,
-			      GL_RGBA,
-			      gears->rectangle.width,
-			      gears->rectangle.height);
+	glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, gears->image);
 
 	glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->depth_rbo);
 	glRenderbufferStorage(GL_RENDERBUFFER_EXT,
@@ -323,15 +341,10 @@
 	     uint32_t frame, uint32_t timestamp)
 {
   	struct gears *gears = data;
-	GLint name, stride;
+	EGLint 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);
+	eglShareImageINTEL(gears->display, gears->context,
+			   gears->image, 0, &name, &handle, &stride);
 	
 	window_copy(gears->window, &gears->rectangle, name, stride);
 
@@ -346,25 +359,24 @@
 };
 
 static struct gears *
-gears_create(struct display *display)
+gears_create(struct display *display, int drm_fd)
 {
 	const int x = 200, y = 200, width = 450, height = 500;
 	EGLint major, minor;
-	struct udev *udev;
-	struct udev_device *device;
+	EGLDisplayTypeDRMMESA drm_display;
 	struct gears *gears;
 	int i;
 
-	udev = udev_new();
-	device = udev_device_new_from_syspath(udev, "/sys/class/drm/card0");
-
 	gears = malloc(sizeof *gears);
 	memset(gears, 0, sizeof *gears);
 	gears->d = display;
 	gears->window = window_create(display, "Wayland Gears",
 				      x, y, width, height);
 
-	gears->display = eglCreateDisplayNative(device);
+	drm_display.type = EGL_DISPLAY_TYPE_DRM_MESA;
+	drm_display.device = NULL;
+	drm_display.fd = drm_fd;
+	gears->display = eglGetDisplay((EGLNativeDisplayType) &drm_display);
 	if (gears->display == NULL)
 		die("failed to create egl display\n");
 
@@ -460,7 +472,7 @@
 	source = wl_glib_source_new(display);
 	g_source_attach(source, NULL);
 
-	gears = gears_create(d);
+	gears = gears_create(d, fd);
 
 	g_main_loop_run(loop);