diff options
| -rw-r--r-- | src/gallium/auxiliary/target-helpers/soft_screen.c | 73 | ||||
| -rw-r--r-- | src/gallium/auxiliary/target-helpers/soft_screen.h | 12 | ||||
| -rw-r--r-- | src/gallium/targets/libgl-xlib/Makefile | 1 | ||||
| l--------- | src/gallium/targets/libgl-xlib/soft_screen.c | 1 | ||||
| -rw-r--r-- | src/gallium/targets/libgl-xlib/xlib.c | 34 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/sw/Makefile | 3 | ||||
| l--------- | src/gallium/winsys/drm/sw/soft_screen.c | 1 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/sw/sw_drm_api.c | 32 | 
8 files changed, 120 insertions, 37 deletions
| 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 0000000000..00d386ee1d --- /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 0000000000..5c1012644a --- /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 5a4e035c2e..2c44a62102 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 0000000000..d6d878f365 --- /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 48e79fe4f3..e786221210 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 5f3c3ec325..12b20cbd45 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 0000000000..423597ba31 --- /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 9c5933c73a..ed3ce146eb 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 | 
