summaryrefslogtreecommitdiff
path: root/src/gallium/targets/graw-null
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2010-08-26 11:37:42 +0100
committerJosé Fonseca <jfonseca@vmware.com>2010-08-26 11:37:42 +0100
commit90437330e2886fcd351dd11ee0e5aa3e8b523fdc (patch)
treec315c0b32a29b28a05b7efff7e3075d908c5c0b2 /src/gallium/targets/graw-null
parent0f74efdef05c5c27b3137163d795dc91f34cc114 (diff)
graw: Undo late loading of graw drivers.
Keith prefers a clean separation between graw applications and implementations, where apps do not link libgallium.a but instead get all functionality they need via graw interface. Although this is not incompatible with late loading of graw drivers, it it would make it very hard to maintain, as wrappers for every utility symbol exposed in graw would have to be written or generated somehow.
Diffstat (limited to 'src/gallium/targets/graw-null')
-rw-r--r--src/gallium/targets/graw-null/SConscript58
-rw-r--r--src/gallium/targets/graw-null/graw_null.c95
2 files changed, 153 insertions, 0 deletions
diff --git a/src/gallium/targets/graw-null/SConscript b/src/gallium/targets/graw-null/SConscript
new file mode 100644
index 0000000000..3416989d8e
--- /dev/null
+++ b/src/gallium/targets/graw-null/SConscript
@@ -0,0 +1,58 @@
+#######################################################################
+# SConscript for xlib winsys
+
+Import('*')
+
+env = env.Clone()
+
+env.Prepend(LIBS = [
+ ws_null,
+ trace,
+ rbug,
+ identity,
+# gallium,
+])
+
+env.Append(CPPPATH = [
+ '#src/gallium/drivers',
+])
+
+if env['platform'] == 'windows':
+ # For trace
+ env.Append(LIBS = [
+ 'ws2_32',
+ ])
+
+sources = [
+ 'graw_null.c',
+ '../graw-xlib/graw_util.c',
+]
+
+if True:
+ env.Append(CPPDEFINES = 'GALLIUM_SOFTPIPE')
+ env.Prepend(LIBS = [softpipe])
+
+if env['llvm']:
+ env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
+ env.Tool('udis86')
+ env.Prepend(LIBS = [llvmpipe])
+
+# Need this for trace, identity drivers referenced by
+# gallium_wrap_screen().
+#
+env.Prepend(LIBS = [gallium])
+
+# TODO: write a wrapper function http://www.scons.org/wiki/WrapperFunctions
+graw = env.SharedLibrary(
+ target ='graw',
+ source = sources,
+)
+
+env.InstallSharedLibrary(graw, version=(1, 0))
+
+if env['platform'] == 'windows':
+ graw = env.FindIxes(graw, 'LIBPREFIX', 'LIBSUFFIX')
+else:
+ graw = env.FindIxes(graw, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+
+Export('graw')
diff --git a/src/gallium/targets/graw-null/graw_null.c b/src/gallium/targets/graw-null/graw_null.c
new file mode 100644
index 0000000000..5939a5acd3
--- /dev/null
+++ b/src/gallium/targets/graw-null/graw_null.c
@@ -0,0 +1,95 @@
+#include "pipe/p_compiler.h"
+#include "util/u_debug.h"
+#include "util/u_memory.h"
+#include "target-helpers/wrap_screen.h"
+#include "sw/null/null_sw_winsys.h"
+#include "os/os_time.h"
+#include "state_tracker/graw.h"
+
+#ifdef GALLIUM_SOFTPIPE
+#include "softpipe/sp_public.h"
+#endif
+
+#ifdef GALLIUM_LLVMPIPE
+#include "llvmpipe/lp_public.h"
+#endif
+
+/* Haven't figured out a decent way to build the helper code yet -
+ * #include it here temporarily.
+ */
+#include "sw/sw_public.h"
+#include "sw/sw.c"
+
+#include <stdio.h>
+
+
+static struct {
+ void (*draw)(void);
+} graw;
+
+
+
+struct pipe_screen *
+graw_create_window_and_screen( int x,
+ int y,
+ unsigned width,
+ unsigned height,
+ enum pipe_format format,
+ void **handle)
+{
+ const char *default_driver;
+ const char *driver;
+ struct pipe_screen *screen = NULL;
+ struct sw_winsys *winsys = NULL;
+ static int dummy;
+
+
+ /* Create the underlying winsys, which performs presents to Xlib
+ * drawables:
+ */
+ winsys = null_sw_create();
+ if (winsys == NULL)
+ return NULL;
+
+#if 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_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
+
+ *handle = &dummy;
+
+ /* Inject any wrapping layers we want to here:
+ */
+ return gallium_wrap_screen( screen );
+}
+
+
+
+void
+graw_set_display_func( void (*draw)( void ) )
+{
+ graw.draw = draw;
+}
+
+
+void
+graw_main_loop( void )
+{
+ graw.draw();
+ os_time_sleep(100000);
+}