[Mesa-dev] [PATCH 04/13] gallium: add PIPE_SHADER_CAP_MAX_VARYINGS

Marek Olšák maraeo at gmail.com
Wed Jul 18 17:16:47 UTC 2018


Shouldn't this be a non-shader CAP? Because the value is not different
between shader stages and doesn't make sense for non-fragment shaders.

Marek

On Sun, Jul 15, 2018 at 2:15 PM, Karol Herbst <kherbst at redhat.com> wrote:
> From: Karol Herbst <karolherbst at gmail.com>
>
> this way Nouveau can report 128 inputs, but only 124 varyings.
>
> Fixes: 'KHR-GL45.limits.max_fragment_input_components'
>
> Signed-off-by: Karol Herbst <kherbst at redhat.com>
> ---
>  src/gallium/auxiliary/gallivm/lp_bld_limits.h    |  1 +
>  src/gallium/auxiliary/tgsi/tgsi_exec.h           |  1 +
>  src/gallium/docs/source/screen.rst               |  1 +
>  src/gallium/drivers/etnaviv/etnaviv_screen.c     |  1 +
>  src/gallium/drivers/freedreno/freedreno_screen.c |  1 +
>  src/gallium/drivers/i915/i915_screen.c           |  1 +
>  src/gallium/drivers/nouveau/nv30/nv30_screen.c   |  2 ++
>  src/gallium/drivers/nouveau/nv50/nv50_screen.c   |  1 +
>  src/gallium/drivers/nouveau/nvc0/nvc0_screen.c   | 11 +++--------
>  src/gallium/drivers/r300/r300_screen.c           |  2 ++
>  src/gallium/drivers/r600/r600_pipe.c             |  1 +
>  src/gallium/drivers/svga/svga_screen.c           |  3 +++
>  src/gallium/drivers/vc4/vc4_screen.c             |  1 +
>  src/gallium/drivers/virgl/virgl_screen.c         |  1 +
>  src/gallium/include/pipe/p_defines.h             |  1 +
>  src/mesa/state_tracker/st_extensions.c           |  4 +---
>  16 files changed, 22 insertions(+), 11 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_limits.h b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
> index 7b66b758729..17c23a342c8 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_limits.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
> @@ -98,6 +98,7 @@ gallivm_get_shader_param(enum pipe_shader_cap param)
>     case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>        return LP_MAX_TGSI_NESTING;
>     case PIPE_SHADER_CAP_MAX_INPUTS:
> +   case PIPE_SHADER_CAP_MAX_VARYINGS:
>        return 32;
>     case PIPE_SHADER_CAP_MAX_OUTPUTS:
>        return 32;
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> index ed8b9e88693..eab75c06c2f 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> @@ -500,6 +500,7 @@ tgsi_exec_get_shader_param(enum pipe_shader_cap param)
>     case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>        return TGSI_EXEC_MAX_NESTING;
>     case PIPE_SHADER_CAP_MAX_INPUTS:
> +   case PIPE_SHADER_CAP_MAX_VARYINGS:
>        return TGSI_EXEC_MAX_INPUT_ATTRIBS;
>     case PIPE_SHADER_CAP_MAX_OUTPUTS:
>        return 32;
> diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
> index d7ce521c2c3..a46b255031f 100644
> --- a/src/gallium/docs/source/screen.rst
> +++ b/src/gallium/docs/source/screen.rst
> @@ -480,6 +480,7 @@ support different features.
>  * ``PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS``: The maximum number of texture indirections.
>  * ``PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH``: The maximum nested control flow depth.
>  * ``PIPE_SHADER_CAP_MAX_INPUTS``: The maximum number of input registers.
> +* ``PIPE_SHADER_CAP_MAX_VARYINGS``: The maximum number of varyings.
>  * ``PIPE_SHADER_CAP_MAX_OUTPUTS``: The maximum number of output registers.
>    This is valid for all shaders except the fragment shader.
>  * ``PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE``: The maximum size per constant buffer in bytes.
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> index 04c7a873de6..d060e27397d 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> @@ -422,6 +422,7 @@ etna_screen_get_shader_param(struct pipe_screen *pscreen,
>     case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>        return ETNA_MAX_DEPTH; /* XXX */
>     case PIPE_SHADER_CAP_MAX_INPUTS:
> +   case PIPE_SHADER_CAP_MAX_VARYINGS:
>        /* Maximum number of inputs for the vertex shader is the number
>         * of vertex elements - each element defines one vertex shader
>         * input register.  For the fragment shader, this is the number
> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
> index 1baebd71789..1c1c11944c3 100644
> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
> @@ -535,6 +535,7 @@ fd_screen_get_shader_param(struct pipe_screen *pscreen,
>                 return 8; /* XXX */
>         case PIPE_SHADER_CAP_MAX_INPUTS:
>         case PIPE_SHADER_CAP_MAX_OUTPUTS:
> +       case PIPE_SHADER_CAP_MAX_VARYINGS:
>                 return 16;
>         case PIPE_SHADER_CAP_MAX_TEMPS:
>                 return 64; /* Max native temporaries. */
> diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
> index a03840a3aa4..f4a58c3272e 100644
> --- a/src/gallium/drivers/i915/i915_screen.c
> +++ b/src/gallium/drivers/i915/i915_screen.c
> @@ -137,6 +137,7 @@ i915_get_shader_param(struct pipe_screen *screen,
>        case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>           return 0;
>        case PIPE_SHADER_CAP_MAX_INPUTS:
> +      case PIPE_SHADER_CAP_MAX_VARYINGS:
>           return 10;
>        case PIPE_SHADER_CAP_MAX_OUTPUTS:
>           return 1;
> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> index 155ddeef65e..55cad4d9707 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> @@ -309,6 +309,7 @@ nv30_screen_get_shader_param(struct pipe_screen *pscreen,
>           return 0;
>        case PIPE_SHADER_CAP_MAX_INPUTS:
>        case PIPE_SHADER_CAP_MAX_OUTPUTS:
> +      case PIPE_SHADER_CAP_MAX_VARYINGS:
>           return 16;
>        case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
>           return ((eng3d->oclass >= NV40_3D_CLASS) ? (468 - 6): (256 - 6)) * sizeof(float[4]);
> @@ -361,6 +362,7 @@ nv30_screen_get_shader_param(struct pipe_screen *pscreen,
>        case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>           return 0;
>        case PIPE_SHADER_CAP_MAX_INPUTS:
> +      case PIPE_SHADER_CAP_MAX_VARYINGS:
>           return 8; /* should be possible to do 10 with nv4x */
>        case PIPE_SHADER_CAP_MAX_OUTPUTS:
>           return 4;
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> index 44a1a8a9374..3a48027af02 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> @@ -335,6 +335,7 @@ nv50_screen_get_shader_param(struct pipe_screen *pscreen,
>     case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>        return 4;
>     case PIPE_SHADER_CAP_MAX_INPUTS:
> +   case PIPE_SHADER_CAP_MAX_VARYINGS:
>        if (shader == PIPE_SHADER_VERTEX)
>           return 32;
>        return 15;
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> index ef65bb8afa8..cd92ae32a7b 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> @@ -365,19 +365,14 @@ nvc0_screen_get_shader_param(struct pipe_screen *pscreen,
>     case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>        return 16;
>     case PIPE_SHADER_CAP_MAX_INPUTS:
> -      if (shader == PIPE_SHADER_VERTEX)
> -         return 32;
> +      return 0x200 / 16;
> +   case PIPE_SHADER_CAP_MAX_VARYINGS:
>        /* NOTE: These only count our slots for GENERIC varyings.
>         * The address space may be larger, but the actual hard limit seems to be
>         * less than what the address space layout permits, so don't add TEXCOORD,
>         * COLOR, etc. here.
>         */
> -      if (shader == PIPE_SHADER_FRAGMENT)
> -         return 0x1f0 / 16;
> -      /* Actually this counts CLIPVERTEX, which occupies the last generic slot,
> -       * and excludes 0x60 per-patch inputs.
> -       */
> -      return 0x200 / 16;
> +      return 0x1f0 / 16;
>     case PIPE_SHADER_CAP_MAX_OUTPUTS:
>        return 32;
>     case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
> diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
> index 3331a6e90ff..b7e2440bfee 100644
> --- a/src/gallium/drivers/r300/r300_screen.c
> +++ b/src/gallium/drivers/r300/r300_screen.c
> @@ -340,6 +340,7 @@ static int r300_get_shader_param(struct pipe_screen *pscreen,
>              return is_r500 ? 64 : 0; /* Actually unlimited on r500. */
>              /* Fragment shader limits. */
>          case PIPE_SHADER_CAP_MAX_INPUTS:
> +        case PIPE_SHADER_CAP_MAX_VARYINGS:
>              /* 2 colors + 8 texcoords are always supported
>               * (minus fog and wpos).
>               *
> @@ -409,6 +410,7 @@ static int r300_get_shader_param(struct pipe_screen *pscreen,
>              return is_r500 ? 1024 : 256;
>          case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>              return is_r500 ? 4 : 0; /* For loops; not sure about conditionals. */
> +        case PIPE_SHADER_CAP_MAX_VARYINGS:
>          case PIPE_SHADER_CAP_MAX_INPUTS:
>              return 16;
>          case PIPE_SHADER_CAP_MAX_OUTPUTS:
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index 25180321455..4ac5d69da17 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -577,6 +577,7 @@ static int r600_get_shader_param(struct pipe_screen* pscreen,
>         case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>                 return 32;
>         case PIPE_SHADER_CAP_MAX_INPUTS:
> +       case PIPE_SHADER_CAP_MAX_VARYINGS:
>                 return shader == PIPE_SHADER_VERTEX ? 16 : 32;
>         case PIPE_SHADER_CAP_MAX_OUTPUTS:
>                 return shader == PIPE_SHADER_FRAGMENT ? 8 : 32;
> diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c
> index 9d9b7971b46..910d9975a8d 100644
> --- a/src/gallium/drivers/svga/svga_screen.c
> +++ b/src/gallium/drivers/svga/svga_screen.c
> @@ -504,6 +504,7 @@ vgpu9_get_shader_param(struct pipe_screen *screen,
>        case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>           return SVGA3D_MAX_NESTING_LEVEL;
>        case PIPE_SHADER_CAP_MAX_INPUTS:
> +      case PIPE_SHADER_CAP_MAX_VARYINGS:
>           return 10;
>        case PIPE_SHADER_CAP_MAX_OUTPUTS:
>           return svgascreen->max_color_buffers;
> @@ -578,6 +579,7 @@ vgpu9_get_shader_param(struct pipe_screen *screen,
>        case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>           return SVGA3D_MAX_NESTING_LEVEL;
>        case PIPE_SHADER_CAP_MAX_INPUTS:
> +      case PIPE_SHADER_CAP_MAX_VARYINGS:
>           return 16;
>        case PIPE_SHADER_CAP_MAX_OUTPUTS:
>           return 10;
> @@ -677,6 +679,7 @@ vgpu10_get_shader_param(struct pipe_screen *screen,
>     case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>        return 64;
>     case PIPE_SHADER_CAP_MAX_INPUTS:
> +   case PIPE_SHADER_CAP_MAX_VARYINGS:
>        if (shader == PIPE_SHADER_FRAGMENT)
>           return VGPU10_MAX_FS_INPUTS;
>        else if (shader == PIPE_SHADER_GEOMETRY)
> diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c
> index 17776fa4d9b..10a41d8755d 100644
> --- a/src/gallium/drivers/vc4/vc4_screen.c
> +++ b/src/gallium/drivers/vc4/vc4_screen.c
> @@ -418,6 +418,7 @@ vc4_screen_get_shader_param(struct pipe_screen *pscreen,
>                  return vc4_screen(pscreen)->has_control_flow;
>
>          case PIPE_SHADER_CAP_MAX_INPUTS:
> +        case PIPE_SHADER_CAP_MAX_VARYINGS:
>                  return 8;
>          case PIPE_SHADER_CAP_MAX_OUTPUTS:
>                  return shader == PIPE_SHADER_FRAGMENT ? 1 : 8;
> diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c
> index 8bd6673c3c9..f8506ec436e 100644
> --- a/src/gallium/drivers/virgl/virgl_screen.c
> +++ b/src/gallium/drivers/virgl/virgl_screen.c
> @@ -342,6 +342,7 @@ virgl_get_shader_param(struct pipe_screen *screen,
>        case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
>           return 1;
>        case PIPE_SHADER_CAP_MAX_INPUTS:
> +      case PIPE_SHADER_CAP_MAX_VARYINGS:
>           if (vscreen->caps.caps.v1.glsl_level < 150)
>              return vscreen->caps.caps.v2.max_vertex_attribs;
>           return (shader == PIPE_SHADER_VERTEX ||
> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> index 02e0c80f193..5a8515cd33b 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -899,6 +899,7 @@ enum pipe_shader_cap
>     PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS,
>     PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS,
>     PIPE_SHADER_CAP_SCALAR_ISA,
> +   PIPE_SHADER_CAP_MAX_VARYINGS,
>  };
>
>  /**
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index aaf1aa10ac6..7f7e50cb92d 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -337,10 +337,8 @@ void st_init_limits(struct pipe_screen *screen,
>     c->Program[MESA_SHADER_VERTEX].MaxAttribs =
>        MIN2(c->Program[MESA_SHADER_VERTEX].MaxAttribs, 16);
>
> -   /* PIPE_SHADER_CAP_MAX_INPUTS for the FS specifies the maximum number
> -    * of inputs. It's always 2 colors + N generic inputs. */
>     c->MaxVarying = screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
> -                                            PIPE_SHADER_CAP_MAX_INPUTS);
> +                                            PIPE_SHADER_CAP_MAX_VARYINGS);
>     c->MaxVarying = MIN2(c->MaxVarying, MAX_VARYING);
>     c->MaxGeometryOutputVertices =
>        screen->get_param(screen, PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES);
> --
> 2.17.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list