George,

This is basically a reproduction of a facility I had in target-helpers
previously (swrast_screen.c or similar), which I removed after
feedback from Jose that supporting it with scons created more ugliness
than we saved in the C code.

This change breaks layering in the build system by making code in the
utility libraries conditionally built depending on which targets we're
supporting.  Ideally the code in auxilliary wouldn't have any idea
whether softpipe, llvmpipe or any other driver is out there.

For the meantime, I'd say just duplicate the function in the few
places which use it.  There aren't many currently.  Longer term, I
think we probably want a little targets/common or similar, rather than
trying to bundle this into auxilliary.

Keith

On Sun, Mar 21, 2010 at 11:24 AM, George Sapountzis
<gs...@kemper.freedesktop.org> wrote:
> Module: Mesa
> Branch: master
> Commit: f87a5f6499f51f651c2a9f2d4682875b22926905
> URL:    
> http://cgit.freedesktop.org/mesa/mesa/commit/?id=f87a5f6499f51f651c2a9f2d4682875b22926905
>
> Author: George Sapountzis <gsapount...@gmail.com>
> Date:   Fri Mar 19 02:38:11 2010 +0200
>
> gallium: add soft screen helper
>
> ---
>
>  src/gallium/auxiliary/target-helpers/soft_screen.c |   73 
> ++++++++++++++++++++
>  src/gallium/auxiliary/target-helpers/soft_screen.h |   12 +++
>  src/gallium/targets/libgl-xlib/Makefile            |    1 +
>  src/gallium/targets/libgl-xlib/soft_screen.c       |    1 +
>  src/gallium/targets/libgl-xlib/xlib.c              |   34 +---------
>  src/gallium/winsys/drm/sw/Makefile                 |    3 +-
>  src/gallium/winsys/drm/sw/soft_screen.c            |    1 +
>  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 0000000..00d386e
> --- /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 0000000..5c10126
> --- /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 5a4e035..2c44a62 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 0000000..d6d878f
> --- /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 48e79fe..e786221 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 5f3c3ec..12b20cb 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 0000000..423597b
> --- /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 9c5933c..ed3ce14 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
>
> _______________________________________________
> mesa-commit mailing list
> mesa-com...@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-commit
>

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to