[Mesa-dev] [PATCH] softpipe: allow softpipe to set shader params depending on runtime llvm (v2)

Dave Airlie airlied at gmail.com
Tue Jan 10 05:47:51 PST 2012


From: Dave Airlie <airlied at redhat.com>

If draw isn't using llvm we can support vertex texture and integers,
These will be fixed up later, but for now allow this check to happen
at run-time.

v2: since 3e22c7a25321554a32fa6254485912fd53deff3a we can ask draw for a non-llvm
context. Just track if ask and set the vars accordingly. This probably isn't perfect but should cover the cases we care about.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/gallium/drivers/softpipe/sp_context.c |    2 +-
 src/gallium/drivers/softpipe/sp_screen.c  |   26 +++++++++++++++++++++++---
 src/gallium/drivers/softpipe/sp_screen.h  |    3 ++-
 3 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/softpipe/sp_context.c b/src/gallium/drivers/softpipe/sp_context.c
index e533e5a..779832e 100644
--- a/src/gallium/drivers/softpipe/sp_context.c
+++ b/src/gallium/drivers/softpipe/sp_context.c
@@ -304,7 +304,7 @@ softpipe_create_context( struct pipe_screen *screen,
    /*
     * Create drawing context and plug our rendering stage into it.
     */
-   if (debug_get_bool_option("SOFTPIPE_USE_LLVM", FALSE))
+   if (softpipe_using_draw_llvm())
       softpipe->draw = draw_create(&softpipe->pipe);
    else
       softpipe->draw = draw_create_no_llvm(&softpipe->pipe);
diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
index 982af6b..bedf0b0 100644
--- a/src/gallium/drivers/softpipe/sp_screen.c
+++ b/src/gallium/drivers/softpipe/sp_screen.c
@@ -45,6 +45,20 @@
 #include "sp_fence.h"
 #include "sp_public.h"
 
+boolean
+softpipe_using_draw_llvm(void)
+{
+   static int using_draw_llvm = -1;
+
+   if (using_draw_llvm == -1) {
+      if (debug_get_bool_option("SOFTPIPE_USE_LLVM", FALSE))
+         using_draw_llvm = 1;
+      else
+         using_draw_llvm = 0;
+   }
+
+   return using_draw_llvm ? TRUE : FALSE;
+}
 
 static const char *
 softpipe_get_vendor(struct pipe_screen *screen)
@@ -144,11 +158,17 @@ softpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe
       switch (param) {
       case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
 #ifdef HAVE_LLVM
-         /* Softpipe doesn't yet know how to tell draw/llvm about textures */
-         return 0;
-#else
+         if (softpipe_using_draw_llvm())
+            /* Softpipe doesn't yet know how to tell draw/llvm about textures */
+            return 0;
+#endif
          return PIPE_MAX_VERTEX_SAMPLERS;
+      case PIPE_SHADER_CAP_INTEGERS:
+#ifdef HAVE_LLVM /* gallivm doesn't support integers yet */
+         if (softpipe_using_draw_llvm())
+            return 0;
 #endif
+         /* fallthrough */
       default:
          return draw_get_shader_param(shader, param);
       }
diff --git a/src/gallium/drivers/softpipe/sp_screen.h b/src/gallium/drivers/softpipe/sp_screen.h
index f741454..0a19bba 100644
--- a/src/gallium/drivers/softpipe/sp_screen.h
+++ b/src/gallium/drivers/softpipe/sp_screen.h
@@ -48,7 +48,8 @@ struct softpipe_screen {
    unsigned timestamp;          
 };
 
-
+boolean
+softpipe_using_draw_llvm(void);
 
 
 static INLINE struct softpipe_screen *
-- 
1.7.7.3



More information about the mesa-dev mailing list