diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index 35cdd882eb1..8ed1a0c1392 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -1170,15 +1170,29 @@ dri2_create_image(__DRIscreen *_screen, if (count == 1 && modifiers[0] == DRM_FORMAT_MOD_INVALID) { count = 0; modifiers = NULL; - } else if (count == 1 && modifiers[0] == DRM_FORMAT_MOD_LINEAR && - !pscreen->resource_create_with_modifiers) { - count = 0; - modifiers = NULL; - use |= __DRI_IMAGE_USE_LINEAR; } - else if ((count > 1 || modifiers) && - !pscreen->resource_create_with_modifiers) { - return NULL; + + if (!pscreen->resource_create_with_modifiers && count > 0) { + bool invalid_ok = false; + bool linear_ok = false; + + for (unsigned i = 0; i < _count; i++) { + if (modifiers[i] == DRM_FORMAT_MOD_LINEAR) + linear_ok = true; + else if (modifiers[i] == DRM_FORMAT_MOD_INVALID) + invalid_ok = true; + } + + if (invalid_ok) { + count = 0; + modifiers = NULL; + } else if (linear_ok) { + count = 0; + modifiers = NULL; + use |= __DRI_IMAGE_USE_LINEAR; + } else { + return NULL; + } } if (pscreen->is_format_supported(pscreen, map->pipe_format, screen->target,