From: George Sapountzis Date: Fri, 19 Mar 2010 00:38:11 +0000 (+0200) Subject: gallium: add soft screen helper X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f87a5f6499f51f651c2a9f2d4682875b22926905;p=mesa.git gallium: add soft screen helper --- diff --git a/src/gallium/auxiliary/target-helpers/soft_screen.c b/src/gallium/auxiliary/target-helpers/soft_screen.c new file mode 100644 index 00000000000..00d386ee1de --- /dev/null +++ b/src/gallium/auxiliary/target-helpers/soft_screen.c @@ -0,0 +1,73 @@ +/************************************************************************** + * + * Copyright 2010 VMware, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * + **************************************************************************/ + +#include "target-helpers/soft_screen.h" +#include "softpipe/sp_public.h" +#include "llvmpipe/lp_public.h" +#include "cell/ppu/cell_public.h" +#include "util/u_debug.h" + +/** + * Choose and create a software renderer screen. + */ +struct pipe_screen * +gallium_soft_create_screen( struct sw_winsys *winsys ) +{ + const char *default_driver = NULL; + const char *driver = NULL; + 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; +} diff --git a/src/gallium/auxiliary/target-helpers/soft_screen.h b/src/gallium/auxiliary/target-helpers/soft_screen.h new file mode 100644 index 00000000000..5c1012644aa --- /dev/null +++ b/src/gallium/auxiliary/target-helpers/soft_screen.h @@ -0,0 +1,12 @@ +#ifndef SOFT_SCREEN_HELPER_H +#define SOFT_SCREEN_HELPER_H + +#include "pipe/p_compiler.h" + +struct pipe_screen; +struct sw_winsys; + +struct pipe_screen * +gallium_soft_create_screen( struct sw_winsys *winsys ); + +#endif diff --git a/src/gallium/targets/libgl-xlib/Makefile b/src/gallium/targets/libgl-xlib/Makefile index 5a4e035c2eb..2c44a62102e 100644 --- a/src/gallium/targets/libgl-xlib/Makefile +++ b/src/gallium/targets/libgl-xlib/Makefile @@ -27,6 +27,7 @@ DEFINES += \ #-DGALLIUM_CELL will be defined by the config */ XLIB_TARGET_SOURCES = \ + soft_screen.c \ xlib.c diff --git a/src/gallium/targets/libgl-xlib/soft_screen.c b/src/gallium/targets/libgl-xlib/soft_screen.c new file mode 120000 index 00000000000..d6d878f3658 --- /dev/null +++ b/src/gallium/targets/libgl-xlib/soft_screen.c @@ -0,0 +1 @@ +../../auxiliary/target-helpers/soft_screen.c \ No newline at end of file diff --git a/src/gallium/targets/libgl-xlib/xlib.c b/src/gallium/targets/libgl-xlib/xlib.c index 48e79fe4f3b..e7862212106 100644 --- a/src/gallium/targets/libgl-xlib/xlib.c +++ b/src/gallium/targets/libgl-xlib/xlib.c @@ -36,6 +36,7 @@ #include "softpipe/sp_public.h" #include "llvmpipe/lp_public.h" #include "cell/ppu/cell_public.h" +#include "target-helpers/soft_screen.h" #include "target-helpers/wrap_screen.h" #include "xm_public.h" @@ -63,8 +64,6 @@ PUBLIC const struct st_module st_module_OpenGL = { static struct pipe_screen * swrast_xlib_create_screen( Display *display ) { - const char *default_driver; - const char *driver; struct sw_winsys *winsys; struct pipe_screen *screen = NULL; @@ -75,36 +74,7 @@ swrast_xlib_create_screen( Display *display ) if (winsys == NULL) return 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); - - /* Create a software rasterizer on top of that winsys: - */ -#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 + screen = gallium_soft_create_screen( winsys ); if (screen == NULL) goto fail; diff --git a/src/gallium/winsys/drm/sw/Makefile b/src/gallium/winsys/drm/sw/Makefile index 5f3c3ec325d..12b20cbd454 100644 --- a/src/gallium/winsys/drm/sw/Makefile +++ b/src/gallium/winsys/drm/sw/Makefile @@ -4,11 +4,12 @@ include $(TOP)/configs/current LIBNAME = swdrm C_SOURCES = \ + soft_screen.c \ wrapper_sw_winsys.c \ sw_drm_api.c LIBRARY_INCLUDES = -LIBRARY_DEFINES = +LIBRARY_DEFINES = -DGALLIUM_SOFTPIPE include ../../../Makefile.template diff --git a/src/gallium/winsys/drm/sw/soft_screen.c b/src/gallium/winsys/drm/sw/soft_screen.c new file mode 120000 index 00000000000..423597ba31f --- /dev/null +++ b/src/gallium/winsys/drm/sw/soft_screen.c @@ -0,0 +1 @@ +../../../auxiliary/target-helpers/soft_screen.c \ No newline at end of file diff --git a/src/gallium/winsys/drm/sw/sw_drm_api.c b/src/gallium/winsys/drm/sw/sw_drm_api.c index 9c5933c73af..ed3ce146eb1 100644 --- a/src/gallium/winsys/drm/sw/sw_drm_api.c +++ b/src/gallium/winsys/drm/sw/sw_drm_api.c @@ -24,8 +24,11 @@ **********************************************************/ +#include "pipe/p_screen.h" #include "util/u_memory.h" -#include "softpipe/sp_public.h" +#include "target-helpers/soft_screen.h" + +#include "state_tracker/sw_winsys.h" #include "state_tracker/drm_api.h" #include "wrapper_sw_winsys.h" #include "sw_drm_api.h" @@ -60,14 +63,35 @@ sw_drm_create_screen(struct drm_api *_api, int drmFD, { struct sw_drm_api *swapi = sw_drm_api(_api); struct drm_api *api = swapi->api; - struct sw_winsys *sww; - struct pipe_screen *screen; + struct sw_winsys *sww = NULL; + struct pipe_screen *screen = NULL; + struct pipe_screen *soft_screen = NULL; screen = api->create_screen(api, drmFD, arg); + if (screen == NULL) + goto fail; sww = wrapper_sw_winsys_warp_pipe_screen(screen); + if (sww == NULL) + goto fail; + + soft_screen = gallium_soft_create_screen(sww); + if (soft_screen == NULL) + goto fail; + + return soft_screen; + +fail: + if (soft_screen) + soft_screen->destroy(soft_screen); + + if (sww) + sww->destroy(sww); + + if (screen) + screen->destroy(screen); - return softpipe_create_screen(sww); + return NULL; } static void