[PATCH 14/19] etnaviv: GC7000: Make point sprites work on HALTI5

Christian Gmeiner christian.gmeiner at gmail.com
Sun Nov 5 15:19:33 UTC 2017


2017-10-30 17:17 GMT+01:00 Wladimir J. van der Laan <laanwj at gmail.com>:
> Track varying component offset of the point size output, as well as
> provide the offset of the point coord input.
>
> Signed-off-by: Wladimir J. van der Laan <laanwj at gmail.com>

Reviewed-by: Christian Gmeiner <christian.gmeiner at gmail.com>

> ---
>  src/gallium/drivers/etnaviv/etnaviv_compiler.c | 7 ++++++-
>  src/gallium/drivers/etnaviv/etnaviv_compiler.h | 1 +
>  src/gallium/drivers/etnaviv/etnaviv_shader.c   | 8 ++++++++
>  3 files changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.c b/src/gallium/drivers/etnaviv/etnaviv_compiler.c
> index 3180646..4351175 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_compiler.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.c
> @@ -2550,12 +2550,14 @@ bool
>  etna_link_shader(struct etna_shader_link_info *info,
>                   const struct etna_shader_variant *vs, const struct etna_shader_variant *fs)
>  {
> +   int comp_ofs = 0;
>     /* For each fragment input we need to find the associated vertex shader
>      * output, which can be found by matching on semantic name and index. A
>      * binary search could be used because the vs outputs are sorted by their
>      * semantic index and grouped by semantic type by fill_in_vs_outputs.
>      */
>     assert(fs->infile.num_reg < ETNA_NUM_INPUTS);
> +   info->pcoord_varying_comp_ofs = -1;
>
>     for (int idx = 0; idx < fs->infile.num_reg; ++idx) {
>        const struct etna_shader_inout *fsio = &fs->infile.reg[idx];
> @@ -2583,8 +2585,10 @@ etna_link_shader(struct etna_shader_link_info *info,
>
>
>        /* point coord is position output from VS, so has no dedicated reg */
> -      if (fsio->semantic.Name == TGSI_SEMANTIC_PCOORD)
> +      if (fsio->semantic.Name == TGSI_SEMANTIC_PCOORD) {
> +         info->pcoord_varying_comp_ofs = comp_ofs;
>           continue;
> +      }
>
>        if (vsio == NULL) {
>           BUG("Semantic %d value %d not found in vertex shader outputs\n", fsio->semantic.Name, fsio->semantic.Index);
> @@ -2592,6 +2596,7 @@ etna_link_shader(struct etna_shader_link_info *info,
>        }
>
>        varying->reg = vsio->reg;
> +      comp_ofs += varying->num_components;
>     }
>
>     assert(info->num_varyings == fs->infile.num_reg);
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.h b/src/gallium/drivers/etnaviv/etnaviv_compiler.h
> index f5c1689..48b1b21 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_compiler.h
> +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.h
> @@ -118,6 +118,7 @@ struct etna_shader_link_info {
>     /* each PS input is annotated with the VS output reg */
>     unsigned num_varyings;
>     struct etna_varying varyings[ETNA_NUM_INPUTS];
> +   int pcoord_varying_comp_ofs;
>  };
>
>  bool
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_shader.c b/src/gallium/drivers/etnaviv/etnaviv_shader.c
> index 6012680..04ababc 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_shader.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_shader.c
> @@ -179,6 +179,14 @@ etna_link_shaders(struct etna_context *ctx, struct compiled_shader_state *cs,
>     cs->GL_VARYING_COMPONENT_USE[0] = component_use[0];
>     cs->GL_VARYING_COMPONENT_USE[1] = component_use[1];
>
> +   cs->GL_HALTI5_SH_SPECIALS =
> +      0x7f7f0000 | /* unknown bits, probably other PS inputs */
> +      /* pointsize is last (see above) */
> +      VIVS_GL_HALTI5_SH_SPECIALS_VS_PSIZE_OUT((vs->vs_pointsize_out_reg != -1) ?
> +                                              cs->VS_OUTPUT_COUNT * 4 : 0x00) |
> +      VIVS_GL_HALTI5_SH_SPECIALS_PS_PCOORD_IN((link.pcoord_varying_comp_ofs != -1) ?
> +                                              link.pcoord_varying_comp_ofs : 0x7f);
> +
>     /* reference instruction memory */
>     cs->vs_inst_mem_size = vs->code_size;
>     cs->VS_INST_MEM = vs->code;
> --
> 2.7.4
>



-- 
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info


More information about the etnaviv mailing list