Use FBOs instead of eagle-specific API
diff --git a/wayland-system-compositor.c b/wayland-system-compositor.c
index 74b7f0a..851398c 100644
--- a/wayland-system-compositor.c
+++ b/wayland-system-compositor.c
@@ -69,13 +69,13 @@
 	struct wl_list link;
 	struct wlsc_compositor *compositor;
 	struct wlsc_surface *background;
-	EGLSurface surface;
 	int32_t x, y, width, height;
 
 	drmModeModeInfo mode;
 	uint32_t crtc_id;
 	uint32_t connector_id;
 
+	GLuint rbo[2];
 	uint32_t fb_id[2];
 	uint32_t current;	
 };
@@ -102,7 +102,7 @@
 
 	EGLDisplay display;
 	EGLContext context;
-	EGLConfig config;
+	GLuint fbo;
 	struct wl_display *wl_display;
 
 	struct wl_list output_list;
@@ -610,16 +610,11 @@
 	double s = 3000;
 	int fd;
 
-	if (!eglMakeCurrent(ec->display, output->surface, output->surface, ec->context)) {
-		fprintf(stderr, "failed to make context current\n");
-		return;
-	}
-
 	glViewport(0, 0, output->width, output->height);
 	glMatrixMode(GL_PROJECTION);
 	glLoadIdentity();
 	glFrustum(-output->width / s, output->width / s,
-		  output->height / s, -output->height / s, 1, 2 * s);
+		  -output->height / s, output->height / s, 1, 2 * s);
 	glMatrixMode(GL_MODELVIEW);
 	glLoadIdentity();
 	glClearColor(0, 0, 0, 1);
@@ -650,7 +645,11 @@
 
 	fd = eglGetDisplayFD(ec->display);
 	output->current ^= 1;
-	eglBindColorBuffer(ec->display, output->surface, output->current);
+
+	glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT,
+				  GL_COLOR_ATTACHMENT0_EXT,
+				  GL_RENDERBUFFER_EXT,
+				  output->rbo[output->current]);
 	drmModePageFlip(fd, output->crtc_id,
 			output->fb_id[output->current ^ 1],
 			DRM_MODE_PAGE_FLIP_EVENT, output);
@@ -737,8 +736,8 @@
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTextureExternalMESA(GL_TEXTURE_2D, GL_RGBA, 4,
-			      width, height, stride / 4, name);
+	glTextureExternalINTEL(GL_TEXTURE_2D, GL_RGBA, 4,
+			       width, height, stride / 4, name);
 	
 }
 
@@ -762,36 +761,6 @@
 	     uint32_t name, uint32_t stride,
 	     int32_t x, int32_t y, int32_t width, int32_t height)
 {
-	struct wlsc_surface *es = (struct wlsc_surface *) surface;
-	GLuint fbo[2], rb;
-
-	glGenFramebuffers(2, fbo);
-
-	glBindFramebuffer(GL_READ_FRAMEBUFFER_EXT, fbo[1]);
-	glGenRenderbuffers(1, &rb);
-	glBindRenderbuffer(GL_RENDERBUFFER_EXT, rb);
-	glRenderbufferExternalMESA(GL_RENDERBUFFER_EXT,
-				   GL_RGBA,
-				   es->width, es->height,
-				   stride / 4, name);
-	glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER_EXT,
-				  GL_COLOR_ATTACHMENT0_EXT,
-				  GL_RENDERBUFFER_EXT,
-				  rb);
-
-	glBindFramebuffer(GL_DRAW_FRAMEBUFFER_EXT, fbo[0]);
-	glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER_EXT,
-			       GL_COLOR_ATTACHMENT0_EXT,
-			       GL_TEXTURE_2D, es->texture, 0);
-	
-	glBlitFramebuffer(x, y, x + width, y + height,
-			  dst_x, dst_y, dst_x+ width, dst_y + height,
-			  GL_COLOR_BUFFER_BIT, GL_NEAREST);
-
-	glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
-	glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
-	glDeleteRenderbuffers(1, &rb);
-	glDeleteFramebuffers(2, fbo);
 }
 
 static void
@@ -1138,14 +1107,6 @@
 static int
 init_egl(struct wlsc_compositor *ec, struct udev_device *device)
 {
-	static const EGLint config_attribs[] = {
-		EGL_DEPTH_SIZE,		0,
-		EGL_STENCIL_SIZE,	0,
-		EGL_CONFIG_CAVEAT,	EGL_NONE,
-		EGL_RED_SIZE,		8,
-		EGL_NONE		
-	};
-
 	struct wl_event_loop *loop;
 	EGLint major, minor;
 	int fd;
@@ -1161,15 +1122,20 @@
 		return -1;
 	}
 
-	if (!eglChooseConfig(ec->display, config_attribs, &ec->config, 1, NULL))
-		return -1;
-
-	ec->context = eglCreateContext(ec->display, ec->config, NULL, NULL);
+	ec->context = eglCreateContext(ec->display, NULL, NULL, NULL);
 	if (ec->context == NULL) {
 		fprintf(stderr, "failed to create context\n");
 		return -1;
 	}
 
+	if (!eglMakeCurrent(ec->display, EGL_NO_SURFACE, EGL_NO_SURFACE, ec->context)) {
+		fprintf(stderr, "failed to make context current\n");
+		return -1;
+	}
+
+	glGenFramebuffers(1, &ec->fbo);
+	glBindFramebuffer(GL_FRAMEBUFFER_EXT, ec->fbo);
+
 	loop = wl_display_get_event_loop(ec->wl_display);
 	fd = eglGetDisplayFD(ec->display);
 	ec->drm_source =
@@ -1197,7 +1163,7 @@
 	struct wlsc_output *output;
 	drmModeEncoder *encoder;
 	drmModeModeInfo *mode;
-	uint32_t name, handle, stride;
+	GLint handle, stride;
 	int i, ret, fd;
 
 	fd = eglGetDisplayFD(ec->display);
@@ -1243,21 +1209,21 @@
 
 	drmModeFreeEncoder(encoder);
 
-	output->surface = eglCreateSurface(ec->display,
-					   ec->config,
-					   output->width,
-					   output->height,
-					   2, NULL);
-	if (output->surface == NULL) {
-		fprintf(stderr, "failed to create surface\n");
-		return -1;
-	}
-
+	glGenRenderbuffers(2, output->rbo);
 	for (i = 0; i < 2; i++) {
-		eglGetColorBuffer(output->surface,
-				  i, &name, &handle, &stride);
+		glBindRenderbuffer(GL_RENDERBUFFER_EXT, output->rbo[i]);
+		glRenderbufferStorage(GL_RENDERBUFFER_EXT,
+				      GL_RGBA,
+				      output->width,
+				      output->height);
+		glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT,
+					     GL_RENDERBUFFER_STRIDE_INTEL,
+					     &stride);
+		glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT,
+					     GL_RENDERBUFFER_HANDLE_INTEL,
+					     &handle);
 
-		ret = drmModeAddFB(fd, mode->hdisplay, mode->vdisplay,
+		ret = drmModeAddFB(fd, output->width, output->height,
 				   32, 32, stride, handle, &output->fb_id[i]);
 		if (ret) {
 			fprintf(stderr, "failed to add fb %d: %m\n", i);
@@ -1266,6 +1232,10 @@
 	}
 
 	output->current = 0;
+	glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT,
+				  GL_COLOR_ATTACHMENT0_EXT,
+				  GL_RENDERBUFFER_EXT,
+				  output->rbo[output->current]);
 	ret = drmModeSetCrtc(fd, output->crtc_id,
 			     output->fb_id[output->current ^ 1], 0, 0,
 			     &output->connector_id, 1, &output->mode);
@@ -1279,11 +1249,6 @@
 	wl_display_add_global(ec->wl_display, &output->base, post_output_geometry);
 	wl_list_insert(ec->output_list.prev, &output->link);
 
-	if (!eglMakeCurrent(ec->display, output->surface, output->surface, ec->context)) {
-		fprintf(stderr, "failed to make context current\n");
-		return -1;
-	}
-
 	output->background = background_create(output, option_background);
 
 	return 0;