[Mesa-dev] [PATCH] gallium: add PIPE_SHADER_CAP_MAX_VARYINGS

Nicolai Hähnle nhaehnle at gmail.com
Mon Aug 28 08:23:28 UTC 2017


On 27.08.2017 12:59, Karol Herbst wrote:
> this way Nouveau can report 128 inputs, but only 124 varyings.
> 
> Fixes: 'KHR-GL45.limits.max_fragment_input_components'

Can you explain a bit more why this is necessary? The GL CTS test only 
exercises the core profile, where it should be possible for you to 
cleanly map GLSL I/O to whatever the hardware does.

Cheers,
Nicolai


> Signed-off-by: Karol Herbst <karolherbst at gmail.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/radeonsi/si_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 +---
>   17 files changed, 23 insertions(+), 11 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_limits.h b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
> index 354e2a46b1..c3ff3368c5 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 9d7e65f2c5..d1d4d07911 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> @@ -491,6 +491,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 be14ddd0c0..516efa40d5 100644
> --- a/src/gallium/docs/source/screen.rst
> +++ b/src/gallium/docs/source/screen.rst
> @@ -441,6 +441,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 f400e423de..edacf003c1 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> @@ -403,6 +403,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 b26f67e4e2..5bea65ebab 100644
> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
> @@ -489,6 +489,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 e700e294da..0a4475889f 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 72f886c911..6cc0b05030 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> @@ -291,6 +291,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]);
> @@ -337,6 +338,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 0f25cd5fed..d94210693b 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> @@ -323,6 +323,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 f64ac2625d..c96d6645e9 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> @@ -360,19 +360,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 ff68ffd7bc..e0e6dc75a1 100644
> --- a/src/gallium/drivers/r300/r300_screen.c
> +++ b/src/gallium/drivers/r300/r300_screen.c
> @@ -326,6 +326,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_VARINGS:
>               /* 2 colors + 8 texcoords are always supported
>                * (minus fog and wpos).
>                *
> @@ -390,6 +391,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_VARINGS:
>           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 023f1b4bd1..faaeb27bf9 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -541,6 +541,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/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
> index 18d5806ac8..373c767588 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -709,6 +709,7 @@ static int si_get_shader_param(struct pipe_screen* pscreen,
>   	case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
>   		return 16384;
>   	case PIPE_SHADER_CAP_MAX_INPUTS:
> +	case PIPE_SHADER_CAP_MAX_VARYINGS:
>   		return shader == PIPE_SHADER_VERTEX ? SI_MAX_ATTRIBS : 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 ef3e07ea38..4f91a33aae 100644
> --- a/src/gallium/drivers/svga/svga_screen.c
> +++ b/src/gallium/drivers/svga/svga_screen.c
> @@ -488,6 +488,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;
> @@ -554,6 +555,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;
> @@ -645,6 +647,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 e206456f24..c9b233f2c1 100644
> --- a/src/gallium/drivers/vc4/vc4_screen.c
> +++ b/src/gallium/drivers/vc4/vc4_screen.c
> @@ -383,6 +383,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 68d74adadd..f872e2c24f 100644
> --- a/src/gallium/drivers/virgl/virgl_screen.c
> +++ b/src/gallium/drivers/virgl/virgl_screen.c
> @@ -308,6 +308,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 16;
>            return (shader == PIPE_SHADER_VERTEX ||
> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> index da7d5da734..88f2210708 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -844,6 +844,7 @@ enum pipe_shader_cap
>      PIPE_SHADER_CAP_MAX_SHADER_IMAGES,
>      PIPE_SHADER_CAP_LOWER_IF_THRESHOLD,
>      PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS,
> +   PIPE_SHADER_CAP_MAX_VARYINGS,
>   };
>   
>   /**
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index 8785903251..32f2467f04 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);
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list