Path: blob/21.2-virgl/src/gallium/auxiliary/target-helpers/inline_sw_helper.h
4561 views
1#ifndef INLINE_SW_HELPER_H2#define INLINE_SW_HELPER_H34#include "pipe/p_compiler.h"5#include "util/u_debug.h"6#include "util/debug.h"7#include "frontend/sw_winsys.h"8#include "target-helpers/inline_debug_helper.h"910#ifdef GALLIUM_SWR11#include "swr/swr_public.h"12#endif1314/* Helper function to choose and instantiate one of the software rasterizers:15* llvmpipe, softpipe.16*/1718#ifdef GALLIUM_SOFTPIPE19#include "softpipe/sp_public.h"20#endif2122#ifdef GALLIUM_LLVMPIPE23#include "llvmpipe/lp_public.h"24#endif2526#ifdef GALLIUM_VIRGL27#include "virgl/virgl_public.h"28#include "virgl/vtest/virgl_vtest_public.h"29#endif3031#ifdef GALLIUM_D3D1232#include "d3d12/d3d12_public.h"33#endif3435#ifdef GALLIUM_ASAHI36#include "asahi/agx_public.h"37#endif3839#ifdef GALLIUM_ZINK40struct pipe_screen *zink_create_screen(struct sw_winsys *winsys);41#endif4243static inline struct pipe_screen *44sw_screen_create_named(struct sw_winsys *winsys, const char *driver)45{46struct pipe_screen *screen = NULL;4748#if defined(GALLIUM_LLVMPIPE)49if (screen == NULL && strcmp(driver, "llvmpipe") == 0)50screen = llvmpipe_create_screen(winsys);51#endif5253#if defined(GALLIUM_VIRGL)54if (screen == NULL && strcmp(driver, "virpipe") == 0) {55struct virgl_winsys *vws;56vws = virgl_vtest_winsys_wrap(winsys);57screen = virgl_create_screen(vws, NULL);58}59#endif6061#if defined(GALLIUM_SOFTPIPE)62if (screen == NULL && strcmp(driver, "softpipe") == 0)63screen = softpipe_create_screen(winsys);64#endif6566#if defined(GALLIUM_SWR)67if (screen == NULL && strcmp(driver, "swr") == 0)68screen = swr_create_screen(winsys);69#endif7071#if defined(GALLIUM_ZINK)72if (screen == NULL && strcmp(driver, "zink") == 0)73screen = zink_create_screen(winsys);74#endif7576#if defined(GALLIUM_D3D12)77if (screen == NULL && strcmp(driver, "d3d12") == 0)78screen = d3d12_create_dxcore_screen(winsys, NULL);79#endif8081#if defined(GALLIUM_ASAHI)82if (screen == NULL && strcmp(driver, "asahi") == 0)83screen = agx_screen_create(winsys);84#endif8586return screen ? debug_screen_wrap(screen) : NULL;87}888990static inline struct pipe_screen *91sw_screen_create_vk(struct sw_winsys *winsys, bool sw_vk)92{93UNUSED bool only_sw = env_var_as_boolean("LIBGL_ALWAYS_SOFTWARE", false);94const char *drivers[] = {95(sw_vk ? "" : debug_get_option("GALLIUM_DRIVER", "")),96#if defined(GALLIUM_D3D12)97(sw_vk || only_sw) ? "" : "d3d12",98#endif99#if defined(GALLIUM_ASAHI)100(sw_vk || only_sw) ? "" : "asahi",101#endif102#if defined(GALLIUM_LLVMPIPE)103"llvmpipe",104#endif105#if defined(GALLIUM_SOFTPIPE)106(sw_vk ? "" : "softpipe"),107#endif108#if defined(GALLIUM_SWR)109(sw_vk ? "" : "swr"),110#endif111#if defined(GALLIUM_ZINK)112(sw_vk || only_sw) ? "" : "zink",113#endif114};115116for (unsigned i = 0; i < ARRAY_SIZE(drivers); i++) {117struct pipe_screen *screen = sw_screen_create_named(winsys, drivers[i]);118if (screen)119return screen;120/* If the env var is set, don't keep trying things */121else if (i == 0 && drivers[i][0] != '\0')122return NULL;123}124return NULL;125}126127static inline struct pipe_screen *128sw_screen_create(struct sw_winsys *winsys)129{130return sw_screen_create_vk(winsys, false);131}132#endif133134135