1*4882a593SmuzhiyunFrom cc29cd4d7e5cda2ee39456aed5fd92eca03e9cf5 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Mon, 7 Mar 2022 15:56:19 +0800
4*4882a593SmuzhiyunSubject: [PATCH 60/92] backend-drm: Support getting drm fb from dmabuf
5*4882a593Smuzhiyun directly
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunTry to import dmabuf to drm fb directly when GBM fd-import not working.
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
10*4882a593Smuzhiyun---
11*4882a593Smuzhiyun libweston/backend-drm/fb.c | 50 +++++++++++++++++++++++---------------
12*4882a593Smuzhiyun 1 file changed, 31 insertions(+), 19 deletions(-)
13*4882a593Smuzhiyun
14*4882a593Smuzhiyundiff --git a/libweston/backend-drm/fb.c b/libweston/backend-drm/fb.c
15*4882a593Smuzhiyunindex 8c4c49c..6dc098d 100644
16*4882a593Smuzhiyun--- a/libweston/backend-drm/fb.c
17*4882a593Smuzhiyun+++ b/libweston/backend-drm/fb.c
18*4882a593Smuzhiyun@@ -224,10 +224,18 @@ drm_fb_destroy_gbm(struct gbm_bo *bo, void *data)
19*4882a593Smuzhiyun static void
20*4882a593Smuzhiyun drm_fb_destroy_dmabuf(struct drm_fb *fb)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun-	/* We deliberately do not close the GEM handles here; GBM manages
23*4882a593Smuzhiyun-	 * their lifetime through the BO. */
24*4882a593Smuzhiyun-	if (fb->bo)
25*4882a593Smuzhiyun+	if (fb->bo) {
26*4882a593Smuzhiyun+		/* We deliberately do not close the GEM handles here; GBM manages
27*4882a593Smuzhiyun+		 * their lifetime through the BO. */
28*4882a593Smuzhiyun 		gbm_bo_destroy(fb->bo);
29*4882a593Smuzhiyun+	} else {
30*4882a593Smuzhiyun+		int i;
31*4882a593Smuzhiyun+		for (i = 0; i < fb->num_planes; i++) {
32*4882a593Smuzhiyun+			struct drm_gem_close arg = { fb->handles[i], };
33*4882a593Smuzhiyun+			drmIoctl(fb->fd, DRM_IOCTL_GEM_CLOSE, &arg);
34*4882a593Smuzhiyun+		}
35*4882a593Smuzhiyun+	}
36*4882a593Smuzhiyun+
37*4882a593Smuzhiyun 	drm_fb_destroy(fb);
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun@@ -294,13 +302,6 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun 	fb->bo = gbm_bo_import(backend->gbm, GBM_BO_IMPORT_FD_MODIFIER,
43*4882a593Smuzhiyun 			       &import_mod, GBM_BO_USE_SCANOUT);
44*4882a593Smuzhiyun-	if (!fb->bo) {
45*4882a593Smuzhiyun-		if (try_view_on_plane_failure_reasons)
46*4882a593Smuzhiyun-			*try_view_on_plane_failure_reasons |=
47*4882a593Smuzhiyun-				FAILURE_REASONS_GBM_BO_IMPORT_FAILED;
48*4882a593Smuzhiyun-		goto err_free;
49*4882a593Smuzhiyun-	}
50*4882a593Smuzhiyun-
51*4882a593Smuzhiyun 	fb->width = dmabuf->attributes.width;
52*4882a593Smuzhiyun 	fb->height = dmabuf->attributes.height;
53*4882a593Smuzhiyun 	fb->modifier = dmabuf->attributes.modifier[0];
54*4882a593Smuzhiyun@@ -329,16 +330,27 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
55*4882a593Smuzhiyun 	}
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun 	fb->num_planes = dmabuf->attributes.n_planes;
58*4882a593Smuzhiyun-	for (i = 0; i < dmabuf->attributes.n_planes; i++) {
59*4882a593Smuzhiyun-		union gbm_bo_handle handle;
60*4882a593Smuzhiyun-
61*4882a593Smuzhiyun-	        handle = gbm_bo_get_handle_for_plane(fb->bo, i);
62*4882a593Smuzhiyun-		if (handle.s32 == -1) {
63*4882a593Smuzhiyun-			*try_view_on_plane_failure_reasons |=
64*4882a593Smuzhiyun-				FAILURE_REASONS_GBM_BO_GET_HANDLE_FAILED;
65*4882a593Smuzhiyun-			goto err_free;
66*4882a593Smuzhiyun+	if (fb->bo) {
67*4882a593Smuzhiyun+		for (i = 0; i < fb->num_planes; i++) {
68*4882a593Smuzhiyun+			union gbm_bo_handle handle;
69*4882a593Smuzhiyun+
70*4882a593Smuzhiyun+		        handle = gbm_bo_get_handle_for_plane(fb->bo, i);
71*4882a593Smuzhiyun+			if (handle.s32 == -1) {
72*4882a593Smuzhiyun+				*try_view_on_plane_failure_reasons |=
73*4882a593Smuzhiyun+					FAILURE_REASONS_GBM_BO_GET_HANDLE_FAILED;
74*4882a593Smuzhiyun+				goto err_free;
75*4882a593Smuzhiyun+			}
76*4882a593Smuzhiyun+			fb->handles[i] = handle.u32;
77*4882a593Smuzhiyun+		}
78*4882a593Smuzhiyun+	} else {
79*4882a593Smuzhiyun+		for (i = 0; i < fb->num_planes; i++) {
80*4882a593Smuzhiyun+			if (drmPrimeFDToHandle(fb->fd, import_mod.fds[i],
81*4882a593Smuzhiyun+					       &fb->handles[i])) {
82*4882a593Smuzhiyun+				*try_view_on_plane_failure_reasons |=
83*4882a593Smuzhiyun+					FAILURE_REASONS_GBM_BO_IMPORT_FAILED;
84*4882a593Smuzhiyun+				goto err_free;
85*4882a593Smuzhiyun+			}
86*4882a593Smuzhiyun 		}
87*4882a593Smuzhiyun-		fb->handles[i] = handle.u32;
88*4882a593Smuzhiyun 	}
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun 	if (drm_fb_addfb(device, fb) != 0) {
91*4882a593Smuzhiyun--
92*4882a593Smuzhiyun2.20.1
93*4882a593Smuzhiyun
94