Mesa (master): graw: Dynamically load graw libraries.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Thu Aug 26 05:45:01 UTC 2010


Module: Mesa
Branch: master
Commit: f0eb02af800ea1c4be6847ead0096d368d9276ff
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f0eb02af800ea1c4be6847ead0096d368d9276ff

Author: José Fonseca <jfonseca at vmware.com>
Date:   Thu Aug 26 06:44:02 2010 +0100

graw: Dynamically load graw libraries.

This allows to build multiple graws libs simultaneously and avoid
unnecessary rebuilds of the tests.

Also remove graw_util.c from inside the graw implementation -- it was
only being provided by one implementation, and graw tests were linking
against gallium anyway.

---

 src/gallium/include/state_tracker/graw_dl.h |  152 +++++++++++++++++++++++++++
 src/gallium/targets/graw-xlib/SConscript    |    1 -
 src/gallium/targets/graw-xlib/graw_util.c   |   49 ---------
 src/gallium/tests/graw/SConscript           |    9 +--
 src/gallium/tests/graw/clear.c              |    2 +-
 src/gallium/tests/graw/fs-test.c            |    2 +-
 src/gallium/tests/graw/gs-test.c            |    2 +-
 src/gallium/tests/graw/quad-tex.c           |    2 +-
 src/gallium/tests/graw/tri-gs.c             |    2 +-
 src/gallium/tests/graw/tri-instanced.c      |    2 +-
 src/gallium/tests/graw/tri.c                |    2 +-
 src/gallium/tests/graw/vs-test.c            |    2 +-
 12 files changed, 161 insertions(+), 66 deletions(-)

diff --git a/src/gallium/include/state_tracker/graw_dl.h b/src/gallium/include/state_tracker/graw_dl.h
new file mode 100644
index 0000000..0b326ca
--- /dev/null
+++ b/src/gallium/include/state_tracker/graw_dl.h
@@ -0,0 +1,152 @@
+#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 "pipe/p_compiler.h"
+#include "pipe/p_format.h"
+#include "pipe/p_context.h"
+#include "util/u_dl.h"
+#include "tgsi/tgsi_text.h"
+#include  <stdio.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/graw-xlib/SConscript b/src/gallium/targets/graw-xlib/SConscript
index 21fce94..32b98cd 100644
--- a/src/gallium/targets/graw-xlib/SConscript
+++ b/src/gallium/targets/graw-xlib/SConscript
@@ -26,7 +26,6 @@ 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
deleted file mode 100644
index 47aca44..0000000
--- a/src/gallium/targets/graw-xlib/graw_util.c
+++ /dev/null
@@ -1,49 +0,0 @@
-
-#include "pipe/p_compiler.h"
-#include "pipe/p_context.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 860a17e..5ef395e 100644
--- a/src/gallium/tests/graw/SConscript
+++ b/src/gallium/tests/graw/SConscript
@@ -1,15 +1,8 @@
 Import('*')
 
-try:
-    graw
-except NameError:
-    print 'warning: graw library not avaiable: skipping build of graw test'
-    Return()
-
 env = env.Clone()
 
-env.Prepend(LIBPATH = [graw.dir])
-env.Prepend(LIBS = ['graw'] + gallium)
+env.Prepend(LIBS = 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 ce52a93..c9a7b76 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.h"
+#include "state_tracker/graw_dl.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 53fbb74..c0ed6e0 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.h"
+#include "state_tracker/graw_dl.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 6271490..0f029e7 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.h"
+#include "state_tracker/graw_dl.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 c50ef12..e7379e8 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.h"
+#include "state_tracker/graw_dl.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 152ae40..75466ce 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.h"
+#include "state_tracker/graw_dl.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 8859f74..67b40f7 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.h"
+#include "state_tracker/graw_dl.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 4dbd2c0..e8f925d 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.h"
+#include "state_tracker/graw_dl.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 e1cd814..e693022 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.h"
+#include "state_tracker/graw_dl.h"
 #include "pipe/p_screen.h"
 #include "pipe/p_context.h"
 #include "pipe/p_shader_tokens.h"




More information about the mesa-commit mailing list