summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Sapountzis <gsapountzis@gmail.com>2010-03-26 18:44:40 +0200
committerGeorge Sapountzis <gsapountzis@gmail.com>2010-03-26 18:44:40 +0200
commit3ae082f00cad3f2323a3747fe3b6f02b8f8c5285 (patch)
treed5f74c2988cb77070d3a6b6e09bd69b720c2be6c
parentd9b6552d85cfe54f2e8b9c277e05e23d84058e0b (diff)
swrastg: allow for any of the software rasterizers.
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.
-rw-r--r--src/gallium/state_trackers/dri/sw/drisw.c6
-rw-r--r--src/gallium/targets/dri-swrast/swrast_drm_api.c70
-rw-r--r--src/gallium/targets/libgl-xlib/xlib.c64
3 files changed, 98 insertions, 42 deletions
diff --git a/src/gallium/state_trackers/dri/sw/drisw.c b/src/gallium/state_trackers/dri/sw/drisw.c
index 8999ae530f..745941d550 100644
--- a/src/gallium/state_trackers/dri/sw/drisw.c
+++ b/src/gallium/state_trackers/dri/sw/drisw.c
@@ -48,12 +48,6 @@
* 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"
diff --git a/src/gallium/targets/dri-swrast/swrast_drm_api.c b/src/gallium/targets/dri-swrast/swrast_drm_api.c
index 224651603d..1fdfcccf88 100644
--- a/src/gallium/targets/dri-swrast/swrast_drm_api.c
+++ b/src/gallium/targets/dri-swrast/swrast_drm_api.c
@@ -32,6 +32,16 @@
#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
@@ -40,10 +50,51 @@
#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,
};
diff --git a/src/gallium/targets/libgl-xlib/xlib.c b/src/gallium/targets/libgl-xlib/xlib.c
index 48e79fe4f3..4a8366280d 100644
--- a/src/gallium/targets/libgl-xlib/xlib.c
+++ b/src/gallium/targets/libgl-xlib/xlib.c
@@ -31,12 +31,9 @@
* 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;