Path: blob/21.2-virgl/src/gallium/auxiliary/target-helpers/sw_helper.h
4561 views
1#ifndef SW_HELPER_H2#define SW_HELPER_H34#include "pipe/p_compiler.h"5#include "util/u_debug.h"6#include "util/debug.h"7#include "target-helpers/sw_helper_public.h"8#include "frontend/sw_winsys.h"91011/* Helper function to choose and instantiate one of the software rasterizers:12* llvmpipe, softpipe, swr.13*/1415#ifdef GALLIUM_ZINK16#include "zink/zink_public.h"17#endif1819#ifdef GALLIUM_D3D1220#include "d3d12/d3d12_public.h"21#endif2223#ifdef GALLIUM_ASAHI24#include "asahi/agx_public.h"25#endif2627#ifdef GALLIUM_SOFTPIPE28#include "softpipe/sp_public.h"29#endif3031#ifdef GALLIUM_LLVMPIPE32#include "llvmpipe/lp_public.h"33#endif3435#ifdef GALLIUM_SWR36#include "swr/swr_public.h"37#endif3839#ifdef GALLIUM_VIRGL40#include "virgl/virgl_public.h"41#include "virgl/vtest/virgl_vtest_public.h"42#endif4344static inline struct pipe_screen *45sw_screen_create_named(struct sw_winsys *winsys, const char *driver)46{47struct pipe_screen *screen = NULL;4849#if defined(GALLIUM_LLVMPIPE)50if (screen == NULL && strcmp(driver, "llvmpipe") == 0)51screen = llvmpipe_create_screen(winsys);52#endif5354#if defined(GALLIUM_VIRGL)55if (screen == NULL && strcmp(driver, "virpipe") == 0) {56struct virgl_winsys *vws;57vws = virgl_vtest_winsys_wrap(winsys);58screen = virgl_create_screen(vws, NULL);59}60#endif6162#if defined(GALLIUM_SOFTPIPE)63if (screen == NULL && strcmp(driver, "softpipe") == 0)64screen = softpipe_create_screen(winsys);65#endif6667#if defined(GALLIUM_SWR)68if (screen == NULL && strcmp(driver, "swr") == 0)69screen = swr_create_screen(winsys);70#endif7172#if defined(GALLIUM_ZINK)73if (screen == NULL && strcmp(driver, "zink") == 0)74screen = zink_create_screen(winsys);75#endif7677#if defined(GALLIUM_D3D12)78if (screen == NULL && strcmp(driver, "d3d12") == 0)79screen = d3d12_create_dxcore_screen(winsys, NULL);80#endif8182#if defined(GALLIUM_ASAHI)83if (screen == NULL && strcmp(driver, "asahi") == 0)84screen = agx_screen_create(winsys);85#endif8687return screen;88}8990struct 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)106sw_vk ? "" : "softpipe",107#endif108#if defined(GALLIUM_SWR)109sw_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}126127struct pipe_screen *128sw_screen_create(struct sw_winsys *winsys)129{130return sw_screen_create_vk(winsys, false);131}132#endif133134135