[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