xwayland/glamor/gbm: Set GBM_BO_USE_LINEAR if only LINEAR modifier is supported
Some drivers might not support explicit format modifiers. On these drivers `gbm_bo_create_with_modifiers()` will fail and the `gbm_bo_create()` code path will be used instead. In this case, if the LINEAR modifier is advertised (and the INVALID modifier is not) add the `GBM_BO_USE_LINEAR` flag. Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1438 Reviewed-by: Michel Dänzer <mdaenzer@redhat.com> Signed-off-by: José Expósito's avatarJosé Expósito <jexposit@redhat.com>
This commit is contained in:
		
							parent
							
								
									722e464bff
								
							
						
					
					
						commit
						287638db59
					
				| 
						 | 
					@ -284,6 +284,8 @@ xwl_glamor_gbm_create_pixmap_internal(struct xwl_screen *xwl_screen,
 | 
				
			||||||
    struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen);
 | 
					    struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen);
 | 
				
			||||||
    struct gbm_bo *bo = NULL;
 | 
					    struct gbm_bo *bo = NULL;
 | 
				
			||||||
    PixmapPtr pixmap = NULL;
 | 
					    PixmapPtr pixmap = NULL;
 | 
				
			||||||
 | 
					    uint32_t num_modifiers = 0;
 | 
				
			||||||
 | 
					    uint64_t *modifiers = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (width > 0 && height > 0 && depth >= 15 &&
 | 
					    if (width > 0 && height > 0 && depth >= 15 &&
 | 
				
			||||||
        (hint == CREATE_PIXMAP_USAGE_BACKING_PIXMAP ||
 | 
					        (hint == CREATE_PIXMAP_USAGE_BACKING_PIXMAP ||
 | 
				
			||||||
| 
						 | 
					@ -294,8 +296,6 @@ xwl_glamor_gbm_create_pixmap_internal(struct xwl_screen *xwl_screen,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef GBM_BO_WITH_MODIFIERS
 | 
					#ifdef GBM_BO_WITH_MODIFIERS
 | 
				
			||||||
        if (xwl_gbm->dmabuf_capable) {
 | 
					        if (xwl_gbm->dmabuf_capable) {
 | 
				
			||||||
            uint32_t num_modifiers = 0;
 | 
					 | 
				
			||||||
            uint64_t *modifiers = NULL;
 | 
					 | 
				
			||||||
            Bool supports_scanout = FALSE;
 | 
					            Bool supports_scanout = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (drawable) {
 | 
					            if (drawable) {
 | 
				
			||||||
| 
						 | 
					@ -324,7 +324,6 @@ xwl_glamor_gbm_create_pixmap_internal(struct xwl_screen *xwl_screen,
 | 
				
			||||||
                                                  format, modifiers, num_modifiers);
 | 
					                                                  format, modifiers, num_modifiers);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            free(modifiers);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
        if (bo == NULL) {
 | 
					        if (bo == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -332,6 +331,22 @@ xwl_glamor_gbm_create_pixmap_internal(struct xwl_screen *xwl_screen,
 | 
				
			||||||
            implicit = TRUE;
 | 
					            implicit = TRUE;
 | 
				
			||||||
            if (implicit_scanout)
 | 
					            if (implicit_scanout)
 | 
				
			||||||
                usage |= GBM_BO_USE_SCANOUT;
 | 
					                usage |= GBM_BO_USE_SCANOUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (num_modifiers > 0) {
 | 
				
			||||||
 | 
					                Bool has_mod_invalid = FALSE, has_mod_linear = FALSE;
 | 
				
			||||||
 | 
					                int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for (i = 0; i < num_modifiers; i++) {
 | 
				
			||||||
 | 
					                    if (modifiers[i] == DRM_FORMAT_MOD_INVALID)
 | 
				
			||||||
 | 
					                        has_mod_invalid = TRUE;
 | 
				
			||||||
 | 
					                    else if (modifiers[i] == DRM_FORMAT_MOD_LINEAR)
 | 
				
			||||||
 | 
					                        has_mod_linear = TRUE;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (!has_mod_invalid && has_mod_linear)
 | 
				
			||||||
 | 
					                    usage |= GBM_BO_USE_LINEAR;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            bo = gbm_bo_create(xwl_gbm->gbm, width, height, format, usage);
 | 
					            bo = gbm_bo_create(xwl_gbm->gbm, width, height, format, usage);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -350,6 +365,7 @@ xwl_glamor_gbm_create_pixmap_internal(struct xwl_screen *xwl_screen,
 | 
				
			||||||
    if (!pixmap)
 | 
					    if (!pixmap)
 | 
				
			||||||
        pixmap = glamor_create_pixmap(xwl_screen->screen, width, height, depth, hint);
 | 
					        pixmap = glamor_create_pixmap(xwl_screen->screen, width, height, depth, hint);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    free(modifiers);
 | 
				
			||||||
    return pixmap;
 | 
					    return pixmap;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue