1*4882a593SmuzhiyunFrom cd7d2c8e3f294eb6743d5d5e293df3a64459fdb0 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Sat, 9 Oct 2021 12:33:33 +0800 4*4882a593SmuzhiyunSubject: [PATCH 53/93] HACK: pixman-renderer: Support passing dma fd to pixman 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunUsage: 7*4882a593Smuzhiyunpixman_image_set_destroy_function(image, NULL, (void *)(ptrdiff_t)dma_fd) 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 10*4882a593Smuzhiyun--- 11*4882a593Smuzhiyun libweston/backend-drm/drm-internal.h | 1 + 12*4882a593Smuzhiyun libweston/backend-drm/drm.c | 3 +++ 13*4882a593Smuzhiyun libweston/backend-drm/fb.c | 15 +++++++++++++++ 14*4882a593Smuzhiyun libweston/pixman-renderer.c | 2 ++ 15*4882a593Smuzhiyun libweston/pixman-renderer.h | 4 ++++ 16*4882a593Smuzhiyun 5 files changed, 25 insertions(+) 17*4882a593Smuzhiyun 18*4882a593Smuzhiyundiff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h 19*4882a593Smuzhiyunindex 12ee031..f7f042d 100644 20*4882a593Smuzhiyun--- a/libweston/backend-drm/drm-internal.h 21*4882a593Smuzhiyun+++ b/libweston/backend-drm/drm-internal.h 22*4882a593Smuzhiyun@@ -404,6 +404,7 @@ struct drm_fb { 23*4882a593Smuzhiyun uint64_t modifier; 24*4882a593Smuzhiyun int width, height; 25*4882a593Smuzhiyun int fd; 26*4882a593Smuzhiyun+ int dma_fd; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun uint32_t plane_mask; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyundiff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c 31*4882a593Smuzhiyunindex cb0935e..5c56c18 100644 32*4882a593Smuzhiyun--- a/libweston/backend-drm/drm.c 33*4882a593Smuzhiyun+++ b/libweston/backend-drm/drm.c 34*4882a593Smuzhiyun@@ -1691,6 +1691,9 @@ drm_output_init_pixman(struct drm_output *output, struct drm_backend *b) 35*4882a593Smuzhiyun output->dumb[i]->strides[0]); 36*4882a593Smuzhiyun if (!output->image[i]) 37*4882a593Smuzhiyun goto err; 38*4882a593Smuzhiyun+ 39*4882a593Smuzhiyun+ pixman_image_set_dma_fd(output->image[i], 40*4882a593Smuzhiyun+ output->dumb[i]->dma_fd); 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun if (pixman_renderer_output_create(&output->base, &options) < 0) 44*4882a593Smuzhiyundiff --git a/libweston/backend-drm/fb.c b/libweston/backend-drm/fb.c 45*4882a593Smuzhiyunindex 4cb2cbe..8c4c49c 100644 46*4882a593Smuzhiyun--- a/libweston/backend-drm/fb.c 47*4882a593Smuzhiyun+++ b/libweston/backend-drm/fb.c 48*4882a593Smuzhiyun@@ -58,6 +58,9 @@ drm_fb_destroy_dumb(struct drm_fb *fb) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun assert(fb->type == BUFFER_PIXMAN_DUMB); 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun+ if (fb->dma_fd >= 0) 53*4882a593Smuzhiyun+ close(fb->dma_fd); 54*4882a593Smuzhiyun+ 55*4882a593Smuzhiyun if (fb->map && fb->size > 0) 56*4882a593Smuzhiyun munmap(fb->map, fb->size); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun@@ -121,6 +124,7 @@ drm_fb_create_dumb(struct drm_device *device, int width, int height, 59*4882a593Smuzhiyun struct drm_mode_create_dumb create_arg; 60*4882a593Smuzhiyun struct drm_mode_destroy_dumb destroy_arg; 61*4882a593Smuzhiyun struct drm_mode_map_dumb map_arg; 62*4882a593Smuzhiyun+ struct drm_prime_handle prime_arg; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun fb = zalloc(sizeof *fb); 65*4882a593Smuzhiyun if (!fb) 66*4882a593Smuzhiyun@@ -175,8 +179,19 @@ drm_fb_create_dumb(struct drm_device *device, int width, int height, 67*4882a593Smuzhiyun if (fb->map == MAP_FAILED) 68*4882a593Smuzhiyun goto err_add_fb; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun+ memset(&prime_arg, 0, sizeof(prime_arg)); 71*4882a593Smuzhiyun+ prime_arg.fd = -1; 72*4882a593Smuzhiyun+ prime_arg.handle = fb->handles[0]; 73*4882a593Smuzhiyun+ ret = drmIoctl(fb->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &prime_arg); 74*4882a593Smuzhiyun+ if (ret) 75*4882a593Smuzhiyun+ goto err_unmap_fb; 76*4882a593Smuzhiyun+ 77*4882a593Smuzhiyun+ fb->dma_fd = prime_arg.fd; 78*4882a593Smuzhiyun+ 79*4882a593Smuzhiyun return fb; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun+err_unmap_fb: 82*4882a593Smuzhiyun+ munmap(fb->map, fb->size); 83*4882a593Smuzhiyun err_add_fb: 84*4882a593Smuzhiyun drmModeRmFB(device->drm.fd, fb->fb_id); 85*4882a593Smuzhiyun err_bo: 86*4882a593Smuzhiyundiff --git a/libweston/pixman-renderer.c b/libweston/pixman-renderer.c 87*4882a593Smuzhiyunindex d53fe42..22edaa5 100644 88*4882a593Smuzhiyun--- a/libweston/pixman-renderer.c 89*4882a593Smuzhiyun+++ b/libweston/pixman-renderer.c 90*4882a593Smuzhiyun@@ -881,6 +881,8 @@ pixman_renderer_attach_dmabuf(struct weston_surface *es, 91*4882a593Smuzhiyun data->ptr + attributes->offset[0], 92*4882a593Smuzhiyun attributes->stride[0]); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun+ pixman_image_set_dma_fd(ps->image, attributes->fd[0]); 95*4882a593Smuzhiyun+ 96*4882a593Smuzhiyun ps->buffer_destroy_listener.notify = 97*4882a593Smuzhiyun buffer_state_handle_buffer_destroy; 98*4882a593Smuzhiyun wl_signal_add(&buffer->destroy_signal, 99*4882a593Smuzhiyundiff --git a/libweston/pixman-renderer.h b/libweston/pixman-renderer.h 100*4882a593Smuzhiyunindex 2b81dde..bcd248f 100644 101*4882a593Smuzhiyun--- a/libweston/pixman-renderer.h 102*4882a593Smuzhiyun+++ b/libweston/pixman-renderer.h 103*4882a593Smuzhiyun@@ -29,6 +29,10 @@ 104*4882a593Smuzhiyun #include "backend.h" 105*4882a593Smuzhiyun #include "libweston-internal.h" 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun+/* HACK: Pass dma fd to pixman through destroy data */ 108*4882a593Smuzhiyun+#define pixman_image_set_dma_fd(image, fd) \ 109*4882a593Smuzhiyun+ pixman_image_set_destroy_function(image, NULL, (void *)(ptrdiff_t)fd) 110*4882a593Smuzhiyun+ 111*4882a593Smuzhiyun int 112*4882a593Smuzhiyun pixman_renderer_init(struct weston_compositor *ec); 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun-- 115*4882a593Smuzhiyun2.20.1 116*4882a593Smuzhiyun 117