diff options
-rw-r--r-- | src/gallium/state_trackers/dri/sw/drisw.c | 6 | ||||
-rw-r--r-- | src/gallium/targets/dri-swrast/swrast_drm_api.c | 70 | ||||
-rw-r--r-- | src/gallium/targets/libgl-xlib/xlib.c | 64 |
3 files changed, 98 insertions, 42 deletions
diff --git a/src/gallium/state_trackers/dri/sw/drisw.c b/src/gallium/state_trackers/dri/sw/drisw.c index 8999ae530f2..745941d5501 100644 --- a/src/gallium/state_trackers/dri/sw/drisw.c +++ b/src/gallium/state_trackers/dri/sw/drisw.c @@ -48,12 +48,6 @@ * for createImage/destroyImage similar to DRI2 getBuffers. Probably not worth * it, given the scope of DRISW, unless it falls naturally from properly * solving the above two issues. - * - * swrast_create_screen: - * - * Allow for any software renderer to be used. Factor out the code from - * targets/libgl-xlib/xlib.c, put it in targets/common or winsys/sw/common and - * use it in all software targets. */ #include "util/u_memory.h" diff --git a/src/gallium/targets/dri-swrast/swrast_drm_api.c b/src/gallium/targets/dri-swrast/swrast_drm_api.c index 224651603d1..1fdfcccf883 100644 --- a/src/gallium/targets/dri-swrast/swrast_drm_api.c +++ b/src/gallium/targets/dri-swrast/swrast_drm_api.c @@ -32,6 +32,16 @@ #include "state_tracker/sw_winsys.h" #include "dri_sw_winsys.h" +/* Copied from targets/libgl-xlib. + * + * TODO: + * This function should be put in targets/common or winsys/sw/common and shared + * with targets/libgl-xlib and winsys/sw/drm. + * + * For targets/common, you get layering violations in the build system unless + * all of drm_api's are moved under targets. + */ + #ifdef GALLIUM_SOFTPIPE #include "softpipe/sp_public.h" #endif @@ -40,10 +50,51 @@ #include "llvmpipe/lp_public.h" #endif +#ifdef GALLIUM_CELL +#include "cell/ppu/cell_public.h" +#endif + static struct pipe_screen * -swrast_create_screen(struct drm_api *api, - int drmFD, - struct drm_create_screen_arg *arg) +swrast_create_screen(struct sw_winsys *winsys) +{ + const char *default_driver; + const char *driver; + struct pipe_screen *screen = NULL; + +#if defined(GALLIUM_CELL) + default_driver = "cell"; +#elif defined(GALLIUM_LLVMPIPE) + default_driver = "llvmpipe"; +#elif defined(GALLIUM_SOFTPIPE) + default_driver = "softpipe"; +#else + default_driver = ""; +#endif + + driver = debug_get_option("GALLIUM_DRIVER", default_driver); + +#if defined(GALLIUM_CELL) + if (screen == NULL && strcmp(driver, "cell") == 0) + screen = cell_create_screen( winsys ); +#endif + +#if defined(GALLIUM_LLVMPIPE) + if (screen == NULL && strcmp(driver, "llvmpipe") == 0) + screen = llvmpipe_create_screen( winsys ); +#endif + +#if defined(GALLIUM_SOFTPIPE) + if (screen == NULL) + screen = softpipe_create_screen( winsys ); +#endif + + return screen; +} + +static struct pipe_screen * +swrast_drm_create_screen(struct drm_api *api, + int drmFD, + struct drm_create_screen_arg *arg) { struct sw_winsys *winsys = NULL; struct pipe_screen *screen = NULL; @@ -63,16 +114,7 @@ swrast_create_screen(struct drm_api *api, if (winsys == NULL) return NULL; -#ifdef GALLIUM_LLVMPIPE - if (!screen) - screen = llvmpipe_create_screen(winsys); -#endif - -#ifdef GALLIUM_SOFTPIPE - if (!screen) - screen = softpipe_create_screen(winsys); -#endif - + screen = swrast_create_screen(winsys); if (!screen) goto fail; @@ -95,7 +137,7 @@ static struct drm_api swrast_drm_api = { .name = "swrast", .driver_name = "swrast", - .create_screen = swrast_create_screen, + .create_screen = swrast_drm_create_screen, .destroy = swrast_drm_api_destroy, }; diff --git a/src/gallium/targets/libgl-xlib/xlib.c b/src/gallium/targets/libgl-xlib/xlib.c index 48e79fe4f3b..4a8366280d8 100644 --- a/src/gallium/targets/libgl-xlib/xlib.c +++ b/src/gallium/targets/libgl-xlib/xlib.c @@ -31,12 +31,9 @@ * Keith Whitwell */ #include "pipe/p_compiler.h" -#include "state_tracker/xlib_sw_winsys.h" #include "util/u_debug.h" -#include "softpipe/sp_public.h" -#include "llvmpipe/lp_public.h" -#include "cell/ppu/cell_public.h" #include "target-helpers/wrap_screen.h" +#include "state_tracker/xlib_sw_winsys.h" #include "xm_public.h" #include "state_tracker/st_manager.h" @@ -49,9 +46,8 @@ PUBLIC const struct st_module st_module_OpenGL = { .create_api = st_manager_create_api }; -/* Helper function to build a subset of a driver stack consisting of - * one of the software rasterizers (cell, llvmpipe, softpipe) and the - * xlib winsys. +/* Helper function to choose and instantiate one of the software rasterizers: + * cell, llvmpipe, softpipe. * * This function could be shared, but currently causes headaches for * the build systems, particularly scons if we try. Long term, want @@ -60,21 +56,26 @@ PUBLIC const struct st_module st_module_OpenGL = { * things that are painful for it now are likely to be painful for * other build systems in the future. */ + +#ifdef GALLIUM_SOFTPIPE +#include "softpipe/sp_public.h" +#endif + +#ifdef GALLIUM_LLVMPIPE +#include "llvmpipe/lp_public.h" +#endif + +#ifdef GALLIUM_CELL +#include "cell/ppu/cell_public.h" +#endif + static struct pipe_screen * -swrast_xlib_create_screen( Display *display ) +swrast_create_screen(struct sw_winsys *winsys) { const char *default_driver; const char *driver; - struct sw_winsys *winsys; struct pipe_screen *screen = NULL; - /* Create the underlying winsys, which performs presents to Xlib - * drawables: - */ - winsys = xlib_create_sw_winsys( display ); - if (winsys == NULL) - return NULL; - #if defined(GALLIUM_CELL) default_driver = "cell"; #elif defined(GALLIUM_LLVMPIPE) @@ -87,17 +88,13 @@ swrast_xlib_create_screen( Display *display ) driver = debug_get_option("GALLIUM_DRIVER", default_driver); - /* Create a software rasterizer on top of that winsys: - */ #if defined(GALLIUM_CELL) - if (screen == NULL && - strcmp(driver, "cell") == 0) + if (screen == NULL && strcmp(driver, "cell") == 0) screen = cell_create_screen( winsys ); #endif #if defined(GALLIUM_LLVMPIPE) - if (screen == NULL && - strcmp(driver, "llvmpipe") == 0) + if (screen == NULL && strcmp(driver, "llvmpipe") == 0) screen = llvmpipe_create_screen( winsys ); #endif @@ -106,6 +103,29 @@ swrast_xlib_create_screen( Display *display ) screen = softpipe_create_screen( winsys ); #endif + return screen; +} + +/* Helper function to build a subset of a driver stack consisting of + * one of the software rasterizers (cell, llvmpipe, softpipe) and the + * xlib winsys. + */ +static struct pipe_screen * +swrast_xlib_create_screen( Display *display ) +{ + struct sw_winsys *winsys; + struct pipe_screen *screen = NULL; + + /* Create the underlying winsys, which performs presents to Xlib + * drawables: + */ + winsys = xlib_create_sw_winsys( display ); + if (winsys == NULL) + return NULL; + + /* Create a software rasterizer on top of that winsys: + */ + screen = swrast_create_screen( winsys ); if (screen == NULL) goto fail; |