1*4882a593SmuzhiyunFrom b727c545a985640aecaf07c3e3e5100e57914bd2 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Tue, 1 Sep 2020 08:51:17 +0800 4*4882a593SmuzhiyunSubject: [PATCH 30/95] HACK: backend-drm: Consider linear and invalid modifier 5*4882a593Smuzhiyun are the same 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunThat is true with Rockchip BSP drivers and packages. 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 10*4882a593Smuzhiyun--- 11*4882a593Smuzhiyun clients/simple-dmabuf-egl.c | 5 +++-- 12*4882a593Smuzhiyun clients/simple-dmabuf-v4l.c | 2 +- 13*4882a593Smuzhiyun libweston/backend-drm/drm-gbm.c | 3 ++- 14*4882a593Smuzhiyun libweston/backend-drm/fb.c | 6 ++++-- 15*4882a593Smuzhiyun libweston/linux-dmabuf.c | 3 +-- 16*4882a593Smuzhiyun libweston/pixel-formats.c | 2 +- 17*4882a593Smuzhiyun libweston/pixman-renderer.c | 3 +-- 18*4882a593Smuzhiyun libweston/renderer-gl/gl-renderer.c | 6 +++--- 19*4882a593Smuzhiyun shared/weston-drm-fourcc.h | 4 ++++ 20*4882a593Smuzhiyun 9 files changed, 20 insertions(+), 14 deletions(-) 21*4882a593Smuzhiyun 22*4882a593Smuzhiyundiff --git a/clients/simple-dmabuf-egl.c b/clients/simple-dmabuf-egl.c 23*4882a593Smuzhiyunindex 16d47ba..a03058b 100644 24*4882a593Smuzhiyun--- a/clients/simple-dmabuf-egl.c 25*4882a593Smuzhiyun+++ b/clients/simple-dmabuf-egl.c 26*4882a593Smuzhiyun@@ -265,7 +265,8 @@ create_fbo_for_buffer(struct display *display, struct buffer *buffer) 27*4882a593Smuzhiyun attribs[atti++] = (int) buffer->offsets[plane_idx]; \ 28*4882a593Smuzhiyun attribs[atti++] = EGL_DMA_BUF_PLANE ## plane_idx ## _PITCH_EXT; \ 29*4882a593Smuzhiyun attribs[atti++] = (int) buffer->strides[plane_idx]; \ 30*4882a593Smuzhiyun- if (display->egl.has_dma_buf_import_modifiers) { \ 31*4882a593Smuzhiyun+ if (DRM_MOD_VALID(buffer->modifier) && \ 32*4882a593Smuzhiyun+ display->egl.has_dma_buf_import_modifiers) { \ 33*4882a593Smuzhiyun attribs[atti++] = EGL_DMA_BUF_PLANE ## plane_idx ## _MODIFIER_LO_EXT; \ 34*4882a593Smuzhiyun attribs[atti++] = buffer->modifier & 0xFFFFFFFF; \ 35*4882a593Smuzhiyun attribs[atti++] = EGL_DMA_BUF_PLANE ## plane_idx ## _MODIFIER_HI_EXT; \ 36*4882a593Smuzhiyun@@ -1018,7 +1019,7 @@ dmabuf_modifiers(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf, 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun d->format_supported = true; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun- if (modifier != DRM_FORMAT_MOD_INVALID) { 41*4882a593Smuzhiyun+ if (DRM_MOD_VALID(modifier)) { 42*4882a593Smuzhiyun ++d->modifiers_count; 43*4882a593Smuzhiyun d->modifiers = realloc(d->modifiers, 44*4882a593Smuzhiyun d->modifiers_count * sizeof(*d->modifiers)); 45*4882a593Smuzhiyundiff --git a/clients/simple-dmabuf-v4l.c b/clients/simple-dmabuf-v4l.c 46*4882a593Smuzhiyunindex a19570f..5ac340e 100644 47*4882a593Smuzhiyun--- a/clients/simple-dmabuf-v4l.c 48*4882a593Smuzhiyun+++ b/clients/simple-dmabuf-v4l.c 49*4882a593Smuzhiyun@@ -732,7 +732,7 @@ dmabuf_modifier(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf, 50*4882a593Smuzhiyun struct display *d = data; 51*4882a593Smuzhiyun uint64_t modifier = ((uint64_t) modifier_hi << 32 ) | modifier_lo; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun- if (format == d->drm_format && modifier == DRM_FORMAT_MOD_LINEAR) 54*4882a593Smuzhiyun+ if (format == d->drm_format && !DRM_MOD_VALID(modifier)) 55*4882a593Smuzhiyun d->requested_format_found = true; 56*4882a593Smuzhiyun } 57*4882a593Smuzhiyun 58*4882a593Smuzhiyundiff --git a/libweston/backend-drm/drm-gbm.c b/libweston/backend-drm/drm-gbm.c 59*4882a593Smuzhiyunindex d10cc40..f998178 100644 60*4882a593Smuzhiyun--- a/libweston/backend-drm/drm-gbm.c 61*4882a593Smuzhiyun+++ b/libweston/backend-drm/drm-gbm.c 62*4882a593Smuzhiyun@@ -206,7 +206,8 @@ create_gbm_surface(struct gbm_device *gbm, struct drm_output *output) 63*4882a593Smuzhiyun } 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #ifdef HAVE_GBM_MODIFIERS 66*4882a593Smuzhiyun- if (!weston_drm_format_has_modifier(fmt, DRM_FORMAT_MOD_INVALID)) { 67*4882a593Smuzhiyun+ if (!weston_drm_format_has_modifier(fmt, DRM_FORMAT_MOD_INVALID) && 68*4882a593Smuzhiyun+ !weston_drm_format_has_modifier(fmt, DRM_FORMAT_MOD_LINEAR)) { 69*4882a593Smuzhiyun modifiers = weston_drm_format_get_modifiers(fmt, &num_modifiers); 70*4882a593Smuzhiyun output->gbm_surface = 71*4882a593Smuzhiyun gbm_surface_create_with_modifiers(gbm, 72*4882a593Smuzhiyundiff --git a/libweston/backend-drm/fb.c b/libweston/backend-drm/fb.c 73*4882a593Smuzhiyunindex 05b4988..4cb2cbe 100644 74*4882a593Smuzhiyun--- a/libweston/backend-drm/fb.c 75*4882a593Smuzhiyun+++ b/libweston/backend-drm/fb.c 76*4882a593Smuzhiyun@@ -77,7 +77,7 @@ drm_fb_addfb(struct drm_device *device, struct drm_fb *fb) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /* If we have a modifier set, we must only use the WithModifiers 79*4882a593Smuzhiyun * entrypoint; we cannot import it through legacy ioctls. */ 80*4882a593Smuzhiyun- if (device->fb_modifiers && fb->modifier != DRM_FORMAT_MOD_INVALID) { 81*4882a593Smuzhiyun+ if (device->fb_modifiers && DRM_MOD_VALID(fb->modifier)) { 82*4882a593Smuzhiyun /* KMS demands that if a modifier is set, it must be the same 83*4882a593Smuzhiyun * for all planes. */ 84*4882a593Smuzhiyun for (i = 0; i < ARRAY_LENGTH(mods) && fb->handles[i]; i++) 85*4882a593Smuzhiyun@@ -238,6 +238,7 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf, 86*4882a593Smuzhiyun .modifier = dmabuf->attributes.modifier[0], 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun+#if 0 90*4882a593Smuzhiyun /* We should not import to KMS a buffer that has been allocated using no 91*4882a593Smuzhiyun * modifiers. Usually drivers use linear layouts to allocate with no 92*4882a593Smuzhiyun * modifiers, but this is not a rule. The driver could use, for 93*4882a593Smuzhiyun@@ -251,6 +252,7 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf, 94*4882a593Smuzhiyun FAILURE_REASONS_DMABUF_MODIFIER_INVALID; 95*4882a593Smuzhiyun return NULL; 96*4882a593Smuzhiyun } 97*4882a593Smuzhiyun+#endif 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* XXX: TODO: 100*4882a593Smuzhiyun * 101*4882a593Smuzhiyun@@ -489,7 +491,7 @@ drm_fb_compatible_with_plane(struct drm_fb *fb, struct drm_plane *plane) 102*4882a593Smuzhiyun * wl_drm is being used for scanout. Mesa is the only user we 103*4882a593Smuzhiyun * care in this case (even though recent versions are also using 104*4882a593Smuzhiyun * dmabufs), and it should know better what works or not. */ 105*4882a593Smuzhiyun- if (fb->modifier == DRM_FORMAT_MOD_INVALID) 106*4882a593Smuzhiyun+ if (!DRM_MOD_VALID(fb->modifier)) 107*4882a593Smuzhiyun return true; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun if (weston_drm_format_has_modifier(fmt, fb->modifier)) 110*4882a593Smuzhiyundiff --git a/libweston/linux-dmabuf.c b/libweston/linux-dmabuf.c 111*4882a593Smuzhiyunindex b73508e..a4dee8b 100644 112*4882a593Smuzhiyun--- a/libweston/linux-dmabuf.c 113*4882a593Smuzhiyun+++ b/libweston/linux-dmabuf.c 114*4882a593Smuzhiyun@@ -1057,8 +1057,7 @@ bind_linux_dmabuf(struct wl_client *client, 115*4882a593Smuzhiyun fmt->format, 116*4882a593Smuzhiyun modifier_hi, 117*4882a593Smuzhiyun modifier_lo); 118*4882a593Smuzhiyun- } else if (modifiers[i] == DRM_FORMAT_MOD_LINEAR || 119*4882a593Smuzhiyun- modifiers[i] == DRM_FORMAT_MOD_INVALID) { 120*4882a593Smuzhiyun+ } else if (!DRM_MOD_VALID(modifiers[i])) { 121*4882a593Smuzhiyun zwp_linux_dmabuf_v1_send_format(resource, 122*4882a593Smuzhiyun fmt->format); 123*4882a593Smuzhiyun } 124*4882a593Smuzhiyundiff --git a/libweston/pixel-formats.c b/libweston/pixel-formats.c 125*4882a593Smuzhiyunindex 7590171..10b3ed9 100644 126*4882a593Smuzhiyun--- a/libweston/pixel-formats.c 127*4882a593Smuzhiyun+++ b/libweston/pixel-formats.c 128*4882a593Smuzhiyun@@ -755,7 +755,7 @@ pixel_format_get_modifier(uint64_t modifier) 129*4882a593Smuzhiyun return mod_str; 130*4882a593Smuzhiyun } 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun- if (modifier == DRM_FORMAT_MOD_LINEAR) { 133*4882a593Smuzhiyun+ if (!DRM_MOD_VALID(modifier)) { 134*4882a593Smuzhiyun str_printf(&mod_str, "%s (0x%llx)", modifier_name, 135*4882a593Smuzhiyun (unsigned long long) modifier); 136*4882a593Smuzhiyun free(modifier_name); 137*4882a593Smuzhiyundiff --git a/libweston/pixman-renderer.c b/libweston/pixman-renderer.c 138*4882a593Smuzhiyunindex 7339541..c8b7b88 100644 139*4882a593Smuzhiyun--- a/libweston/pixman-renderer.c 140*4882a593Smuzhiyun+++ b/libweston/pixman-renderer.c 141*4882a593Smuzhiyun@@ -734,8 +734,7 @@ pixman_renderer_prepare_dmabuf(struct linux_dmabuf_buffer *dmabuf) 142*4882a593Smuzhiyun total_size = lseek(attributes->fd[0], 0, SEEK_END); 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun for (i = 0; i < attributes->n_planes; i++) { 145*4882a593Smuzhiyun- if (attributes->modifier[i] != DRM_FORMAT_MOD_INVALID && 146*4882a593Smuzhiyun- attributes->modifier[i] != DRM_FORMAT_MOD_LINEAR) 147*4882a593Smuzhiyun+ if (DRM_MOD_VALID(attributes->modifier[i])) 148*4882a593Smuzhiyun return false; 149*4882a593Smuzhiyun } 150*4882a593Smuzhiyun 151*4882a593Smuzhiyundiff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c 152*4882a593Smuzhiyunindex bbd1cd4..4eedb94 100644 153*4882a593Smuzhiyun--- a/libweston/renderer-gl/gl-renderer.c 154*4882a593Smuzhiyun+++ b/libweston/renderer-gl/gl-renderer.c 155*4882a593Smuzhiyun@@ -2397,7 +2397,7 @@ import_simple_dmabuf(struct gl_renderer *gr, 156*4882a593Smuzhiyun attribs[atti++] = EGL_YUV_NARROW_RANGE_EXT; 157*4882a593Smuzhiyun } 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun- if (attributes->modifier[0] != DRM_FORMAT_MOD_INVALID) { 160*4882a593Smuzhiyun+ if (DRM_MOD_VALID(attributes->modifier[0])) { 161*4882a593Smuzhiyun if (!gr->has_dmabuf_import_modifiers) 162*4882a593Smuzhiyun return NULL; 163*4882a593Smuzhiyun has_modifier = true; 164*4882a593Smuzhiyun@@ -2806,7 +2806,7 @@ gl_renderer_import_dmabuf(struct weston_compositor *ec, 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun for (i = 0; i < dmabuf->attributes.n_planes; i++) { 167*4882a593Smuzhiyun /* return if EGL doesn't support import modifiers */ 168*4882a593Smuzhiyun- if (dmabuf->attributes.modifier[i] != DRM_FORMAT_MOD_INVALID) 169*4882a593Smuzhiyun+ if (DRM_MOD_VALID(dmabuf->attributes.modifier[i])) 170*4882a593Smuzhiyun if (!gr->has_dmabuf_import_modifiers) 171*4882a593Smuzhiyun return false; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun@@ -2970,7 +2970,7 @@ populate_supported_formats(struct weston_compositor *ec, 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun for (j = 0; j < num_modifiers; j++) { 176*4882a593Smuzhiyun /* Skip MOD_INVALID, as it has already been added. */ 177*4882a593Smuzhiyun- if (modifiers[j] == DRM_FORMAT_MOD_INVALID) 178*4882a593Smuzhiyun+ if (!DRM_MOD_VALID(modifiers[j])) 179*4882a593Smuzhiyun continue; 180*4882a593Smuzhiyun ret = weston_drm_format_add_modifier(fmt, modifiers[j]); 181*4882a593Smuzhiyun if (ret < 0) { 182*4882a593Smuzhiyundiff --git a/shared/weston-drm-fourcc.h b/shared/weston-drm-fourcc.h 183*4882a593Smuzhiyunindex 0a013f7..31d8039 100644 184*4882a593Smuzhiyun--- a/shared/weston-drm-fourcc.h 185*4882a593Smuzhiyun+++ b/shared/weston-drm-fourcc.h 186*4882a593Smuzhiyun@@ -30,6 +30,10 @@ 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun #include <drm_fourcc.h> 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun+/* modifier is not linear or invalid */ 191*4882a593Smuzhiyun+#define DRM_MOD_VALID(mod) \ 192*4882a593Smuzhiyun+ ((mod) != DRM_FORMAT_MOD_LINEAR && (mod) != DRM_FORMAT_MOD_INVALID) 193*4882a593Smuzhiyun+ 194*4882a593Smuzhiyun /* The kernel header drm_fourcc.h defines the DRM formats below. We duplicate 195*4882a593Smuzhiyun * some of the definitions here so that building Weston won't require 196*4882a593Smuzhiyun * bleeding-edge kernel headers. 197*4882a593Smuzhiyun-- 198*4882a593Smuzhiyun2.20.1 199*4882a593Smuzhiyun 200