etnaviv: GC7000: Make point sprites work on HALTI5
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@gmail.com> Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
This commit is contained in:

committed by
Christian Gmeiner

parent
3d09bb390a
commit
5cc36f9f21
@@ -2550,12 +2550,14 @@ bool
|
|||||||
etna_link_shader(struct etna_shader_link_info *info,
|
etna_link_shader(struct etna_shader_link_info *info,
|
||||||
const struct etna_shader_variant *vs, const struct etna_shader_variant *fs)
|
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
|
/* 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
|
* 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
|
* 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.
|
* semantic index and grouped by semantic type by fill_in_vs_outputs.
|
||||||
*/
|
*/
|
||||||
assert(fs->infile.num_reg < ETNA_NUM_INPUTS);
|
assert(fs->infile.num_reg < ETNA_NUM_INPUTS);
|
||||||
|
info->pcoord_varying_comp_ofs = -1;
|
||||||
|
|
||||||
for (int idx = 0; idx < fs->infile.num_reg; ++idx) {
|
for (int idx = 0; idx < fs->infile.num_reg; ++idx) {
|
||||||
const struct etna_shader_inout *fsio = &fs->infile.reg[idx];
|
const struct etna_shader_inout *fsio = &fs->infile.reg[idx];
|
||||||
@@ -2582,16 +2584,23 @@ etna_link_shader(struct etna_shader_link_info *info,
|
|||||||
varying->use[3] = VARYING_COMPONENT_USE_USED;
|
varying->use[3] = VARYING_COMPONENT_USE_USED;
|
||||||
|
|
||||||
|
|
||||||
/* point coord is position output from VS, so has no dedicated reg */
|
/* point coord is an input to the PS without matching VS output,
|
||||||
if (fsio->semantic.Name == TGSI_SEMANTIC_PCOORD)
|
* so it gets a varying slot without being assigned a VS register.
|
||||||
continue;
|
*/
|
||||||
|
if (fsio->semantic.Name == TGSI_SEMANTIC_PCOORD) {
|
||||||
if (vsio == NULL)
|
info->pcoord_varying_comp_ofs = comp_ofs;
|
||||||
return true; /* not found -- link error */
|
} else {
|
||||||
|
if (vsio == NULL) { /* not found -- link error */
|
||||||
|
BUG("Semantic %d value %d not found in vertex shader outputs\n", fsio->semantic.Name, fsio->semantic.Index);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
varying->reg = vsio->reg;
|
varying->reg = vsio->reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
comp_ofs += varying->num_components;
|
||||||
|
}
|
||||||
|
|
||||||
assert(info->num_varyings == fs->infile.num_reg);
|
assert(info->num_varyings == fs->infile.num_reg);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@@ -118,6 +118,7 @@ struct etna_shader_link_info {
|
|||||||
/* each PS input is annotated with the VS output reg */
|
/* each PS input is annotated with the VS output reg */
|
||||||
unsigned num_varyings;
|
unsigned num_varyings;
|
||||||
struct etna_varying varyings[ETNA_NUM_INPUTS];
|
struct etna_varying varyings[ETNA_NUM_INPUTS];
|
||||||
|
int pcoord_varying_comp_ofs;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@@ -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[0] = component_use[0];
|
||||||
cs->GL_VARYING_COMPONENT_USE[1] = component_use[1];
|
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 */
|
/* reference instruction memory */
|
||||||
cs->vs_inst_mem_size = vs->code_size;
|
cs->vs_inst_mem_size = vs->code_size;
|
||||||
cs->VS_INST_MEM = vs->code;
|
cs->VS_INST_MEM = vs->code;
|
||||||
|
Reference in New Issue
Block a user