From 5ac70182e8b4d3a77aab6c743fbafd713a14b361 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Tue, 8 Aug 2023 16:49:55 +0100 Subject: [PATCH] egl/wayland: Simplify alternate-format fallback for configs Rather than doing everything to add the config twice, we can simply reuse the helpers to check if the different formats are supported, then add the config only once. Part-of: --- src/egl/drivers/dri2/platform_wayland.c | 75 ++++++++++++------------- 1 file changed, 36 insertions(+), 39 deletions(-) diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 22f33eaa0ac..02e2a034fe7 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -314,6 +314,14 @@ server_supports_format(struct dri2_wl_formats *formats, int idx) return idx >= 0 && BITSET_TEST(formats->formats_bitmap, idx); } +static bool +server_supports_pipe_format(struct dri2_wl_formats *formats, + enum pipe_format format) +{ + return server_supports_format(formats, + dri2_wl_visual_idx_from_pipe_format(format)); +} + static bool server_supports_fourcc(struct dri2_wl_formats *formats, uint32_t fourcc) { @@ -2022,53 +2030,42 @@ dri2_wl_add_configs_for_visuals(_EGLDisplay *disp) unsigned int format_count[ARRAY_SIZE(dri2_wl_visuals)] = {0}; unsigned int count = 0; + /* Try to create an EGLConfig for every config the driver declares */ for (unsigned i = 0; dri2_dpy->driver_configs[i]; i++) { - bool assigned = false; struct dri2_egl_config *dri2_conf; + bool conversion = false; int idx = dri2_wl_visual_idx_from_config(dri2_dpy, dri2_dpy->driver_configs[i]); - if (!server_supports_format(&dri2_dpy->formats, idx)) - continue; - - dri2_conf = dri2_add_config(disp, dri2_dpy->driver_configs[i], - count + 1, EGL_WINDOW_BIT, NULL, NULL, NULL); - if (dri2_conf) { - if (dri2_conf->base.ConfigID == count + 1) - count++; - format_count[idx]++; - assigned = true; - } - - /* No match for config. Try if we can blitImage convert to a visual */ - if (!assigned && dri2_dpy->fd_render_gpu != dri2_dpy->fd_display_gpu) { - struct dri2_egl_config *dri2_conf; - int alt_pipe_format, s; - - /* Find optimal target visual for blitImage conversion, if any. */ - alt_pipe_format = dri2_wl_visuals[idx].alt_pipe_format; - s = dri2_wl_visual_idx_from_pipe_format(alt_pipe_format); - - if (!server_supports_format(&dri2_dpy->formats, s)) + /* Check if the server natively supports the colour buffer format */ + if (!server_supports_format(&dri2_dpy->formats, idx)) { + /* In multi-GPU scenarios, we usually have a different buffer, so a + * format conversion is easy compared to the overhead of the copy */ + if (dri2_dpy->fd_render_gpu == dri2_dpy->fd_display_gpu) continue; - /* Visual s works for the Wayland server, and c can be converted into s - * by our client gpu during PRIME blitImage conversion to a linear - * wl_buffer, so add visual c as supported by the client renderer. - */ - dri2_conf = dri2_add_config(disp, dri2_dpy->driver_configs[i], - count + 1, EGL_WINDOW_BIT, NULL, NULL, NULL); - if (dri2_conf) { - if (dri2_conf->base.ConfigID == count + 1) - count++; - format_count[idx]++; - if (format_count[idx] == 1) - _eglLog(_EGL_DEBUG, - "Client format %s to server format %s via " - "PRIME blitImage.", - dri2_wl_visuals[idx].format_name, - dri2_wl_visuals[s].format_name); + /* Check if the server supports the alternate format */ + if (!server_supports_pipe_format(&dri2_dpy->formats, + dri2_wl_visuals[idx].alt_pipe_format)) { + continue; } + + conversion = true; + } + + /* The format is supported one way or another; add the EGLConfig */ + dri2_conf = dri2_add_config(disp, dri2_dpy->driver_configs[i], + count + 1, EGL_WINDOW_BIT, NULL, NULL, NULL); + if (!dri2_conf) + continue; + + if (dri2_conf->base.ConfigID == count + 1) + count++; + format_count[idx]++; + + if (conversion && format_count[idx] == 1) { + _eglLog(_EGL_DEBUG, "Client format %s converted via PRIME blitImage.", + dri2_wl_visuals[idx].format_name); } }