target-helpers: helper for injecting common debug layers
authorKeith Whitwell <keithw@vmware.com>
Wed, 10 Mar 2010 10:32:16 +0000 (10:32 +0000)
committerKeith Whitwell <keithw@vmware.com>
Wed, 10 Mar 2010 10:37:57 +0000 (10:37 +0000)
Add a helper gallium_wrap_screen() for injecting the commonly
used extra layers into a gallium stack.  Currently that's just the
trace module and identity layer, but there could be more in the
future, eg. a validation layer.

src/gallium/auxiliary/Makefile
src/gallium/auxiliary/SConscript
src/gallium/auxiliary/target-helpers/swrast_xlib.c
src/gallium/auxiliary/target-helpers/wrap_screen.c [new file with mode: 0644]
src/gallium/auxiliary/target-helpers/wrap_screen.h [new file with mode: 0644]

index c84e8d781d32f0c9792ce3e02a44bc3546dd69f1..89b15d41b7be5f5e344bc9debf71ed52dea81915 100644 (file)
@@ -133,6 +133,7 @@ C_SOURCES = \
        vl/vl_csc.c \
        vl/vl_shader_build.c \
        target-helpers/swrast_xlib.c
+       target-helpers/wrap_screen.c
 
 GALLIVM_SOURCES = \
         gallivm/lp_bld_alpha.c \
index d6185bcb5e3da41553444341a2cd938e6394f184..2be16776fb897d4fe574d7c6f377a483347c526e 100644 (file)
@@ -175,6 +175,7 @@ source = [
     'vl/vl_compositor.c',
     'vl/vl_csc.c',
     'vl/vl_shader_build.c',
+    'target-helpers/wrap_screen.c',
 ]
 
 if drawllvm:
index bf30ff68c1bac5021a78613dcaecdbffa8099724..3cab90127284f27329172cbd7beca826c5656767 100644 (file)
@@ -37,9 +37,8 @@
 #include "util/u_debug.h"
 #include "softpipe/sp_public.h"
 #include "llvmpipe/lp_public.h"
-#include "identity/id_public.h"
-#include "trace/tr_public.h"
 #include "cell/ppu/cell_public.h"
+#include "wrap_screen.h"
 
 
 /* Helper function to build a subset of a driver stack consisting of
@@ -84,15 +83,7 @@ swrast_xlib_create_screen( Display *display )
 
    /* Inject any wrapping layers we want to here:
     */
-   if (debug_get_bool_option("GALLIUM_WRAP", FALSE)) {
-      screen = identity_screen_create(screen);
-   }
-
-   if (debug_get_bool_option("GALLIUM_TRACE", FALSE)) {
-      screen = trace_screen_create( screen );
-   }
-
-   return screen;
+   return gallium_wrap_screen( screen );
 
 fail:
    if (winsys)
diff --git a/src/gallium/auxiliary/target-helpers/wrap_screen.c b/src/gallium/auxiliary/target-helpers/wrap_screen.c
new file mode 100644 (file)
index 0000000..5fe3013
--- /dev/null
@@ -0,0 +1,65 @@
+/**************************************************************************
+ * 
+ * Copyright 2007 Tungsten Graphics, Inc., Bismarck, ND., USA
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * 
+ **************************************************************************/
+
+/*
+ * Authors:
+ *   Keith Whitwell
+ */
+
+#include "target-helpers/wrap_screen.h"
+#include "trace/tr_public.h"
+#include "identity/id_public.h"
+#include "util/u_debug.h"
+
+
+/* Centralized code to inject common wrapping layers:
+ */
+struct pipe_screen *
+gallium_wrap_screen( struct pipe_screen *screen )
+{
+   /* Screen wrapping functions are required not to fail.  If it is
+    * impossible to wrap a screen, the unwrapped screen should be
+    * returned instead.  Any failure condition should be returned in
+    * an OUT argument.
+    *
+    * Otherwise it is really messy trying to clean up in this code.
+    */
+   if (debug_get_bool_option("GALLIUM_WRAP", FALSE)) {
+      screen = identity_screen_create(screen);
+   }
+
+   if (debug_get_bool_option("GALLIUM_TRACE", FALSE)) {
+      screen = trace_screen_create( screen );
+   }
+
+   return screen;
+}
+
+
+
+
diff --git a/src/gallium/auxiliary/target-helpers/wrap_screen.h b/src/gallium/auxiliary/target-helpers/wrap_screen.h
new file mode 100644 (file)
index 0000000..7e76beb
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef WRAP_SCREEN_HELPER_H
+#define WRAP_SCREEN_HELPER_H
+
+#include "pipe/p_compiler.h"
+
+struct pipe_screen;
+
+/* Centralized code to inject common wrapping layers.  Other layers
+ * can be introduced by specific targets, but these are the generally
+ * helpful ones we probably want everywhere.
+ */
+struct pipe_screen *
+gallium_wrap_screen( struct pipe_screen *screen );
+
+
+#endif