[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