summaryrefslogtreecommitdiff
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
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.
-rw-r--r--SConstruct3
-rw-r--r--src/gallium/include/state_tracker/graw_dl.h153
-rw-r--r--src/gallium/targets/SConscript5
-rw-r--r--src/gallium/targets/graw-null/SConscript58
-rw-r--r--src/gallium/targets/graw-null/graw_null.c95
-rw-r--r--src/gallium/targets/graw-xlib/SConscript1
-rw-r--r--src/gallium/targets/graw-xlib/graw_util.c50
-rw-r--r--src/gallium/tests/graw/SConscript9
-rw-r--r--src/gallium/tests/graw/clear.c2
-rw-r--r--src/gallium/tests/graw/fs-test.c2
-rw-r--r--src/gallium/tests/graw/gs-test.c2
-rw-r--r--src/gallium/tests/graw/quad-tex.c2
-rw-r--r--src/gallium/tests/graw/tri-gs.c2
-rw-r--r--src/gallium/tests/graw/tri-instanced.c2
-rw-r--r--src/gallium/tests/graw/tri.c2
-rw-r--r--src/gallium/tests/graw/vs-test.c2
16 files changed, 227 insertions, 163 deletions
diff --git a/SConstruct b/SConstruct
index 14663727f5..bb03e5055e 100644
--- a/SConstruct
+++ b/SConstruct
@@ -31,7 +31,7 @@ import common
# Configuration options
default_statetrackers = 'mesa'
-default_targets = 'none'
+default_targets = 'graw-null'
if common.default_platform in ('linux', 'freebsd', 'darwin'):
default_drivers = 'softpipe,failover,svga,i915,i965,trace,identity,llvmpipe'
@@ -69,6 +69,7 @@ opts.Add(ListVariable('targets', 'driver targets to build', default_targets,
'egl-swrast',
'egl-vmwgfx',
'graw-xlib',
+ 'graw-null',
'libgl-gdi',
'libgl-xlib',
'xorg-i915',
diff --git a/src/gallium/include/state_tracker/graw_dl.h b/src/gallium/include/state_tracker/graw_dl.h
deleted file mode 100644
index 3c5c3d8647..0000000000
--- a/src/gallium/include/state_tracker/graw_dl.h
+++ /dev/null
@@ -1,153 +0,0 @@
-#ifndef GALLIUM_RAW_DL_H
-#define GALLIUM_RAW_DL_H
-
-/* This is an API for exercising gallium functionality in a
- * platform-neutral fashion. Whatever platform integration is
- * necessary to implement this interface is orchestrated by the
- * individual target building this entity.
- *
- * For instance, the graw-xlib target includes code to implent these
- * interfaces on top of the X window system.
- *
- * Programs using this interface may additionally benefit from some of
- * the utilities currently in the libgallium.a library, especially
- * those for parsing text representations of TGSI shaders.
- */
-
-#include <stdio.h>
-#include "pipe/p_compiler.h"
-#include "pipe/p_context.h"
-#include "pipe/p_format.h"
-#include "pipe/p_state.h"
-#include "util/u_dl.h"
-#include "tgsi/tgsi_text.h"
-
-
-struct pipe_screen;
-struct pipe_context;
-
-
-typedef void *
-(*pfn_graw_create_window_and_screen_t)( int x,
- int y,
- unsigned width,
- unsigned height,
- enum pipe_format format,
- void **handle );
-
-typedef void
-(*pfn_graw_set_display_func_t)( void (*func)( void ) );
-
-typedef void
-(*pfn_graw_main_loop_t)( void );
-
-
-static pfn_graw_create_window_and_screen_t
-pfn_graw_create_window_and_screen = NULL;
-
-static pfn_graw_set_display_func_t
-pfn_graw_set_display_func = NULL;
-
-static pfn_graw_main_loop_t
-pfn_graw_main_loop = NULL;
-
-
-static INLINE void *
-graw_create_window_and_screen( int x,
- int y,
- unsigned width,
- unsigned height,
- enum pipe_format format,
- void **handle )
-{
- static struct util_dl_library *lib;
- lib = util_dl_open(UTIL_DL_PREFIX "graw" UTIL_DL_EXT);
- if (!lib)
- goto error;
- pfn_graw_create_window_and_screen = (pfn_graw_create_window_and_screen_t)
- util_dl_get_proc_address(lib, "graw_create_window_and_screen");
- if (!pfn_graw_create_window_and_screen)
- goto error;
- pfn_graw_set_display_func = (pfn_graw_set_display_func_t)
- util_dl_get_proc_address(lib, "graw_set_display_func");
- if (!pfn_graw_set_display_func)
- goto error;
- pfn_graw_main_loop = (pfn_graw_main_loop_t)
- util_dl_get_proc_address(lib, "graw_main_loop");
- if (!pfn_graw_main_loop)
- goto error;
- return pfn_graw_create_window_and_screen(x, y, width, height, format, handle );
-error:
- fprintf(stderr, "failed to open " UTIL_DL_PREFIX "graw" UTIL_DL_EXT "\n");
- return NULL;
-}
-
-static INLINE void
-graw_set_display_func( void (*func)( void ) )
-{
- if (!pfn_graw_set_display_func)
- return;
- pfn_graw_set_display_func(func);
-}
-
-static INLINE void
-graw_main_loop( void )
-{
- if (!pfn_graw_main_loop)
- return;
- pfn_graw_main_loop();
-}
-
-
-/*
- * Helper functions. These are the same for all graw implementations.
- *
- * XXX: These aren't graw related. If they are useful then should go somwhere
- * inside auxiliary/util.
- */
-
-#define GRAW_MAX_NUM_TOKENS 1024
-
-static INLINE void *
-graw_parse_geometry_shader(struct pipe_context *pipe,
- const char *text)
-{
- struct tgsi_token tokens[GRAW_MAX_NUM_TOKENS];
- struct pipe_shader_state state;
-
- if (!tgsi_text_translate(text, tokens, GRAW_MAX_NUM_TOKENS))
- return NULL;
-
- state.tokens = tokens;
- return pipe->create_gs_state(pipe, &state);
-}
-
-static INLINE void *
-graw_parse_vertex_shader(struct pipe_context *pipe,
- const char *text)
-{
- struct tgsi_token tokens[GRAW_MAX_NUM_TOKENS];
- struct pipe_shader_state state;
-
- if (!tgsi_text_translate(text, tokens, GRAW_MAX_NUM_TOKENS))
- return NULL;
-
- state.tokens = tokens;
- return pipe->create_vs_state(pipe, &state);
-}
-
-static INLINE void *
-graw_parse_fragment_shader(struct pipe_context *pipe,
- const char *text)
-{
- struct tgsi_token tokens[GRAW_MAX_NUM_TOKENS];
- struct pipe_shader_state state;
-
- if (!tgsi_text_translate(text, tokens, GRAW_MAX_NUM_TOKENS))
- return NULL;
-
- state.tokens = tokens;
- return pipe->create_fs_state(pipe, &state);
-}
-
-#endif
diff --git a/src/gallium/targets/SConscript b/src/gallium/targets/SConscript
index 7eecdb24c7..e447d09361 100644
--- a/src/gallium/targets/SConscript
+++ b/src/gallium/targets/SConscript
@@ -9,6 +9,11 @@ if 'mesa' in env['statetrackers']:
if 'gdi' in env['winsys'] and 'libgl-gdi' not in env['targets']:
env['targets'].append('libgl-gdi')
+if not 'graw-xlib' in env['targets'] and not 'graw-null' in env['targets'] and not env['msvc']:
+ # XXX: disable until MSVC can link correctly
+ SConscript('graw-null/SConscript')
+
+
if env['dri']:
SConscript([
'SConscript.dri'
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);
+}
diff --git a/src/gallium/targets/graw-xlib/SConscript b/src/gallium/targets/graw-xlib/SConscript
index 32b98cdef3..21fce948f4 100644
--- a/src/gallium/targets/graw-xlib/SConscript
+++ b/src/gallium/targets/graw-xlib/SConscript
@@ -26,6 +26,7 @@ env.Append(CPPPATH = [
sources = [
'graw_xlib.c',
+ 'graw_util.c',
]
env.Tool('x11')
diff --git a/src/gallium/targets/graw-xlib/graw_util.c b/src/gallium/targets/graw-xlib/graw_util.c
new file mode 100644
index 0000000000..fc7c9ae6f9
--- /dev/null
+++ b/src/gallium/targets/graw-xlib/graw_util.c
@@ -0,0 +1,50 @@
+
+#include "pipe/p_compiler.h"
+#include "pipe/p_context.h"
+#include "pipe/p_state.h"
+#include "tgsi/tgsi_text.h"
+#include "util/u_memory.h"
+#include "state_tracker/graw.h"
+
+
+/* Helper functions. These are the same for all graw implementations.
+ */
+void *graw_parse_geometry_shader(struct pipe_context *pipe,
+ const char *text)
+{
+ struct tgsi_token tokens[1024];
+ struct pipe_shader_state state;
+
+ if (!tgsi_text_translate(text, tokens, Elements(tokens)))
+ return NULL;
+
+ state.tokens = tokens;
+ return pipe->create_gs_state(pipe, &state);
+}
+
+void *graw_parse_vertex_shader(struct pipe_context *pipe,
+ const char *text)
+{
+ struct tgsi_token tokens[1024];
+ struct pipe_shader_state state;
+
+ if (!tgsi_text_translate(text, tokens, Elements(tokens)))
+ return NULL;
+
+ state.tokens = tokens;
+ return pipe->create_vs_state(pipe, &state);
+}
+
+void *graw_parse_fragment_shader(struct pipe_context *pipe,
+ const char *text)
+{
+ struct tgsi_token tokens[1024];
+ struct pipe_shader_state state;
+
+ if (!tgsi_text_translate(text, tokens, Elements(tokens)))
+ return NULL;
+
+ state.tokens = tokens;
+ return pipe->create_fs_state(pipe, &state);
+}
+
diff --git a/src/gallium/tests/graw/SConscript b/src/gallium/tests/graw/SConscript
index 5ef395e033..860a17e13e 100644
--- a/src/gallium/tests/graw/SConscript
+++ b/src/gallium/tests/graw/SConscript
@@ -1,8 +1,15 @@
Import('*')
+try:
+ graw
+except NameError:
+ print 'warning: graw library not avaiable: skipping build of graw test'
+ Return()
+
env = env.Clone()
-env.Prepend(LIBS = gallium)
+env.Prepend(LIBPATH = [graw.dir])
+env.Prepend(LIBS = ['graw'] + gallium)
if platform in ('freebsd8', 'sunos5'):
env.Append(LIBS = ['m'])
diff --git a/src/gallium/tests/graw/clear.c b/src/gallium/tests/graw/clear.c
index c9a7b76188..ce52a93aa1 100644
--- a/src/gallium/tests/graw/clear.c
+++ b/src/gallium/tests/graw/clear.c
@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
-#include "state_tracker/graw_dl.h"
+#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"
diff --git a/src/gallium/tests/graw/fs-test.c b/src/gallium/tests/graw/fs-test.c
index c0ed6e06e4..53fbb744d8 100644
--- a/src/gallium/tests/graw/fs-test.c
+++ b/src/gallium/tests/graw/fs-test.c
@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
-#include "state_tracker/graw_dl.h"
+#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_shader_tokens.h"
diff --git a/src/gallium/tests/graw/gs-test.c b/src/gallium/tests/graw/gs-test.c
index 0f029e70c2..62714900bd 100644
--- a/src/gallium/tests/graw/gs-test.c
+++ b/src/gallium/tests/graw/gs-test.c
@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
-#include "state_tracker/graw_dl.h"
+#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_shader_tokens.h"
diff --git a/src/gallium/tests/graw/quad-tex.c b/src/gallium/tests/graw/quad-tex.c
index e7379e8c45..c50ef12ab5 100644
--- a/src/gallium/tests/graw/quad-tex.c
+++ b/src/gallium/tests/graw/quad-tex.c
@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
-#include "state_tracker/graw_dl.h"
+#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_shader_tokens.h"
diff --git a/src/gallium/tests/graw/tri-gs.c b/src/gallium/tests/graw/tri-gs.c
index 75466ce889..152ae408eb 100644
--- a/src/gallium/tests/graw/tri-gs.c
+++ b/src/gallium/tests/graw/tri-gs.c
@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
-#include "state_tracker/graw_dl.h"
+#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"
diff --git a/src/gallium/tests/graw/tri-instanced.c b/src/gallium/tests/graw/tri-instanced.c
index 67b40f78f7..8859f745fd 100644
--- a/src/gallium/tests/graw/tri-instanced.c
+++ b/src/gallium/tests/graw/tri-instanced.c
@@ -5,7 +5,7 @@
#include <stdio.h>
#include <string.h>
-#include "state_tracker/graw_dl.h"
+#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"
diff --git a/src/gallium/tests/graw/tri.c b/src/gallium/tests/graw/tri.c
index e8f925d2f4..4dbd2c062a 100644
--- a/src/gallium/tests/graw/tri.c
+++ b/src/gallium/tests/graw/tri.c
@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
-#include "state_tracker/graw_dl.h"
+#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"
diff --git a/src/gallium/tests/graw/vs-test.c b/src/gallium/tests/graw/vs-test.c
index e693022526..e1cd814bf7 100644
--- a/src/gallium/tests/graw/vs-test.c
+++ b/src/gallium/tests/graw/vs-test.c
@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
-#include "state_tracker/graw_dl.h"
+#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_shader_tokens.h"