2017-10-30 17:17 GMT+01:00 Wladimir J. van der Laan <laa...@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 <laa...@gmail.com>
Reviewed-by: Christian Gmeiner <christian.gmei...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev