From ee293fab58da190943426a6d23380dd04200a4ff Mon Sep 17 00:00:00 2001 From: emersion Date: Tue, 29 Jan 2019 12:04:12 +0100 Subject: backend/drm: fix GBM format mismatch We create the EGL config with GBM_FORMAT_ARGB8888, but then initialize GBM BOs with GBM_FORMAT_XRGB8888. This mismatch confuses Mesa. Instead, we can always use GBM_FORMAT_ARGB8888, and use DRM_FORMAT_XRGB8888 when calling drmModeAddFB2. Fixes https://github.com/swaywm/wlroots/issues/1438 --- backend/drm/util.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'backend/drm/util.c') diff --git a/backend/drm/util.c b/backend/drm/util.c index 6f2dd5be..c2aa0fd8 100644 --- a/backend/drm/util.c +++ b/backend/drm/util.c @@ -1,3 +1,5 @@ +#include +#include #include #include #include @@ -176,12 +178,16 @@ static void free_fb(struct gbm_bo *bo, void *data) { } } -uint32_t get_fb_for_bo(struct gbm_bo *bo) { +uint32_t get_fb_for_bo(struct gbm_bo *bo, uint32_t drm_format) { uint32_t id = (uintptr_t)gbm_bo_get_user_data(bo); if (id) { return id; } + assert(gbm_bo_get_format(bo) == GBM_FORMAT_ARGB8888); + assert(drm_format == DRM_FORMAT_ARGB8888 || + drm_format == DRM_FORMAT_XRGB8888); + struct gbm_device *gbm = gbm_bo_get_device(bo); int fd = gbm_device_get_fd(gbm); @@ -190,9 +196,9 @@ uint32_t get_fb_for_bo(struct gbm_bo *bo) { uint32_t handles[4] = {gbm_bo_get_handle(bo).u32}; uint32_t pitches[4] = {gbm_bo_get_stride(bo)}; uint32_t offsets[4] = {gbm_bo_get_offset(bo, 0)}; - uint32_t format = gbm_bo_get_format(bo); - if (drmModeAddFB2(fd, width, height, format, handles, pitches, offsets, &id, 0)) { + if (drmModeAddFB2(fd, width, height, drm_format, + handles, pitches, offsets, &id, 0)) { wlr_log_errno(WLR_ERROR, "Unable to add DRM framebuffer"); } -- cgit v1.2.3