From 27ed515c0519f7907362081c790d98240f0919eb Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Tue, 8 Dec 2020 16:32:03 -0800 Subject: [PATCH] drisw: Add fallback logic for choosing a driver to use Reviewed-by: Adam Jackson Reviewed-by: Eric Anholt Part-of: --- .../target-helpers/inline_sw_helper.h | 41 +++++++++++-------- .../auxiliary/target-helpers/sw_helper.h | 41 +++++++++++-------- 2 files changed, 50 insertions(+), 32 deletions(-) diff --git a/src/gallium/auxiliary/target-helpers/inline_sw_helper.h b/src/gallium/auxiliary/target-helpers/inline_sw_helper.h index e3300940555..9347909f326 100644 --- a/src/gallium/auxiliary/target-helpers/inline_sw_helper.h +++ b/src/gallium/auxiliary/target-helpers/inline_sw_helper.h @@ -76,25 +76,34 @@ sw_screen_create_named(struct sw_winsys *winsys, const char *driver) static inline struct pipe_screen * sw_screen_create(struct sw_winsys *winsys) { - const char *default_driver; - const char *driver; - + const char *drivers[] = { + debug_get_option("GALLIUM_DRIVER", ""), #if defined(GALLIUM_LLVMPIPE) - default_driver = "llvmpipe"; -#elif defined(GALLIUM_SOFTPIPE) - default_driver = "softpipe"; -#elif defined(GALLIUM_SWR) - default_driver = "swr"; -#elif defined(GALLIUM_ZINK) - default_driver = "zink"; -#elif defined(GALLIUM_D3D12) - default_driver = "d3d12"; -#else - default_driver = ""; + "llvmpipe", #endif +#if defined(GALLIUM_SOFTPIPE) + "softpipe", +#endif +#if defined(GALLIUM_SWR) + "swr", +#endif +#if defined(GALLIUM_ZINK) + "zink", +#endif +#if defined(GALLIUM_D3D12) + "d3d12", +#endif + }; - driver = debug_get_option("GALLIUM_DRIVER", default_driver); - return sw_screen_create_named(winsys, driver); + for (unsigned i = 0; i < ARRAY_SIZE(drivers); i++) { + struct pipe_screen *screen = sw_screen_create_named(winsys, drivers[i]); + if (screen) + return screen; + /* If the env var is set, don't keep trying things */ + else if (i == 0 && drivers[i][0] != '\0') + return NULL; + } + return NULL; } #endif diff --git a/src/gallium/auxiliary/target-helpers/sw_helper.h b/src/gallium/auxiliary/target-helpers/sw_helper.h index fd1ad904dfb..4fbec159d79 100644 --- a/src/gallium/auxiliary/target-helpers/sw_helper.h +++ b/src/gallium/auxiliary/target-helpers/sw_helper.h @@ -82,25 +82,34 @@ sw_screen_create_named(struct sw_winsys *winsys, const char *driver) struct pipe_screen * sw_screen_create(struct sw_winsys *winsys) { - const char *default_driver; - const char *driver; - + const char *drivers[] = { + debug_get_option("GALLIUM_DRIVER", ""), #if defined(GALLIUM_LLVMPIPE) - default_driver = "llvmpipe"; -#elif defined(GALLIUM_SOFTPIPE) - default_driver = "softpipe"; -#elif defined(GALLIUM_SWR) - default_driver = "swr"; -#elif defined(GALLIUM_ZINK) - default_driver = "zink"; -#elif defined(GALLIUM_D3D12) - default_driver = "d3d12"; -#else - default_driver = ""; + "llvmpipe", #endif +#if defined(GALLIUM_SOFTPIPE) + "softpipe", +#endif +#if defined(GALLIUM_SWR) + "swr", +#endif +#if defined(GALLIUM_ZINK) + "zink", +#endif +#if defined(GALLIUM_D3D12) + "d3d12", +#endif + }; - driver = debug_get_option("GALLIUM_DRIVER", default_driver); - return sw_screen_create_named(winsys, driver); + for (unsigned i = 0; i < ARRAY_SIZE(drivers); i++) { + struct pipe_screen *screen = sw_screen_create_named(winsys, drivers[i]); + if (screen) + return screen; + /* If the env var is set, don't keep trying things */ + else if (i == 0 && drivers[i][0] != '\0') + return NULL; + } + return NULL; } #endif