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