101e04c3fSmrg
201e04c3fSmrg#ifndef SW_HELPER_H
301e04c3fSmrg#define SW_HELPER_H
401e04c3fSmrg
501e04c3fSmrg#include "pipe/p_compiler.h"
601e04c3fSmrg#include "util/u_debug.h"
77ec681f3Smrg#include "util/debug.h"
801e04c3fSmrg#include "target-helpers/sw_helper_public.h"
97ec681f3Smrg#include "frontend/sw_winsys.h"
1001e04c3fSmrg
1101e04c3fSmrg
1201e04c3fSmrg/* Helper function to choose and instantiate one of the software rasterizers:
1301e04c3fSmrg * llvmpipe, softpipe, swr.
1401e04c3fSmrg */
1501e04c3fSmrg
167ec681f3Smrg#ifdef GALLIUM_ZINK
177ec681f3Smrg#include "zink/zink_public.h"
187ec681f3Smrg#endif
197ec681f3Smrg
207ec681f3Smrg#ifdef GALLIUM_D3D12
217ec681f3Smrg#include "d3d12/d3d12_public.h"
227ec681f3Smrg#endif
237ec681f3Smrg
247ec681f3Smrg#ifdef GALLIUM_ASAHI
257ec681f3Smrg#include "asahi/agx_public.h"
267ec681f3Smrg#endif
277ec681f3Smrg
2801e04c3fSmrg#ifdef GALLIUM_SOFTPIPE
2901e04c3fSmrg#include "softpipe/sp_public.h"
3001e04c3fSmrg#endif
3101e04c3fSmrg
3201e04c3fSmrg#ifdef GALLIUM_LLVMPIPE
3301e04c3fSmrg#include "llvmpipe/lp_public.h"
3401e04c3fSmrg#endif
3501e04c3fSmrg
3601e04c3fSmrg#ifdef GALLIUM_SWR
3701e04c3fSmrg#include "swr/swr_public.h"
3801e04c3fSmrg#endif
3901e04c3fSmrg
4001e04c3fSmrg#ifdef GALLIUM_VIRGL
4101e04c3fSmrg#include "virgl/virgl_public.h"
4201e04c3fSmrg#include "virgl/vtest/virgl_vtest_public.h"
4301e04c3fSmrg#endif
4401e04c3fSmrg
4501e04c3fSmrgstatic inline struct pipe_screen *
4601e04c3fSmrgsw_screen_create_named(struct sw_winsys *winsys, const char *driver)
4701e04c3fSmrg{
4801e04c3fSmrg   struct pipe_screen *screen = NULL;
4901e04c3fSmrg
5001e04c3fSmrg#if defined(GALLIUM_LLVMPIPE)
5101e04c3fSmrg   if (screen == NULL && strcmp(driver, "llvmpipe") == 0)
5201e04c3fSmrg      screen = llvmpipe_create_screen(winsys);
5301e04c3fSmrg#endif
5401e04c3fSmrg
5501e04c3fSmrg#if defined(GALLIUM_VIRGL)
5601e04c3fSmrg   if (screen == NULL && strcmp(driver, "virpipe") == 0) {
5701e04c3fSmrg      struct virgl_winsys *vws;
5801e04c3fSmrg      vws = virgl_vtest_winsys_wrap(winsys);
597ec681f3Smrg      screen = virgl_create_screen(vws, NULL);
6001e04c3fSmrg   }
6101e04c3fSmrg#endif
6201e04c3fSmrg
6301e04c3fSmrg#if defined(GALLIUM_SOFTPIPE)
6401e04c3fSmrg   if (screen == NULL && strcmp(driver, "softpipe") == 0)
6501e04c3fSmrg      screen = softpipe_create_screen(winsys);
6601e04c3fSmrg#endif
6701e04c3fSmrg
6801e04c3fSmrg#if defined(GALLIUM_SWR)
6901e04c3fSmrg   if (screen == NULL && strcmp(driver, "swr") == 0)
7001e04c3fSmrg      screen = swr_create_screen(winsys);
7101e04c3fSmrg#endif
7201e04c3fSmrg
737ec681f3Smrg#if defined(GALLIUM_ZINK)
747ec681f3Smrg   if (screen == NULL && strcmp(driver, "zink") == 0)
757ec681f3Smrg      screen = zink_create_screen(winsys);
767ec681f3Smrg#endif
777ec681f3Smrg
787ec681f3Smrg#if defined(GALLIUM_D3D12)
797ec681f3Smrg   if (screen == NULL && strcmp(driver, "d3d12") == 0)
807ec681f3Smrg      screen = d3d12_create_dxcore_screen(winsys, NULL);
817ec681f3Smrg#endif
827ec681f3Smrg
837ec681f3Smrg#if defined(GALLIUM_ASAHI)
847ec681f3Smrg   if (screen == NULL && strcmp(driver, "asahi") == 0)
857ec681f3Smrg      screen = agx_screen_create(winsys);
867ec681f3Smrg#endif
877ec681f3Smrg
8801e04c3fSmrg   return screen;
8901e04c3fSmrg}
9001e04c3fSmrg
9101e04c3fSmrgstruct pipe_screen *
927ec681f3Smrgsw_screen_create_vk(struct sw_winsys *winsys, bool sw_vk)
9301e04c3fSmrg{
947ec681f3Smrg   UNUSED bool only_sw = env_var_as_boolean("LIBGL_ALWAYS_SOFTWARE", false);
957ec681f3Smrg   const char *drivers[] = {
967ec681f3Smrg      (sw_vk ? "" : debug_get_option("GALLIUM_DRIVER", "")),
977ec681f3Smrg#if defined(GALLIUM_D3D12)
987ec681f3Smrg      (sw_vk || only_sw) ? "" : "d3d12",
997ec681f3Smrg#endif
1007ec681f3Smrg#if defined(GALLIUM_ASAHI)
1017ec681f3Smrg      (sw_vk || only_sw) ? "" : "asahi",
1027ec681f3Smrg#endif
10301e04c3fSmrg#if defined(GALLIUM_LLVMPIPE)
1047ec681f3Smrg      "llvmpipe",
10501e04c3fSmrg#endif
1067ec681f3Smrg#if defined(GALLIUM_SOFTPIPE)
1077ec681f3Smrg      sw_vk ? "" : "softpipe",
1087ec681f3Smrg#endif
1097ec681f3Smrg#if defined(GALLIUM_SWR)
1107ec681f3Smrg      sw_vk ? "" : "swr",
1117ec681f3Smrg#endif
1127ec681f3Smrg#if defined(GALLIUM_ZINK)
1137ec681f3Smrg      (sw_vk || only_sw) ? "" : "zink",
1147ec681f3Smrg#endif
1157ec681f3Smrg   };
1167ec681f3Smrg
1177ec681f3Smrg   for (unsigned i = 0; i < ARRAY_SIZE(drivers); i++) {
1187ec681f3Smrg      struct pipe_screen *screen = sw_screen_create_named(winsys, drivers[i]);
1197ec681f3Smrg      if (screen)
1207ec681f3Smrg         return screen;
1217ec681f3Smrg      /* If the env var is set, don't keep trying things */
1227ec681f3Smrg      else if (i == 0 && drivers[i][0] != '\0')
1237ec681f3Smrg         return NULL;
1247ec681f3Smrg   }
1257ec681f3Smrg   return NULL;
12601e04c3fSmrg}
12701e04c3fSmrg
1287ec681f3Smrgstruct pipe_screen *
1297ec681f3Smrgsw_screen_create(struct sw_winsys *winsys)
1307ec681f3Smrg{
1317ec681f3Smrg   return sw_screen_create_vk(winsys, false);
1327ec681f3Smrg}
13301e04c3fSmrg#endif
134