From 14470b21b224db780f25197b171c452db15b8e5a Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Tue, 5 Aug 2025 10:04:43 -0500 Subject: [PATCH] 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: (cherry picked from commit b94add29778e0d5bf4c7a6ddc865e58712807fc0) --- .pick_status.json | 2 +- src/gallium/targets/dril/dril_target.c | 41 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index fa8818207e3..35009649e66 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -3644,7 +3644,7 @@ "description": "dril: Skip some pipe formats to avoid breaking X", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "642c4cf2b2f3dcd2cc1506a8ff3e143be396444a", "notes": null diff --git a/src/gallium/targets/dril/dril_target.c b/src/gallium/targets/dril/dril_target.c index b6d4e24f63f..30ca408b596 100644 --- a/src/gallium/targets/dril/dril_target.c +++ b/src/gallium/targets/dril/dril_target.c @@ -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]));