[PATCH weston v5 13/42] compositor-drm: Add explicit type member to drm_fb

Daniel Stone daniels at collabora.com
Wed Nov 16 14:25:05 UTC 2016


Rather than magically trying to infer what the buffer is and what we
should do with it when we go to destroy it, add an explicit type
instead.

Signed-off-by: Daniel Stone <daniels at collabora.com>

Differential Revision: https://phabricator.freedesktop.org/D1488
---
 libweston/compositor-drm.c | 39 ++++++++++++++++++++++++++-------------
 1 file changed, 26 insertions(+), 13 deletions(-)

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 4ef7343..5b4c28d 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -130,10 +130,16 @@ struct drm_mode {
 };
 
 struct drm_fb {
+	enum {
+		BUFFER_INVALID = 0, /**< never used */
+		BUFFER_CLIENT, /**< directly sourced from client */
+		BUFFER_PIXMAN_DUMB, /**< internal Pixman rendering */
+		BUFFER_GBM_SURFACE, /**< internal EGL rendering */
+	} type;
+
 	uint32_t fb_id, stride, handle, size;
 	int width, height;
 	int fd;
-	int is_client_buffer;
 	struct weston_buffer_reference buffer_ref;
 
 	/* Used by gbm fbs */
@@ -290,6 +296,7 @@ drm_fb_create_dumb(struct drm_backend *b, int width, int height,
 	if (ret)
 		goto err_fb;
 
+	fb->type = BUFFER_PIXMAN_DUMB;
 	fb->handle = create_arg.handle;
 	fb->stride = create_arg.pitch;
 	fb->size = create_arg.size;
@@ -352,6 +359,8 @@ drm_fb_destroy_dumb(struct drm_fb *fb)
 {
 	struct drm_mode_destroy_dumb destroy_arg;
 
+	assert(fb->type == BUFFER_PIXMAN_DUMB);
+
 	if (!fb->map)
 		return;
 
@@ -440,9 +449,6 @@ static void
 drm_fb_set_buffer(struct drm_fb *fb, struct weston_buffer *buffer)
 {
 	assert(fb->buffer_ref.buffer == NULL);
-
-	fb->is_client_buffer = 1;
-
 	weston_buffer_reference(&fb->buffer_ref, buffer);
 }
 
@@ -452,15 +458,19 @@ drm_output_release_fb(struct drm_output *output, struct drm_fb *fb)
 	if (!fb)
 		return;
 
-	if (fb->map &&
-            (fb != output->dumb[0] && fb != output->dumb[1])) {
-		drm_fb_destroy_dumb(fb);
-	} else if (fb->bo) {
-		if (fb->is_client_buffer)
-			gbm_bo_destroy(fb->bo);
-		else
-			gbm_surface_release_buffer(output->gbm_surface,
-						   fb->bo);
+	switch (fb->type) {
+	case BUFFER_PIXMAN_DUMB:
+		/* nothing: pixman buffers are destroyed manually */
+		break;
+	case BUFFER_CLIENT:
+		gbm_bo_destroy(fb->bo);
+		break;
+	case BUFFER_GBM_SURFACE:
+		gbm_surface_release_buffer(output->gbm_surface, fb->bo);
+		break;
+	default:
+		assert(NULL);
+		break;
 	}
 }
 
@@ -565,6 +575,7 @@ drm_output_prepare_scanout_view(struct drm_output *output,
 		return NULL;
 	}
 
+	output->next->type = BUFFER_CLIENT;
 	drm_fb_set_buffer(output->next, buffer);
 
 	return &output->fb_plane;
@@ -591,6 +602,7 @@ drm_output_render_gl(struct drm_output *output, pixman_region32_t *damage)
 		gbm_surface_release_buffer(output->gbm_surface, bo);
 		return;
 	}
+	output->next->type = BUFFER_GBM_SURFACE;
 }
 
 static void
@@ -1060,6 +1072,7 @@ drm_output_prepare_overlay_view(struct drm_output *output,
 		return NULL;
 	}
 
+	s->next->type = BUFFER_CLIENT;
 	drm_fb_set_buffer(s->next, ev->surface->buffer_ref.buffer);
 
 	box = pixman_region32_extents(&ev->transform.boundingbox);
-- 
2.9.3



More information about the wayland-devel mailing list