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