On Thu, Jul 12, 2012 at 9:50 PM, <jfons...@vmware.com> wrote: > From: José Fonseca <jfons...@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 <mar...@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 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev