compositor: Let renderers create and destroy surface state on their own

Remove create_surface() and destroy_surface() from the renderer
interface and change the renderers to create surface state on demand
and destroy it using the weston_surface's destroy signal.

Also make sure the surfaces' renderer state is reset to NULL on
destruction.

This is a step towards runtime switchable renderers.

(rpi-renderer changes are only compile-tested)
diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c
index 0d85e07..98a910c 100644
--- a/src/pixman-renderer.c
+++ b/src/pixman-renderer.c
@@ -37,8 +37,12 @@
 };
 
 struct pixman_surface_state {
+	struct weston_surface *surface;
+
 	pixman_image_t *image;
 	struct weston_buffer_reference buffer_ref;
+
+	struct wl_listener surface_destroy_listener;
 };
 
 struct pixman_renderer {
@@ -55,9 +59,15 @@
 	return (struct pixman_output_state *)output->renderer_state;
 }
 
+static int
+pixman_renderer_create_surface(struct weston_surface *surface);
+
 static inline struct pixman_surface_state *
 get_surface_state(struct weston_surface *surface)
 {
+	if (!surface->renderer_state)
+		pixman_renderer_create_surface(surface);
+
 	return (struct pixman_surface_state *)surface->renderer_state;
 }
 
@@ -582,6 +592,24 @@
 		wl_shm_buffer_get_stride(shm_buffer));
 }
 
+static void
+surface_state_handle_surface_destroy(struct wl_listener *listener, void *data)
+{
+	struct pixman_surface_state *ps;
+
+	ps = container_of(listener, struct pixman_surface_state,
+			  surface_destroy_listener);
+
+	ps->surface->renderer_state = NULL;
+
+	if (ps->image) {
+		pixman_image_unref(ps->image);
+		ps->image = NULL;
+	}
+	weston_buffer_reference(&ps->buffer_ref, NULL);
+	free(ps);
+}
+
 static int
 pixman_renderer_create_surface(struct weston_surface *surface)
 {
@@ -593,6 +621,13 @@
 
 	surface->renderer_state = ps;
 
+	ps->surface = surface;
+
+	ps->surface_destroy_listener.notify =
+		surface_state_handle_surface_destroy;
+	wl_signal_add(&surface->destroy_signal,
+		      &ps->surface_destroy_listener);
+
 	return 0;
 }
 
@@ -617,19 +652,6 @@
 }
 
 static void
-pixman_renderer_destroy_surface(struct weston_surface *surface)
-{
-	struct pixman_surface_state *ps = get_surface_state(surface);
-
-	if (ps->image) {
-		pixman_image_unref(ps->image);
-		ps->image = NULL;
-	}
-	weston_buffer_reference(&ps->buffer_ref, NULL);
-	free(ps);
-}
-
-static void
 pixman_renderer_destroy(struct weston_compositor *ec)
 {
 	struct pixman_renderer *pr = get_renderer(ec);
@@ -676,9 +698,7 @@
 	renderer->base.repaint_output = pixman_renderer_repaint_output;
 	renderer->base.flush_damage = pixman_renderer_flush_damage;
 	renderer->base.attach = pixman_renderer_attach;
-	renderer->base.create_surface = pixman_renderer_create_surface;
 	renderer->base.surface_set_color = pixman_renderer_surface_set_color;
-	renderer->base.destroy_surface = pixman_renderer_destroy_surface;
 	renderer->base.destroy = pixman_renderer_destroy;
 	ec->renderer = &renderer->base;
 	ec->capabilities |= WESTON_CAP_ROTATION_ANY;