[PATCH] etnaviv: Fix point sprite issue on HALTI0
Lucas Stach
l.stach at pengutronix.de
Wed Nov 15 18:47:54 UTC 2017
Hi Wladimir,
Am Mittwoch, den 15.11.2017, 18:03 +0100 schrieb Wladimir J. van der Laan:
> A recent commit (see below) fixed flat shading but at the same time
> broke the use of point sprites with multiple varyings. This resulted in
> particle systems rendering wrongly.
>
> The reason for this is that it set VARYING_COMPONENT_USE_POINTCOORD_[XY]
> for all non-color varyings, causing them to be replaced with the point
> coordinate when rendering points.
>
> VARYING_COMPONENT_USE_POINTCOORD_[XY] is a misnomer, it should be
> TEXCOORD. Its semantics are: texture coordinates will get replaced with
> the point coordinate when rendering GL_POINTS, for other primitives
> their interpolation is independent of the shading model.
>
> So use VARYING_COMPONENT_USE_POINTCOORD_[XY] only for texture coordinates.
> This causes them to be interpolated correctly while flat shading, while
> generic varyings are left as-is when rendering point sprites.
Sorry for noticing before, but this breaks glmark2 texture. I didn't
yet dig into the issue but it's definitely caused by this commit.
To reproduce, simply run
glmark2-es2-drm -b texture:texture-filter=mipmap
Regards,
Lucas
> Fixes: cedab87e762aa38997a07bc8a2eb624aed584afd "etnaviv: fix varying interpolation"
> > Signed-off-by: Wladimir J. van der Laan <laanwj at gmail.com>
> ---
> src/gallium/drivers/etnaviv/etnaviv_compiler.c | 13 +++++++++----
> 1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.c b/src/gallium/drivers/etnaviv/etnaviv_compiler.c
> index 3180646..6569979 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_compiler.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.c
> @@ -2561,7 +2561,11 @@ etna_link_shader(struct etna_shader_link_info *info,
> const struct etna_shader_inout *fsio = &fs->infile.reg[idx];
> const struct etna_shader_inout *vsio = etna_shader_vs_lookup(vs, fsio);
> struct etna_varying *varying;
> - bool interpolate_always = fsio->semantic.Name != TGSI_SEMANTIC_COLOR;
> + /* Texture coordinates will get replaced with the point coordinate when
> + * rendering GL_POINTS, for other primitives their interpolation is
> + * independent of the shading model. */
> + bool is_texcoord = fsio->semantic.Name == TGSI_SEMANTIC_TEXCOORD ||
> + fsio->semantic.Name == TGSI_SEMANTIC_PCOORD;
>
> assert(fsio->reg > 0 && fsio->reg <= ARRAY_SIZE(info->varyings));
>
> @@ -2571,13 +2575,14 @@ etna_link_shader(struct etna_shader_link_info *info,
> varying = &info->varyings[fsio->reg - 1];
> varying->num_components = fsio->num_components;
>
> - if (!interpolate_always) /* colors affected by flat shading */
> + /* PA_ATTRIBUTES appears to be unused on HALTI0 and up */
> + if (!is_texcoord) /* colors affected by flat shading */
> varying->pa_attributes = 0x200;
> else /* texture coord or other bypasses flat shading */
> varying->pa_attributes = 0x2f1;
>
> - varying->use[0] = interpolate_always ? VARYING_COMPONENT_USE_POINTCOORD_X : VARYING_COMPONENT_USE_USED;
> - varying->use[1] = interpolate_always ? VARYING_COMPONENT_USE_POINTCOORD_Y : VARYING_COMPONENT_USE_USED;
> + varying->use[0] = is_texcoord ? VARYING_COMPONENT_USE_POINTCOORD_X : VARYING_COMPONENT_USE_USED;
> + varying->use[1] = is_texcoord ? VARYING_COMPONENT_USE_POINTCOORD_Y : VARYING_COMPONENT_USE_USED;
> varying->use[2] = VARYING_COMPONENT_USE_USED;
> varying->use[3] = VARYING_COMPONENT_USE_USED;
>
More information about the etnaviv
mailing list