swrastg: allow for any of the software rasterizers.
authorGeorge Sapountzis <gsapountzis@gmail.com>
Fri, 26 Mar 2010 16:44:40 +0000 (18:44 +0200)
committerGeorge Sapountzis <gsapountzis@gmail.com>
Fri, 26 Mar 2010 16:44:40 +0000 (18:44 +0200)
This function should be put in targets/common or winsys/sw/common and shared
with targers/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.

src/gallium/state_trackers/dri/sw/drisw.c
src/gallium/targets/dri-swrast/swrast_drm_api.c
src/gallium/targets/libgl-xlib/xlib.c

index 8999ae5..745941d 100644 (file)
  * 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"
index 2246516..1fdfccc 100644 (file)
 #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
 #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,
 };
 
index 48e79fe..4a83662 100644 (file)
  *   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;