[Mesa-dev] [PATCH 2/3] gallium: new shader cap bit for the amount of sampler views

Brian Paul brian.e.paul at gmail.com
Sun Dec 1 04:10:30 PST 2013


Reviewed-by: Brian Paul <brianp at vmware.com>


On Mon, Nov 25, 2013 at 7:43 PM, <sroland at vmware.com> wrote:

> From: Roland Scheidegger <sroland at vmware.com>
>
> Ever since introducing separate sampler and sampler view max this was
> really
> missing.
> Every driver but llvmpipe reports the same number as number of samplers for
> now, so nothing should break.
> ---
>  src/gallium/auxiliary/gallivm/lp_bld_limits.h    |    2 ++
>  src/gallium/docs/source/screen.rst               |    4 +++-
>  src/gallium/drivers/freedreno/freedreno_screen.c |    1 +
>  src/gallium/drivers/i915/i915_screen.c           |    2 ++
>  src/gallium/drivers/ilo/ilo_screen.c             |    2 ++
>  src/gallium/drivers/llvmpipe/lp_screen.c         |    5 +++++
>  src/gallium/drivers/nouveau/nv30/nv30_screen.c   |    2 ++
>  src/gallium/drivers/nouveau/nv50/nv50_screen.c   |    2 ++
>  src/gallium/drivers/nouveau/nvc0/nvc0_screen.c   |    6 ++----
>  src/gallium/drivers/r300/r300_screen.c           |    3 +++
>  src/gallium/drivers/r600/r600_pipe.c             |    1 +
>  src/gallium/drivers/radeonsi/radeonsi_pipe.c     |    1 +
>  src/gallium/drivers/softpipe/sp_screen.c         |    5 +++--
>  src/gallium/drivers/svga/svga_screen.c           |    2 ++
>  src/gallium/include/pipe/p_defines.h             |    3 ++-
>  15 files changed, 33 insertions(+), 8 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_limits.h
> b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
> index 5675e36..521b45b 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_limits.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
> @@ -112,6 +112,8 @@ gallivm_get_shader_param(enum pipe_shader_cap param)
>        return 1;
>     case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
>        return PIPE_MAX_SAMPLERS;
> +   case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
> +      return PIPE_MAX_SHADER_SAMPLER_VIEWS;
>     case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
>        return 1;
>     default:
> diff --git a/src/gallium/docs/source/screen.rst
> b/src/gallium/docs/source/screen.rst
> index a01f548..035309d 100644
> --- a/src/gallium/docs/source/screen.rst
> +++ b/src/gallium/docs/source/screen.rst
> @@ -247,10 +247,12 @@ to be 0.
>    BGNSUB, ENDSUB, CAL, and RET, including RET in the main block.
>  * ``PIPE_SHADER_CAP_INTEGERS``: Whether integer opcodes are supported.
>    If unsupported, only float opcodes are supported.
> -* ``PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS``: THe maximum number of texture
> +* ``PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS``: The maximum number of texture
>    samplers.
>  * ``PIPE_SHADER_CAP_PREFERRED_IR``: Preferred representation of the
>    program.  It should be one of the ``pipe_shader_ir`` enum values.
> +* ``PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS``: The maximum number of texture
> +  sampler views. Must not be lower than
> PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS.
>
>
>  .. _pipe_compute_cap:
> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c
> b/src/gallium/drivers/freedreno/freedreno_screen.c
> index 20adf21..5dafa92 100644
> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
> @@ -323,6 +323,7 @@ fd_screen_get_shader_param(struct pipe_screen
> *pscreen, unsigned shader,
>                  */
>                 return 0;
>         case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +       case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>                 return 16;
>         case PIPE_SHADER_CAP_PREFERRED_IR:
>                 return PIPE_SHADER_IR_TGSI;
> diff --git a/src/gallium/drivers/i915/i915_screen.c
> b/src/gallium/drivers/i915/i915_screen.c
> index 77607d0..5e1e18d 100644
> --- a/src/gallium/drivers/i915/i915_screen.c
> +++ b/src/gallium/drivers/i915/i915_screen.c
> @@ -106,6 +106,7 @@ i915_get_shader_param(struct pipe_screen *screen,
> unsigned shader, enum pipe_sha
>     case PIPE_SHADER_VERTEX:
>        switch (cap) {
>        case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +      case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>           if (debug_get_bool_option("DRAW_USE_LLVM", TRUE))
>              return PIPE_MAX_SAMPLERS;
>           else
> @@ -151,6 +152,7 @@ i915_get_shader_param(struct pipe_screen *screen,
> unsigned shader, enum pipe_sha
>        case PIPE_SHADER_CAP_INTEGERS:
>           return 0;
>        case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +      case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>           return I915_TEX_UNITS;
>        default:
>           debug_printf("%s: Unknown cap %u.\n", __FUNCTION__, cap);
> diff --git a/src/gallium/drivers/ilo/ilo_screen.c
> b/src/gallium/drivers/ilo/ilo_screen.c
> index a345b70..d6e3f94 100644
> --- a/src/gallium/drivers/ilo/ilo_screen.c
> +++ b/src/gallium/drivers/ilo/ilo_screen.c
> @@ -141,6 +141,8 @@ ilo_get_shader_param(struct pipe_screen *screen,
> unsigned shader,
>        return 1;
>     case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
>        return ILO_MAX_SAMPLERS;
> +   case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
> +      return ILO_MAX_SAMPLER_VIEWS;
>     case PIPE_SHADER_CAP_PREFERRED_IR:
>        return PIPE_SHADER_IR_TGSI;
>     case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c
> b/src/gallium/drivers/llvmpipe/lp_screen.c
> index f61df98..81ebc69 100644
> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
> @@ -262,6 +262,11 @@ llvmpipe_get_shader_param(struct pipe_screen *screen,
> unsigned shader, enum pipe
>              return PIPE_MAX_SAMPLERS;
>           else
>              return 0;
> +      case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
> +         if (debug_get_bool_option("DRAW_USE_LLVM", TRUE))
> +            return PIPE_MAX_SHADER_SAMPLER_VIEWS;
> +         else
> +            return 0;
>        default:
>           return draw_get_shader_param(shader, param);
>        }
> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> index 807100e..26ff681 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> @@ -190,6 +190,7 @@ nv30_screen_get_shader_param(struct pipe_screen
> *pscreen, unsigned shader,
>        case PIPE_SHADER_CAP_MAX_TEMPS:
>           return (eng3d->oclass >= NV40_3D_CLASS) ? 32 : 13;
>        case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +      case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>           return 0;
>        case PIPE_SHADER_CAP_MAX_ADDRS:
>           return 2;
> @@ -228,6 +229,7 @@ nv30_screen_get_shader_param(struct pipe_screen
> *pscreen, unsigned shader,
>        case PIPE_SHADER_CAP_MAX_ADDRS:
>           return (eng3d->oclass >= NV40_3D_CLASS) ? 1 : 0;
>        case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +      case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>           return 16;
>        case PIPE_SHADER_CAP_MAX_PREDS:
>        case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> index 0ce9e34..f7dfc98 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> @@ -250,6 +250,8 @@ nv50_screen_get_shader_param(struct pipe_screen
> *pscreen, unsigned shader,
>     case PIPE_SHADER_CAP_INTEGERS:
>        return 1;
>     case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +      /* The chip could handle more sampler views than samplers */
> +   case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>        return MIN2(32, PIPE_MAX_SAMPLERS);
>     default:
>        NOUVEAU_ERR("unknown PIPE_SHADER_CAP %d\n", param);
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> index b203089..cc5814e 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> @@ -253,10 +253,8 @@ nvc0_screen_get_shader_param(struct pipe_screen
> *pscreen, unsigned shader,
>        return 1;
>     case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
>        return 16; /* would be 32 in linked (OpenGL-style) mode */
> -      /*
> -   case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLER_VIEWS:
> -      return 32;
> -      */
> +   case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
> +      return 16; /* XXX not sure if more are really safe */
>     default:
>        NOUVEAU_ERR("unknown PIPE_SHADER_CAP %d\n", param);
>        return 0;
> diff --git a/src/gallium/drivers/r300/r300_screen.c
> b/src/gallium/drivers/r300/r300_screen.c
> index 476770a..c21ee68 100644
> --- a/src/gallium/drivers/r300/r300_screen.c
> +++ b/src/gallium/drivers/r300/r300_screen.c
> @@ -238,6 +238,7 @@ static int r300_get_shader_param(struct pipe_screen
> *pscreen, unsigned shader, e
>          case PIPE_SHADER_CAP_MAX_PREDS:
>              return is_r500 ? 1 : 0;
>          case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +        case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>             return r300screen->caps.num_tex_units;
>          case PIPE_SHADER_CAP_MAX_ADDRS:
>          case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
> @@ -257,6 +258,7 @@ static int r300_get_shader_param(struct pipe_screen
> *pscreen, unsigned shader, e
>          switch (param)
>          {
>          case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +        case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>          case PIPE_SHADER_CAP_SUBROUTINES:
>              return 0;
>          default:;
> @@ -297,6 +299,7 @@ static int r300_get_shader_param(struct pipe_screen
> *pscreen, unsigned shader, e
>          case PIPE_SHADER_CAP_SUBROUTINES:
>          case PIPE_SHADER_CAP_INTEGERS:
>          case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +        case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>              return 0;
>          case PIPE_SHADER_CAP_PREFERRED_IR:
>              return PIPE_SHADER_IR_TGSI;
> diff --git a/src/gallium/drivers/r600/r600_pipe.c
> b/src/gallium/drivers/r600/r600_pipe.c
> index 633c22a..5e1d262 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -597,6 +597,7 @@ static int r600_get_shader_param(struct pipe_screen*
> pscreen, unsigned shader, e
>         case PIPE_SHADER_CAP_INTEGERS:
>                 return 1;
>         case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +       case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>                 return 16;
>          case PIPE_SHADER_CAP_PREFERRED_IR:
>                 if (shader == PIPE_SHADER_COMPUTE) {
> diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.c
> b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
> index e662e78..1ff8c14 100644
> --- a/src/gallium/drivers/radeonsi/radeonsi_pipe.c
> +++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
> @@ -492,6 +492,7 @@ static int r600_get_shader_param(struct pipe_screen*
> pscreen, unsigned shader, e
>         case PIPE_SHADER_CAP_SUBROUTINES:
>                 return 0;
>         case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +       case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>                 return 16;
>         case PIPE_SHADER_CAP_PREFERRED_IR:
>                 return PIPE_SHADER_IR_TGSI;
> diff --git a/src/gallium/drivers/softpipe/sp_screen.c
> b/src/gallium/drivers/softpipe/sp_screen.c
> index 47ef20e..0ec0aad 100644
> --- a/src/gallium/drivers/softpipe/sp_screen.c
> +++ b/src/gallium/drivers/softpipe/sp_screen.c
> @@ -204,13 +204,14 @@ 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:
> +      case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>           if (sp_screen->use_llvm)
>              /* Softpipe doesn't yet know how to tell draw/llvm about
> textures */
>              return 0;
> -        else
> +         else
>              return PIPE_MAX_SAMPLERS;
>        default:
> -        if (sp_screen->use_llvm)
> +         if (sp_screen->use_llvm)
>              return draw_get_shader_param(shader, param);
>           else
>              return draw_get_shader_param_no_llvm(shader, param);
> diff --git a/src/gallium/drivers/svga/svga_screen.c
> b/src/gallium/drivers/svga/svga_screen.c
> index c16be16..977dec5 100644
> --- a/src/gallium/drivers/svga/svga_screen.c
> +++ b/src/gallium/drivers/svga/svga_screen.c
> @@ -332,6 +332,7 @@ static int svga_get_shader_param(struct pipe_screen
> *screen, unsigned shader, en
>        case PIPE_SHADER_CAP_INTEGERS:
>           return 0;
>        case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +      case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>           return 16;
>        default:
>           debug_printf("Unexpected fragment shader query %u\n", param);
> @@ -382,6 +383,7 @@ static int svga_get_shader_param(struct pipe_screen
> *screen, unsigned shader, en
>        case PIPE_SHADER_CAP_INTEGERS:
>           return 0;
>        case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
> +      case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>           return 0;
>        default:
>           debug_printf("Unexpected vertex shader query %u\n", param);
> diff --git a/src/gallium/include/pipe/p_defines.h
> b/src/gallium/include/pipe/p_defines.h
> index db6db32..7e71e77 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -571,7 +571,8 @@ enum pipe_shader_cap
>     PIPE_SHADER_CAP_INTEGERS = 17,
>     PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS = 18,
>     PIPE_SHADER_CAP_PREFERRED_IR = 19,
> -   PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED = 20
> +   PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED = 20,
> +   PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS = 21
>  };
>
>  /**
> --
> 1.7.9.5
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131201/d0c1093c/attachment-0001.html>


More information about the mesa-dev mailing list