[PATCH weston v5 15/42] compositor-drm: Drop output from release_fb

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


We only need it for the GBM surface the FB was originally created
against; a mismatch here is very bad indeed, so no reason to pass it in
explictly every time rather than store it.

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

Differential Revision: https://phabricator.freedesktop.org/D1490
---
 libweston/compositor-drm.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 7ebf8f1..aaf871d 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -144,6 +144,7 @@ struct drm_fb {
 
 	/* Used by gbm fbs */
 	struct gbm_bo *bo;
+	struct gbm_surface *gbm_surface;
 
 	/* Used by dumb fbs */
 	void *map;
@@ -452,7 +453,7 @@ drm_fb_set_buffer(struct drm_fb *fb, struct weston_buffer *buffer)
 }
 
 static void
-drm_output_release_fb(struct drm_output *output, struct drm_fb *fb)
+drm_fb_unref(struct drm_fb *fb)
 {
 	if (!fb)
 		return;
@@ -465,7 +466,7 @@ drm_output_release_fb(struct drm_output *output, struct drm_fb *fb)
 		gbm_bo_destroy(fb->bo);
 		break;
 	case BUFFER_GBM_SURFACE:
-		gbm_surface_release_buffer(output->gbm_surface, fb->bo);
+		gbm_surface_release_buffer(fb->gbm_surface, fb->bo);
 		break;
 	default:
 		assert(NULL);
@@ -602,6 +603,7 @@ drm_output_render_gl(struct drm_output *output, pixman_region32_t *damage)
 		return;
 	}
 	output->next->type = BUFFER_GBM_SURFACE;
+	output->next->gbm_surface = output->gbm_surface;
 }
 
 static void
@@ -785,7 +787,7 @@ drm_output_repaint(struct weston_output *output_base,
 err_pageflip:
 	output->cursor_view = NULL;
 	if (output->next) {
-		drm_output_release_fb(output, output->next);
+		drm_fb_unref(output->next);
 		output->next = NULL;
 	}
 
@@ -887,7 +889,7 @@ vblank_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec,
 	drm_output_update_msc(output, frame);
 	output->vblank_pending = 0;
 
-	drm_output_release_fb(output, s->current);
+	drm_fb_unref(s->current);
 	s->current = s->next;
 	s->next = NULL;
 
@@ -917,7 +919,7 @@ page_flip_handler(int fd, unsigned int frame,
 	 * we just want to page flip to the current buffer to get an accurate
 	 * timestamp */
 	if (output->page_flip_pending) {
-		drm_output_release_fb(output, output->current);
+		drm_fb_unref(output->current);
 		output->current = output->next;
 		output->next = NULL;
 	}
@@ -1440,8 +1442,8 @@ drm_output_switch_mode(struct weston_output *output_base, struct weston_mode *mo
 		WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED;
 
 	/* reset rendering stuff. */
-	drm_output_release_fb(output, output->current);
-	drm_output_release_fb(output, output->next);
+	drm_fb_unref(output->current);
+	drm_fb_unref(output->next);
 	output->current = output->next = NULL;
 
 	if (b->use_pixman) {
@@ -2660,8 +2662,8 @@ destroy_sprites(struct drm_backend *backend)
 				sprite->plane_id,
 				output->crtc_id, 0, 0,
 				0, 0, 0, 0, 0, 0, 0, 0);
-		drm_output_release_fb(output, sprite->current);
-		drm_output_release_fb(output, sprite->next);
+		drm_fb_unref(sprite->current);
+		drm_fb_unref(sprite->next);
 		weston_plane_release(&sprite->plane);
 		free(sprite);
 	}
-- 
2.9.3



More information about the wayland-devel mailing list