graw: Undo late loading of graw drivers.
authorJosé Fonseca <jfonseca@vmware.com>
Thu, 26 Aug 2010 10:37:42 +0000 (11:37 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Thu, 26 Aug 2010 10:37:42 +0000 (11:37 +0100)
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.

16 files changed:
SConstruct
src/gallium/include/state_tracker/graw_dl.h [deleted file]
src/gallium/targets/SConscript
src/gallium/targets/graw-null/SConscript [new file with mode: 0644]
src/gallium/targets/graw-null/graw_null.c [new file with mode: 0644]
src/gallium/targets/graw-xlib/SConscript
src/gallium/targets/graw-xlib/graw_util.c [new file with mode: 0644]
src/gallium/tests/graw/SConscript
src/gallium/tests/graw/clear.c
src/gallium/tests/graw/fs-test.c
src/gallium/tests/graw/gs-test.c
src/gallium/tests/graw/quad-tex.c
src/gallium/tests/graw/tri-gs.c
src/gallium/tests/graw/tri-instanced.c
src/gallium/tests/graw/tri.c
src/gallium/tests/graw/vs-test.c

index 14663727f52539f19fd1d4c8f7c9acf9298c6d7e..bb03e5055eadf1d73407c8d539cf78aaa2f08fc3 100644 (file)
@@ -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 (file)
index 3c5c3d8..0000000
+++ /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
index 7eecdb24c799d4512a20d942eb72a5aa6962e5e7..e447d093610d2727341dc95659a408fb603a2e4d 100644 (file)
@@ -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 (file)
index 0000000..3416989
--- /dev/null
@@ -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 (file)
index 0000000..5939a5a
--- /dev/null
@@ -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);
+}
index 32b98cdef3b0ca6237d14a76769c955d73d4129f..21fce948f43c7c24a08fbe27c890b0b5762f8a5f 100644 (file)
@@ -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 (file)
index 0000000..fc7c9ae
--- /dev/null
@@ -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);
+}
+
index 5ef395e0336bbece4c6bbf1e789358e6b21fac4b..860a17e13e71870515bb1489c59500e87f4ead6f 100644 (file)
@@ -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'])
index c9a7b76188ca0470682b1f37ac85792fa3f98f24..ce52a93aa1bcb5aa0abfb4d29bb50c27af362087 100644 (file)
@@ -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"
index c0ed6e06e46bb71f73750f56dfb7d33cfe8ee3ef..53fbb744d86f3ed62d6cbeace6c3cfa98b0a6728 100644 (file)
@@ -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"
index 0f029e70c2ea22468c6770df47d63511a3c87fe6..62714900bd9d5ce3bcb50ec14b6dbe91aa8ff388 100644 (file)
@@ -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"
index e7379e8c4565cee8791f62c5d4f62bd94be36e3f..c50ef12ab5a95c8b1fb73deaf35d4e0d3e90be69 100644 (file)
@@ -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"
index 75466ce889c306b21ae37ee5779487a8eeaf568c..152ae408eb06c49ed0596a7facc3c60404438c3a 100644 (file)
@@ -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"
index 67b40f78f78d4974be0b248c9a9aba57f4c29c74..8859f745fdb4f50cc97ac260f7811887cbde5ed1 100644 (file)
@@ -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"
index e8f925d2f430a8cc9ee1fb34d25675a9faf62c93..4dbd2c062a5f6ac96050811529b80e4e6d32e9fb 100644 (file)
@@ -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"
index e6930225264cd2d0649dcb2e8380a2f6c9f21a78..e1cd814bf72ae52fcd96881f2d36998f7ae67321 100644 (file)
@@ -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"