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

Marek Olšák maraeo at gmail.com
Thu Jul 12 16:33:28 PDT 2012


On Thu, Jul 12, 2012 at 9:50 PM,  <jfonseca at vmware.com> wrote:
> 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

The indentation here is wrong. Apart from that, the series looks good.

Reviewed-by: Marek Olšák <maraeo at gmail.com>

Marek

> +
> +   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