diff options
author | Brian <brian.paul@tungstengraphics.com> | 2007-10-16 12:04:16 -0600 |
---|---|---|
committer | Brian <brian.paul@tungstengraphics.com> | 2007-10-16 12:04:16 -0600 |
commit | 63b0b5b6c74fcca7d84ac13b893a1f1f5becf39d (patch) | |
tree | 9e0cdfe52accd85fe2b42be3aae1c59ad66fecb6 /src/mesa/pipe/softpipe | |
parent | ce0f2e88e3f71427dabf0dc37900ce0b47ae8003 (diff) |
fix perspective-interpolated attribs for points, liens
Diffstat (limited to 'src/mesa/pipe/softpipe')
-rw-r--r-- | src/mesa/pipe/softpipe/sp_prim_setup.c | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/src/mesa/pipe/softpipe/sp_prim_setup.c b/src/mesa/pipe/softpipe/sp_prim_setup.c index 2e27d00acf..7c81faf9df 100644 --- a/src/mesa/pipe/softpipe/sp_prim_setup.c +++ b/src/mesa/pipe/softpipe/sp_prim_setup.c @@ -659,9 +659,9 @@ static void setup_tri( struct draw_stage *stage, static void line_linear_coeff(struct setup_stage *setup, unsigned slot, unsigned i) { - const float dz = setup->vmax->data[slot][i] - setup->vmin->data[slot][i]; - const float dadx = dz * setup->emaj.dx * setup->oneoverarea; - const float dady = dz * setup->emaj.dy * setup->oneoverarea; + const float da = setup->vmax->data[slot][i] - setup->vmin->data[slot][i]; + const float dadx = da * setup->emaj.dx * setup->oneoverarea; + const float dady = da * setup->emaj.dy * setup->oneoverarea; setup->coef[slot].dadx[i] = dadx; setup->coef[slot].dady[i] = dady; setup->coef[slot].a0[i] @@ -678,8 +678,19 @@ line_linear_coeff(struct setup_stage *setup, unsigned slot, unsigned i) static void line_persp_coeff(struct setup_stage *setup, unsigned slot, unsigned i) { - /* XXX to do */ - line_linear_coeff(setup, slot, i); /* XXX temporary */ + /* XXX double-check/verify this arithmetic */ + const float a0 = setup->vmin->data[slot][i] * setup->vmin->data[0][3]; + const float a1 = setup->vmax->data[slot][i] * setup->vmin->data[0][3]; + const float da = a1 - a0; + const float dadx = da * setup->emaj.dx * setup->oneoverarea; + const float dady = da * setup->emaj.dy * setup->oneoverarea; + setup->coef[slot].dadx[i] = dadx; + setup->coef[slot].dady[i] = dady; + setup->coef[slot].a0[i] + = (setup->vmin->data[slot][i] - + (dadx * (setup->vmin->data[0][0] - 0.5f) + + dady * (setup->vmin->data[0][1] - 0.5f))); + } @@ -895,6 +906,18 @@ setup_line(struct draw_stage *stage, struct prim_header *prim) } +static void +point_persp_coeff(struct setup_stage *setup, const struct vertex_header *vert, + uint slot, uint i) +{ + assert(slot < PIPE_MAX_SHADER_INPUTS); + assert(i <= 3); + setup->coef[slot].dadx[i] = 0.0F; + setup->coef[slot].dady[i] = 0.0F; + setup->coef[slot].a0[i] = vert->data[slot][i] * vert->data[0][3]; +} + + /** * Do setup for point rasterization, then render the point. * Round or square points... @@ -904,6 +927,7 @@ static void setup_point(struct draw_stage *stage, struct prim_header *prim) { struct setup_stage *setup = setup_stage( stage ); + const interp_mode *interp = setup->softpipe->vertex_info.interp_mode; const struct vertex_header *v0 = prim->v[0]; const int sizeAttr = setup->softpipe->psize_slot; const float halfSize @@ -934,8 +958,20 @@ setup_point(struct draw_stage *stage, struct prim_header *prim) const_coeff(setup, 0, 2); const_coeff(setup, 0, 3); for (slot = 1; slot < setup->quad.nr_attrs; slot++) { - for (j = 0; j < NUM_CHANNELS; j++) - const_coeff(setup, slot, j); + switch (interp[slot]) { + case INTERP_CONSTANT: + /* fall-through */ + case INTERP_LINEAR: + for (j = 0; j < NUM_CHANNELS; j++) + const_coeff(setup, slot, j); + break; + case INTERP_PERSPECTIVE: + for (j = 0; j < NUM_CHANNELS; j++) + point_persp_coeff(setup, v0, slot, j); + break; + default: + assert(0); + } } setup->quad.prim = PRIM_POINT; |