render/gbm_allocator: set modifier to INVALID if implicit

When gbm_bo_create is used and the GBM implementation does support
modifiers, gbm_bo_get_modifier may return something other than
DRM_FORMAT_MOD_INVALID. This can cause issues with the rest of the
stack (e.g. EGL or KMS) in case these don't support modifiers.

Instead, force the modifier to INVALID, to make sure no one uses
modifiers.
This commit is contained in:
Simon Ser 2021-01-16 20:18:06 +01:00
parent b5cefada92
commit bf86110fc5

View file

@ -67,6 +67,7 @@ static struct wlr_gbm_buffer *create_buffer(struct wlr_gbm_allocator *alloc,
struct gbm_device *gbm_device = alloc->gbm_device; struct gbm_device *gbm_device = alloc->gbm_device;
struct gbm_bo *bo = NULL; struct gbm_bo *bo = NULL;
bool has_modifier = true;
if (format->len > 0) { if (format->len > 0) {
bo = gbm_bo_create_with_modifiers(gbm_device, width, height, bo = gbm_bo_create_with_modifiers(gbm_device, width, height,
format->format, format->modifiers, format->len); format->format, format->modifiers, format->len);
@ -78,6 +79,7 @@ static struct wlr_gbm_buffer *create_buffer(struct wlr_gbm_allocator *alloc,
usage |= GBM_BO_USE_LINEAR; usage |= GBM_BO_USE_LINEAR;
} }
bo = gbm_bo_create(gbm_device, width, height, format->format, usage); bo = gbm_bo_create(gbm_device, width, height, format->format, usage);
has_modifier = false;
} }
if (bo == NULL) { if (bo == NULL) {
wlr_log(WLR_ERROR, "gbm_bo_create failed"); wlr_log(WLR_ERROR, "gbm_bo_create failed");
@ -99,9 +101,16 @@ static struct wlr_gbm_buffer *create_buffer(struct wlr_gbm_allocator *alloc,
return NULL; return NULL;
} }
// If the buffer has been allocated with an implicit modifier, make sure we
// don't populate the modifier field: other parts of the stack may not
// understand modifiers, and they can't strip the modifier.
if (!has_modifier) {
buffer->dmabuf.modifier = DRM_FORMAT_MOD_INVALID;
}
wlr_log(WLR_DEBUG, "Allocated %dx%d GBM buffer (format 0x%"PRIX32", " wlr_log(WLR_DEBUG, "Allocated %dx%d GBM buffer (format 0x%"PRIX32", "
"modifier 0x%"PRIX64")", buffer->base.width, buffer->base.height, "modifier 0x%"PRIX64")", buffer->base.width, buffer->base.height,
gbm_bo_get_format(bo), gbm_bo_get_modifier(bo)); buffer->dmabuf.format, buffer->dmabuf.modifier);
return buffer; return buffer;
} }