Please makes this a non-shader cap if the value doesn't vary between shaders.
Marek On Sun, Aug 27, 2017 at 12:59 PM, Karol Herbst <karolher...@gmail.com> wrote: > this way Nouveau can report 128 inputs, but only 124 varyings. > > Fixes: 'KHR-GL45.limits.max_fragment_input_components' > Signed-off-by: Karol Herbst <karolher...@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); > -- > 2.14.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev