compositor: Do the per surface clip region math in weston_surface_draw()
diff --git a/src/compositor.c b/src/compositor.c
index 71f71f8..ef96bbc 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -555,8 +555,7 @@
 }
 
 static void
-weston_surface_draw(struct weston_surface *es,
-		  struct weston_output *output, pixman_region32_t *clip)
+weston_surface_draw(struct weston_surface *es, struct weston_output *output)
 {
 	struct weston_compositor *ec = es->compositor;
 	GLfloat *v;
@@ -566,7 +565,9 @@
 
 	pixman_region32_init_rect(&repaint,
 				  es->x, es->y, es->width, es->height);
-	pixman_region32_intersect(&repaint, &repaint, clip);
+	pixman_region32_intersect(&repaint, &repaint, &output->region);
+	pixman_region32_intersect(&repaint, &repaint, &es->damage);
+
 	if (!pixman_region32_not_empty(&repaint))
 		return;
 
@@ -699,6 +700,8 @@
 	surface.texture = GL_NONE;
 	surface.transform = NULL;
 	surface.alpha = compositor->current_alpha;
+	pixman_region32_init(&surface.damage);
+	pixman_region32_copy(&surface.damage, region);
 
 	if (tint <= 1.0)
 		surface.visual = WESTON_ARGB_VISUAL;
@@ -709,7 +712,9 @@
 	glUniformMatrix4fv(compositor->solid_shader.proj_uniform,
 			   1, GL_FALSE, output->matrix.d);
 	glUniform4fv(compositor->solid_shader.color_uniform, 1, color);
-	weston_surface_draw(&surface, output, region);
+	weston_surface_draw(&surface, output);
+
+	pixman_region32_fini(&surface.damage);
 }
 
 static void
@@ -784,7 +789,7 @@
 {
 	struct weston_compositor *ec = output->compositor;
 	struct weston_surface *es;
-	pixman_region32_t opaque, new_damage, total_damage, repaint;
+	pixman_region32_t opaque, new_damage, total_damage;
 
 	output->prepare_render(output);
 
@@ -832,17 +837,10 @@
 		if (es->width < output->current->width ||
 		    es->height < output->current->height)
 			glClear(GL_COLOR_BUFFER_BIT);
-		weston_surface_draw(es, output, &total_damage);
+		weston_surface_draw(es, output);
 	} else {
-		wl_list_for_each_reverse(es, &ec->surface_list, link) {
-			pixman_region32_init(&repaint);
-			pixman_region32_intersect(&repaint, &output->region,
-						  &es->damage);
-			weston_surface_draw(es, output, &repaint);
-			pixman_region32_subtract(&es->damage,
-						 &es->damage, &output->region);
-			pixman_region32_fini(&repaint);
-		}
+		wl_list_for_each_reverse(es, &ec->surface_list, link)
+			weston_surface_draw(es, output);
 	}
 
 	if (ec->fade.spring.current > 0.001)