[PATCH weston 15/21] compositor-fbdev: simplify FB destroy/unmap/disable

Pekka Paalanen ppaalanen at gmail.com
Fri Sep 22 14:31:23 UTC 2017


From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

Rename fbdev_frame_buffer_destroy() to fbdev_frame_buffer_unmap()
because that is what it does. Adding the destruction of hw_surface in it
makes it the perfect counterpart to fbdev_frame_buffer_map() which
simplifies the code.

fbdev_frame_buffer_map() can no longer call that, so just open-code the
munmap() there. It is an error path, we don't really care about
failures in an error path.

The error path of fbdev_output_enable() is converted to call
buffer_unmap() since that is exactly what it did.

fbdev_output_disable() became redundant, being identical to
fbdev_frame_buffer_unmap().

Invariant: output->hw_surface cannot be non-NULL without output->fb
being non-NULL. hw_surface wraps the mmapped memory so cannot exist
without the mmap.

Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
---
 libweston/compositor-fbdev.c | 52 ++++++++++++++++++--------------------------
 1 file changed, 21 insertions(+), 31 deletions(-)

diff --git a/libweston/compositor-fbdev.c b/libweston/compositor-fbdev.c
index 402648d0..22100f98 100644
--- a/libweston/compositor-fbdev.c
+++ b/libweston/compositor-fbdev.c
@@ -40,6 +40,7 @@
 #include <unistd.h>
 #include <linux/fb.h>
 #include <linux/input.h>
+#include <assert.h>
 
 #include <libudev.h>
 
@@ -335,8 +336,6 @@ fbdev_set_screen_info(int fd, struct fbdev_screeninfo *info)
 	return 1;
 }
 
-static void fbdev_frame_buffer_destroy(struct fbdev_output *output);
-
 /* Returns an FD for the frame buffer device. */
 static int
 fbdev_frame_buffer_open(const char *fb_dev,
@@ -401,8 +400,10 @@ fbdev_frame_buffer_map(struct fbdev_output *output, int fd)
 	retval = 0;
 
 out_unmap:
-	if (retval != 0 && output->fb != NULL)
-		fbdev_frame_buffer_destroy(output);
+	if (retval != 0 && output->fb != NULL) {
+		munmap(output->fb, output->fb_info.buffer_length);
+		output->fb = NULL;
+	}
 
 out_close:
 	if (fd >= 0)
@@ -412,9 +413,18 @@ out_close:
 }
 
 static void
-fbdev_frame_buffer_destroy(struct fbdev_output *output)
+fbdev_frame_buffer_unmap(struct fbdev_output *output)
 {
-	weston_log("Destroying fbdev frame buffer.\n");
+	if (!output->fb) {
+		assert(!output->hw_surface);
+		return;
+	}
+
+	weston_log("Unmapping fbdev frame buffer.\n");
+
+	if (output->hw_surface)
+		pixman_image_unref(output->hw_surface);
+	output->hw_surface = NULL;
 
 	if (munmap(output->fb, output->fb_info.buffer_length) < 0)
 		weston_log("Failed to munmap frame buffer: %s\n",
@@ -424,7 +434,6 @@ fbdev_frame_buffer_destroy(struct fbdev_output *output)
 }
 
 static void fbdev_output_destroy(struct weston_output *base);
-static void fbdev_output_disable(struct weston_output *base);
 
 static int
 fbdev_output_enable(struct weston_output *base)
@@ -464,9 +473,7 @@ fbdev_output_enable(struct weston_output *base)
 	return 0;
 
 out_hw_surface:
-	pixman_image_unref(output->hw_surface);
-	output->hw_surface = NULL;
-	fbdev_frame_buffer_destroy(output);
+	fbdev_frame_buffer_unmap(output);
 
 	return -1;
 }
@@ -474,11 +481,12 @@ out_hw_surface:
 static int
 fbdev_output_disable_handler(struct weston_output *base)
 {
+	struct fbdev_output *output = to_fbdev_output(base);
+
 	if (!base->enabled)
 		return 0;
 
-	/* Close the frame buffer. */
-	fbdev_output_disable(base);
+	fbdev_frame_buffer_unmap(output);
 
 	if (base->renderer_state != NULL)
 		pixman_renderer_output_destroy(base);
@@ -629,24 +637,6 @@ err:
 	return -1;
 }
 
-/* NOTE: This leaves output->fb_info populated, caching data so that if
- * fbdev_output_reenable() is called again, it can determine whether a mode-set
- * is needed. */
-static void
-fbdev_output_disable(struct weston_output *base)
-{
-	struct fbdev_output *output = to_fbdev_output(base);
-
-	weston_log("Disabling fbdev output.\n");
-
-	if (output->hw_surface != NULL) {
-		pixman_image_unref(output->hw_surface);
-		output->hw_surface = NULL;
-	}
-
-	fbdev_frame_buffer_destroy(output);
-}
-
 static void
 fbdev_backend_destroy(struct weston_compositor *base)
 {
@@ -686,7 +676,7 @@ session_notify(struct wl_listener *listener, void *data)
 		udev_input_disable(&backend->input);
 
 		wl_list_for_each(output, &compositor->output_list, link) {
-			fbdev_output_disable(output);
+			fbdev_frame_buffer_unmap(to_fbdev_output(output));
 		}
 
 		backend->prev_state = compositor->state;
-- 
2.13.5



More information about the wayland-devel mailing list