From 873ce884fd217f2ca2a5fe9764b65e75102124d6 Mon Sep 17 00:00:00 2001 From: James Jones Date: Fri, 19 Nov 2021 11:50:18 -0800 Subject: [PATCH] gbm: Don't pass default usage flags on ABIs < 1 Older drivers will not expect any flags from the GBM front-end when modifiers are in use, and will likely fail the allocation or handle them incorrectly as a result. Only specify usage flags when allocating from a backend with an ABI >= 1, as that's the ABI version that added support for specifying usage flags along with modifiers. Fixes: d50b47a14e9 ("gbm: assume USE_SCANOUT in create_with_modifiers") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5709 Signed-off-by: James Jones Part-of: --- src/gbm/main/gbm.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c index 476a03cb5b8..6b1b3248142 100644 --- a/src/gbm/main/gbm.c +++ b/src/gbm/main/gbm.c @@ -500,8 +500,22 @@ gbm_bo_create_with_modifiers(struct gbm_device *gbm, const uint64_t *modifiers, const unsigned int count) { + uint32_t flags = 0; + + /* + * ABI version 1 added the modifiers+flags capability. Backends from + * prior versions may fail if "unknown" flags are provided along with + * modifiers, but assume scanout is required when modifiers are used. + * Newer backends expect scanout to be explicitly requested if required, + * but applications using this older interface rely on the older implied + * requirement, so that behavior must be preserved. + */ + if (gbm->v0.backend_version >= 1) { + flags |= GBM_BO_USE_SCANOUT; + } + return gbm_bo_create_with_modifiers2(gbm, width, height, format, modifiers, - count, GBM_BO_USE_SCANOUT); + count, flags); } GBM_EXPORT struct gbm_bo * @@ -651,9 +665,23 @@ gbm_surface_create_with_modifiers(struct gbm_device *gbm, const uint64_t *modifiers, const unsigned int count) { + uint32_t flags = 0; + + /* + * ABI version 1 added the modifiers+flags capability. Backends from + * prior versions may fail if "unknown" flags are provided along with + * modifiers, but assume scanout is required when modifiers are used. + * Newer backends expect scanout to be explicitly requested if required, + * but applications using this older interface rely on the older implied + * requirement, so that behavior must be preserved. + */ + if (gbm->v0.backend_version >= 1) { + flags |= GBM_BO_USE_SCANOUT; + } + return gbm_surface_create_with_modifiers2(gbm, width, height, format, modifiers, count, - GBM_BO_USE_SCANOUT); + flags); } GBM_EXPORT struct gbm_surface * -- GitLab