libgl-xlib: enable galahad support
[mesa.git] / src / gallium / targets / libgl-xlib / xlib.c
index 05dc8db57d97969969801516912f11711d6eeaa0..5914f63352a147da59faad17761bf5da4f44bbc5 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"
 
-/* advertise OpenGL support */
-PUBLIC const int st_api_OpenGL = 1;
+#include "state_tracker/st_api.h"
+#include "state_tracker/st_gl_api.h"
 
+/* piggy back on this libGL for OpenGL support in EGL */
+struct st_api *
+st_api_create_OpenGL()
+{
+   return st_gl_api_create();
+}
 
-/* 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
@@ -53,37 +56,97 @@ PUBLIC const int st_api_OpenGL = 1;
  * GALLIUM_CELL, etc.  Scons already eliminates those #defines, so
  * things that are painful for it now are likely to be painful for
  * other build systems in the future.
+ *
+ * Copies (full or partial):
+ *    targets/libgl-xlib
+ *    targets/graw-xlib
+ *    targets/dri-swrast
+ *    winsys/sw/drm
+ *    drivers/sw
+ *
  */
+
+#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
+
+#ifdef GALLIUM_GALAHAD
+#include "galahad/glhd_public.h"
+#endif
+
 static struct pipe_screen *
-swrast_xlib_create_screen( Display *display )
+swrast_create_screen(struct sw_winsys *winsys)
 {
-   struct sw_winsys *winsys;
+   const char *default_driver;
+   const char *driver;
    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)
+   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 &&
-       !debug_get_bool_option("GALLIUM_NO_CELL", FALSE))
+   if (screen == NULL && strcmp(driver, "cell") == 0)
       screen = cell_create_screen( winsys );
 #endif
 
 #if defined(GALLIUM_LLVMPIPE)
-   if (screen == NULL &&
-       !debug_get_bool_option("GALLIUM_NO_LLVM", FALSE))
+   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
 
+#if defined(GALLIUM_GALAHAD)
+   if (screen) {
+      struct pipe_screen *galahad_screen = galahad_screen_create(screen);
+      if (galahad_screen)
+         screen = galahad_screen;
+   }
+#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;
 
@@ -98,9 +161,10 @@ fail:
    return NULL;
 }
 
-struct xm_driver xlib_driver = 
+static struct xm_driver xlib_driver = 
 {
    .create_pipe_screen = swrast_xlib_create_screen,
+   .create_st_api = st_gl_api_create,
 };