dril: Skip some pipe formats to avoid breaking X

In the case where gbm fails to init, we use our entire format list. That
became a problem in commit 642c4cf2b2 when some formats were added to the
list that X can't handle. This leads to X crashing when using glx and
trying to use certain visuals.

An easily testable manifestation of this crash is to run piglit's
glx-create-context-ext-no-config-context under Xwayland in a virtual
machine that has no gpu, whilst using zink. Much like our CI does for some
jobs.

Fixes: 642c4cf2b2 ("dril: add BGR{X,A}8888 and RGB{X,A}8888")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36575>
This commit is contained in:
Derek Foreman 2025-08-05 10:04:43 -05:00 committed by Marge Bot
parent 0d4d73a780
commit b94add2977

View file

@ -454,6 +454,39 @@ out:
return NULL;
}
static bool
filter_rgba(enum pipe_format color_format)
{
switch (color_format) {
case PIPE_FORMAT_B8G8R8A8_UNORM:
case PIPE_FORMAT_B8G8R8X8_UNORM:
case PIPE_FORMAT_R8G8B8A8_UNORM:
case PIPE_FORMAT_R8G8B8X8_UNORM:
case PIPE_FORMAT_B10G10R10A2_UNORM:
case PIPE_FORMAT_B10G10R10X2_UNORM:
case PIPE_FORMAT_R10G10B10A2_UNORM:
case PIPE_FORMAT_R10G10B10X2_UNORM:
case PIPE_FORMAT_B5G6R5_UNORM:
case PIPE_FORMAT_B5G5R5A1_UNORM:
case PIPE_FORMAT_B5G5R5X1_UNORM:
case PIPE_FORMAT_B4G4R4A4_UNORM:
case PIPE_FORMAT_B4G4R4X4_UNORM:
case PIPE_FORMAT_R5G6B5_UNORM:
case PIPE_FORMAT_R5G5B5A1_UNORM:
case PIPE_FORMAT_R5G5B5X1_UNORM:
case PIPE_FORMAT_R4G4B4A4_UNORM:
case PIPE_FORMAT_R4G4B4X4_UNORM:
return false;
/* RGBA modes that break some users */
case PIPE_FORMAT_X8R8G8B8_UNORM:
case PIPE_FORMAT_A8R8G8B8_UNORM:
case PIPE_FORMAT_X8B8G8R8_UNORM:
case PIPE_FORMAT_A8B8G8R8_UNORM:
default:
return true;
}
}
static __DRIscreen *
drilCreateNewScreen(int scrn, int fd,
const __DRIextension **loader_extensions,
@ -468,6 +501,14 @@ drilCreateNewScreen(int scrn, int fd,
configs = calloc(ARRAY_SIZE(drilConfigs) * 2 + 1, sizeof(void *));
int c = 0;
for (int i = 0; i < ARRAY_SIZE(drilConfigs); i++) {
/* If GBM init was successful, we'd be checking against a list
* of modes already pruned by DRI_LOADER_CAP_RGBA_ORDERING in
* dri_fill_in_modes. Let's just throw away RGBA ordered modes
* here for safety.
*/
if (filter_rgba(drilConfigs[i].color_format))
continue;
/* create normal config */
configs[c++] = mem_dup(&drilConfigs[i], sizeof(drilConfigs[i]));