[Mesa-dev] [PATCH 1/2] draw,gallivm: Fix draw_get_shader_param.

jfonseca at vmware.com jfonseca at vmware.com
Thu Jul 12 12:50:12 PDT 2012


From: José Fonseca <jfonseca at vmware.com>

- Use LLVM limits when LLVM is being used, instead of TGSI limits
- Provide draw_get_shader_param_no_llvm for when llvm is never used (softpipe)
- Eliminate several of the hacks around draw shader caps in several drivers

Unfortunately the hack for PIPE_MAX_VERTEX_SAMPLERS is still necessary.
---
 src/gallium/auxiliary/draw/draw_context.c     |   41 +++++++++++++++++
 src/gallium/auxiliary/draw/draw_context.h     |   16 +++----
 src/gallium/auxiliary/gallivm/lp_bld_limits.h |   58 ++++++++++++++++++++++++-
 src/gallium/drivers/i915/i915_screen.c        |    2 -
 src/gallium/drivers/llvmpipe/lp_screen.c      |    6 +--
 src/gallium/drivers/softpipe/sp_screen.c      |   18 +++-----
 6 files changed, 110 insertions(+), 31 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c
index 2eae204..9713db8 100644
--- a/src/gallium/auxiliary/draw/draw_context.c
+++ b/src/gallium/auxiliary/draw/draw_context.c
@@ -42,6 +42,7 @@
 
 #if HAVE_LLVM
 #include "gallivm/lp_bld_init.h"
+#include "gallivm/lp_bld_limits.h"
 #include "draw_llvm.h"
 
 static boolean
@@ -830,3 +831,43 @@ draw_set_mapped_texture(struct draw_context *draw,
                                 row_stride, img_stride, data);
 #endif
 }
+
+/**
+ * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two
+ * different ways of setting textures, and drivers typically only support one.
+ */
+int
+draw_get_shader_param_no_llvm(unsigned shader, enum pipe_shader_cap param)
+{
+   switch(shader) {
+   case PIPE_SHADER_VERTEX:
+   case PIPE_SHADER_GEOMETRY:
+      return tgsi_exec_get_shader_param(param);
+   default:
+      return 0;
+   }
+}
+
+/**
+ * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two
+ * different ways of setting textures, and drivers typically only support one.
+ */
+int
+draw_get_shader_param(unsigned shader, enum pipe_shader_cap param)
+{
+
+#ifdef HAVE_LLVM
+   if (draw_get_option_use_llvm()) {
+   switch(shader) {
+   case PIPE_SHADER_VERTEX:
+   case PIPE_SHADER_GEOMETRY:
+      return gallivm_get_shader_param(param);
+   default:
+      return 0;
+   }
+   }
+#endif
+
+   return draw_get_shader_param_no_llvm(shader, param);
+}
+
diff --git a/src/gallium/auxiliary/draw/draw_context.h b/src/gallium/auxiliary/draw/draw_context.h
index 4cd0caf..852cbc3 100644
--- a/src/gallium/auxiliary/draw/draw_context.h
+++ b/src/gallium/auxiliary/draw/draw_context.h
@@ -277,16 +277,10 @@ boolean draw_need_pipeline(const struct draw_context *draw,
                            const struct pipe_rasterizer_state *rasterizer,
                            unsigned prim );
 
-static INLINE int
-draw_get_shader_param(unsigned shader, enum pipe_shader_cap param)
-{
-   switch(shader) {
-   case PIPE_SHADER_VERTEX:
-   case PIPE_SHADER_GEOMETRY:
-      return tgsi_exec_get_shader_param(param);
-   default:
-      return 0;
-   }
-}
+int
+draw_get_shader_param(unsigned shader, enum pipe_shader_cap param);
+
+int
+draw_get_shader_param_no_llvm(unsigned shader, enum pipe_shader_cap param);
 
 #endif /* DRAW_CONTEXT_H */
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_limits.h b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
index 2dbb7ce..905070e 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_limits.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
@@ -1,6 +1,6 @@
 /**************************************************************************
  *
- * Copyright 2010 VMware, Inc.
+ * Copyright 2010-2012 VMware, Inc.
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -29,6 +29,13 @@
 #ifndef LP_BLD_LIMITS_H_
 #define LP_BLD_LIMITS_H_
 
+
+#include <limits.h>
+
+#include "pipe/p_state.h"
+#include "pipe/p_defines.h"
+
+
 /*
  * TGSI translation limits.
  *
@@ -57,4 +64,53 @@
  */
 #define LP_MAX_TGSI_LOOP_ITERATIONS 65535
 
+
+/**
+ * Some of these limits are actually infinite (i.e., only limited by available
+ * memory), however advertising INT_MAX would cause some test problems to
+ * actually try to allocate the maximum and run out of memory and crash.  So
+ * stick with something reasonable here.
+ */
+static INLINE int
+gallivm_get_shader_param(enum pipe_shader_cap param)
+{
+   switch(param) {
+   case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
+   case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
+   case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
+   case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
+      return 1 * 1024 * 1024;
+   case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
+      return LP_MAX_TGSI_NESTING;
+   case PIPE_SHADER_CAP_MAX_INPUTS:
+      return PIPE_MAX_SHADER_INPUTS;
+   case PIPE_SHADER_CAP_MAX_CONSTS:
+      return 16 * 2024;
+   case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
+      return PIPE_MAX_CONSTANT_BUFFERS;
+   case PIPE_SHADER_CAP_MAX_TEMPS:
+      return LP_MAX_TGSI_TEMPS;
+   case PIPE_SHADER_CAP_MAX_ADDRS:
+      return LP_MAX_TGSI_ADDRS;
+   case PIPE_SHADER_CAP_MAX_PREDS:
+      return LP_MAX_TGSI_PREDS;
+   case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
+      return 1;
+   case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
+   case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
+   case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
+   case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
+      return 1;
+   case PIPE_SHADER_CAP_SUBROUTINES:
+      return 1;
+   case PIPE_SHADER_CAP_INTEGERS:
+      return 1;
+   case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
+      return PIPE_MAX_SAMPLERS;
+   default:
+      return 0;
+   }
+}
+
+
 #endif /* LP_BLD_LIMITS_H_ */
diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
index ff35203..d575bf7 100644
--- a/src/gallium/drivers/i915/i915_screen.c
+++ b/src/gallium/drivers/i915/i915_screen.c
@@ -110,8 +110,6 @@ i915_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_sha
             return PIPE_MAX_VERTEX_SAMPLERS;
          else
             return 0;
-      case PIPE_SHADER_CAP_INTEGERS:
-         return 1;
        default:
          return draw_get_shader_param(shader, cap);
       }
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
index 33fa241..ecb66cf 100644
--- a/src/gallium/drivers/llvmpipe/lp_screen.c
+++ b/src/gallium/drivers/llvmpipe/lp_screen.c
@@ -221,10 +221,8 @@ llvmpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe
    {
    case PIPE_SHADER_FRAGMENT:
       switch (param) {
-      case PIPE_SHADER_CAP_INTEGERS:
-         return 0;
       default:
-         return tgsi_exec_get_shader_param(param);
+         return gallivm_get_shader_param(param);
       }
    case PIPE_SHADER_VERTEX:
    case PIPE_SHADER_GEOMETRY:
@@ -238,8 +236,6 @@ llvmpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe
             return PIPE_MAX_VERTEX_SAMPLERS;
          else
             return 0;
-      case PIPE_SHADER_CAP_INTEGERS:
-	  return 0;
       default:
          return draw_get_shader_param(shader, param);
       }
diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
index ade97a7..2439608 100644
--- a/src/gallium/drivers/softpipe/sp_screen.c
+++ b/src/gallium/drivers/softpipe/sp_screen.c
@@ -174,9 +174,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
 static int
 softpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param)
 {
-#ifdef HAVE_LLVM
    struct softpipe_screen *sp_screen = softpipe_screen(screen);
-#endif
    switch(shader)
    {
    case PIPE_SHADER_FRAGMENT:
@@ -185,20 +183,16 @@ softpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe
    case PIPE_SHADER_GEOMETRY:
       switch (param) {
       case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
-#ifdef HAVE_LLVM
          if (sp_screen->use_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 (sp_screen->use_llvm)
-            return 0;
-#endif
-         /* fallthrough */
+	 else
+            return PIPE_MAX_VERTEX_SAMPLERS;
       default:
-         return draw_get_shader_param(shader, param);
+	 if (sp_screen->use_llvm)
+            return draw_get_shader_param(shader, param);
+         else
+            return draw_get_shader_param_no_llvm(shader, param);
       }
    default:
       return 0;
-- 
1.7.9.5



More information about the mesa-dev mailing list