compositor: Move EGL/GLES2 parts of weston_surface_attach to gles2-renderer.c
diff --git a/src/compositor.c b/src/compositor.c
index 70445ec..dfef058 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -727,137 +727,35 @@
 }
 
 static void
-ensure_textures(struct weston_surface *es, int num_textures)
-{
-	int i;
-
-	if (num_textures <= es->num_textures)
-		return;
-
-	for (i = es->num_textures; i < num_textures; i++) {
-		glGenTextures(1, &es->textures[i]);
-		glBindTexture(es->target, es->textures[i]);
-		glTexParameteri(es->target,
-				GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-		glTexParameteri(es->target,
-				GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-	}
-	es->num_textures = num_textures;
-	glBindTexture(es->target, 0);
-}
-
-static void
 weston_surface_attach(struct wl_surface *surface, struct wl_buffer *buffer)
 {
 	struct weston_surface *es = (struct weston_surface *) surface;
-	struct weston_compositor *ec = es->compositor;
-	EGLint attribs[3], format;
-	int i, num_planes;
 
 	if (es->buffer) {
 		weston_buffer_post_release(es->buffer);
 		wl_list_remove(&es->buffer_destroy_listener.link);
 	}
 
-	es->buffer = buffer;
+	if (buffer) {
+		buffer->busy_count++;
+		wl_signal_add(&buffer->resource.destroy_signal, 
+			      &es->buffer_destroy_listener);
 
-	if (!buffer) {
+		if (es->geometry.width != buffer->width ||
+		    es->geometry.height != buffer->height) {
+			undef_region(&es->input);
+			pixman_region32_fini(&es->opaque);
+			pixman_region32_init(&es->opaque);
+		}
+	} else {
 		if (weston_surface_is_mapped(es))
 			weston_surface_unmap(es);
-		for (i = 0; i < es->num_images; i++) {
-			ec->destroy_image(ec->egl_display, es->images[i]);
-			es->images[i] = NULL;
-		}
-		es->num_images = 0;
-		glDeleteTextures(es->num_textures, es->textures);
-		es->num_textures = 0;
-		return;
 	}
 
-	buffer->busy_count++;
-	wl_signal_add(&es->buffer->resource.destroy_signal,
-		      &es->buffer_destroy_listener);
-
-	if (es->geometry.width != buffer->width ||
-	    es->geometry.height != buffer->height) {
-		undef_region(&es->input);
-		pixman_region32_fini(&es->opaque);
-		pixman_region32_init(&es->opaque);
-	}
-
-	if (wl_buffer_is_shm(buffer)) {
-		es->pitch = wl_shm_buffer_get_stride(buffer) / 4;
-		es->target = GL_TEXTURE_2D;
-
-		ensure_textures(es, 1);
-		glBindTexture(GL_TEXTURE_2D, es->textures[0]);
-		glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
-			     es->pitch, es->buffer->height, 0,
-			     GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL);
-		if (wl_shm_buffer_get_format(buffer) == WL_SHM_FORMAT_XRGB8888)
-			es->shader = &ec->texture_shader_rgbx;
-		else
-			es->shader = &ec->texture_shader_rgba;
-	} else if (ec->query_buffer(ec->egl_display, buffer,
-				    EGL_TEXTURE_FORMAT, &format)) {
-		for (i = 0; i < es->num_images; i++)
-			ec->destroy_image(ec->egl_display, es->images[i]);
-		es->num_images = 0;
-		es->target = GL_TEXTURE_2D;
-		switch (format) {
-		case EGL_TEXTURE_RGB:
-		case EGL_TEXTURE_RGBA:
-		default:
-			num_planes = 1;
-			es->shader = &ec->texture_shader_rgba;
-			break;
-		case EGL_TEXTURE_EXTERNAL_WL:
-			num_planes = 1;
-			es->target = GL_TEXTURE_EXTERNAL_OES;
-			es->shader = &ec->texture_shader_egl_external;
-			break;
-		case EGL_TEXTURE_Y_UV_WL:
-			num_planes = 2;
-			es->shader = &ec->texture_shader_y_uv;
-			break;
-		case EGL_TEXTURE_Y_U_V_WL:
-			num_planes = 3;
-			es->shader = &ec->texture_shader_y_u_v;
-			break;
-		case EGL_TEXTURE_Y_XUXV_WL:
-			num_planes = 2;
-			es->shader = &ec->texture_shader_y_xuxv;
-			break;
-		}
-
-		ensure_textures(es, num_planes);
-		for (i = 0; i < num_planes; i++) {
-			attribs[0] = EGL_WAYLAND_PLANE_WL;
-			attribs[1] = i;
-			attribs[2] = EGL_NONE;
-			es->images[i] = ec->create_image(ec->egl_display,
-							 NULL,
-							 EGL_WAYLAND_BUFFER_WL,
-							 buffer, attribs);
-			if (!es->images[i]) {
-				weston_log("failed to create img for plane %d\n", i);
-				continue;
-			}
-			es->num_images++;
-
-			glActiveTexture(GL_TEXTURE0 + i);
-			glBindTexture(es->target, es->textures[i]);
-			ec->image_target_texture_2d(es->target,
-						    es->images[i]);
-		}
-
-		es->pitch = buffer->width;
-	} else {
-		weston_log("unhandled buffer type!\n");
-	}
+	gles2_renderer_attach(es, buffer);
+	es->buffer = buffer;
 }
 
-
 WL_EXPORT void
 weston_surface_restack(struct weston_surface *surface, struct wl_list *below)
 {
diff --git a/src/compositor.h b/src/compositor.h
index d80b5b4..37e2d22 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -799,5 +799,7 @@
 			      pixman_region32_t *output_damage);
 void
 gles2_renderer_flush_damage(struct weston_surface *surface);
+void
+gles2_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer);
 
 #endif
diff --git a/src/gles2-renderer.c b/src/gles2-renderer.c
index f2a0461..883c5ca 100644
--- a/src/gles2-renderer.c
+++ b/src/gles2-renderer.c
@@ -711,6 +711,116 @@
 #endif
 }
 
+static void
+ensure_textures(struct weston_surface *es, int num_textures)
+{
+	int i;
+
+	if (num_textures <= es->num_textures)
+		return;
+
+	for (i = es->num_textures; i < num_textures; i++) {
+		glGenTextures(1, &es->textures[i]);
+		glBindTexture(es->target, es->textures[i]);
+		glTexParameteri(es->target,
+				GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+		glTexParameteri(es->target,
+				GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+	}
+	es->num_textures = num_textures;
+	glBindTexture(es->target, 0);
+}
+
+WL_EXPORT void
+gles2_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer)
+{
+	struct weston_compositor *ec = es->compositor;
+	EGLint attribs[3], format;
+	int i, num_planes;
+
+	if (!buffer) {
+		for (i = 0; i < es->num_images; i++) {
+			ec->destroy_image(ec->egl_display, es->images[i]);
+			es->images[i] = NULL;
+		}
+		es->num_images = 0;
+		glDeleteTextures(es->num_textures, es->textures);
+		es->num_textures = 0;
+		return;
+	}
+
+	if (wl_buffer_is_shm(buffer)) {
+		es->pitch = wl_shm_buffer_get_stride(buffer) / 4;
+		es->target = GL_TEXTURE_2D;
+
+		ensure_textures(es, 1);
+		glBindTexture(GL_TEXTURE_2D, es->textures[0]);
+		glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
+			     es->pitch, buffer->height, 0,
+			     GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL);
+		if (wl_shm_buffer_get_format(buffer) == WL_SHM_FORMAT_XRGB8888)
+			es->shader = &ec->texture_shader_rgbx;
+		else
+			es->shader = &ec->texture_shader_rgba;
+	} else if (ec->query_buffer(ec->egl_display, buffer,
+				    EGL_TEXTURE_FORMAT, &format)) {
+		for (i = 0; i < es->num_images; i++)
+			ec->destroy_image(ec->egl_display, es->images[i]);
+		es->num_images = 0;
+		es->target = GL_TEXTURE_2D;
+		switch (format) {
+		case EGL_TEXTURE_RGB:
+		case EGL_TEXTURE_RGBA:
+		default:
+			num_planes = 1;
+			es->shader = &ec->texture_shader_rgba;
+			break;
+		case EGL_TEXTURE_EXTERNAL_WL:
+			num_planes = 1;
+			es->target = GL_TEXTURE_EXTERNAL_OES;
+			es->shader = &ec->texture_shader_egl_external;
+			break;
+		case EGL_TEXTURE_Y_UV_WL:
+			num_planes = 2;
+			es->shader = &ec->texture_shader_y_uv;
+			break;
+		case EGL_TEXTURE_Y_U_V_WL:
+			num_planes = 3;
+			es->shader = &ec->texture_shader_y_u_v;
+			break;
+		case EGL_TEXTURE_Y_XUXV_WL:
+			num_planes = 2;
+			es->shader = &ec->texture_shader_y_xuxv;
+			break;
+		}
+
+		ensure_textures(es, num_planes);
+		for (i = 0; i < num_planes; i++) {
+			attribs[0] = EGL_WAYLAND_PLANE_WL;
+			attribs[1] = i;
+			attribs[2] = EGL_NONE;
+			es->images[i] = ec->create_image(ec->egl_display,
+							 NULL,
+							 EGL_WAYLAND_BUFFER_WL,
+							 buffer, attribs);
+			if (!es->images[i]) {
+				weston_log("failed to create img for plane %d\n", i);
+				continue;
+			}
+			es->num_images++;
+
+			glActiveTexture(GL_TEXTURE0 + i);
+			glBindTexture(es->target, es->textures[i]);
+			ec->image_target_texture_2d(es->target,
+						    es->images[i]);
+		}
+
+		es->pitch = buffer->width;
+	} else {
+		weston_log("unhandled buffer type!\n");
+	}
+}
+
 static const char vertex_shader[] =
 	"uniform mat4 proj;\n"
 	"attribute vec2 position;\n"