Add some comments to explain things, code clarifications.

Also, add quad.facing field for front/back facing.  See comments for details.
This commit is contained in:
Brian
2007-05-25 15:45:21 -06:00
parent cbe4dbef8e
commit 00d5334899
3 changed files with 72 additions and 36 deletions
+1
View File
@@ -93,6 +93,7 @@ struct quad_header {
GLint x0;
GLint y0;
GLuint mask;
GLuint facing; /**< Front or back facing? */
struct {
GLfloat color[4][QUAD_SIZE]; /* rrrr, gggg, bbbb, aaaa */
+49 -29
View File
@@ -68,35 +68,30 @@ struct setup_stage {
struct quad_header quad;
struct {
GLint left[2];
GLint left[2]; /**< [0] = row0, [1] = row1 */
GLint right[2];
GLint y;
GLuint y_flags;
GLuint mask;
GLuint mask; /**< mask of MASK_BOTTOM/TOP_LEFT/RIGHT bits */
} span;
};
/**
* Basically a cast wrapper.
*/
static inline struct setup_stage *setup_stage( struct prim_stage *stage )
{
return (struct setup_stage *)stage;
}
static inline GLint _min(GLint x, GLint y)
{
return x < y ? x : y;
}
static inline GLint _max(GLint x, GLint y)
{
return x > y ? x : y;
}
/**
* Given an X or Y coordinate, return the block/quad coordinate that it
* belongs to.
*/
static inline GLint block( GLint x )
{
return x & ~1;
@@ -110,7 +105,9 @@ static void setup_begin( struct prim_stage *stage )
}
/**
* Run shader on a quad/block.
*/
static void run_shader_block( struct setup_stage *setup,
GLint x, GLint y, GLuint mask )
{
@@ -122,7 +119,11 @@ static void run_shader_block( struct setup_stage *setup,
}
/* this is pretty nasty... may need to rework flush_spans again to
/**
* Compute mask which indicates which pixels in the 2x2 quad are actually inside
* the triangle's bounds.
*
* this is pretty nasty... may need to rework flush_spans again to
* fix it, if possible.
*/
static GLuint calculate_mask( struct setup_stage *setup,
@@ -146,6 +147,9 @@ static GLuint calculate_mask( struct setup_stage *setup,
}
/**
* Render a horizontal span of quads
*/
static void flush_spans( struct setup_stage *setup )
{
GLint minleft, maxright;
@@ -153,10 +157,8 @@ static void flush_spans( struct setup_stage *setup )
switch (setup->span.y_flags) {
case 3:
minleft = _min(setup->span.left[0],
setup->span.left[1]);
maxright = _max(setup->span.right[0],
setup->span.right[1]);
minleft = MIN2(setup->span.left[0], setup->span.left[1]);
maxright = MAX2(setup->span.right[0], setup->span.right[1]);
break;
case 1:
@@ -188,8 +190,10 @@ static void flush_spans( struct setup_stage *setup )
setup->span.right[1] = 0;
}
/**
* Do setup for point rasterization, then render the point.
*/
static void
setup_point( struct prim_stage *stage,
struct prim_header *header )
@@ -197,6 +201,9 @@ setup_point( struct prim_stage *stage,
}
/**
* Do setup for line rasterization, then render the line.
*/
static void
setup_line( struct prim_stage *stage,
struct prim_header *header )
@@ -204,10 +211,6 @@ setup_line( struct prim_stage *stage,
}
static GLboolean setup_sort_vertices( struct setup_stage *setup,
const struct prim_header *prim )
{
@@ -288,6 +291,11 @@ static GLboolean setup_sort_vertices( struct setup_stage *setup,
setup->oneoverarea = 1.0 / area;
}
/* XXX need to know if this is a front or back-facing triangle:
* - the GLSL gl_FrontFacing fragment attribute (bool)
* - two-sided stencil test
*/
setup->quad.facing = 0;
_mesa_printf("%s one-over-area %f\n", __FUNCTION__, setup->oneoverarea );
@@ -296,6 +304,9 @@ static GLboolean setup_sort_vertices( struct setup_stage *setup,
}
/**
* Compute a0 for a constant-valued coefficient (GL_FLAT shading).
*/
static void const_coeff( struct setup_stage *setup,
GLuint slot,
GLuint i )
@@ -309,6 +320,9 @@ static void const_coeff( struct setup_stage *setup,
}
/**
* Compute a0, dadx and dady for a linearly interpolated coefficient.
*/
static void linear_coeff( struct setup_stage *setup,
GLuint slot,
GLuint i)
@@ -345,6 +359,9 @@ static void linear_coeff( struct setup_stage *setup,
}
/**
* Compute a0, dadx and dady for a perspective-corrected interpolant.
*/
static void persp_coeff( struct setup_stage *setup,
GLuint slot,
GLuint i )
@@ -430,10 +447,10 @@ static void setup_edges( struct setup_stage *setup )
}
/**
* Render the upper or lower half of a triangle.
* Scissoring is applied here too.
*/
static void subtriangle( struct setup_stage *setup,
struct edge *eleft,
struct edge *eright,
@@ -511,6 +528,9 @@ static void subtriangle( struct setup_stage *setup,
}
/**
* Do setup for triangle rasterization, then render the triangle.
*/
static void setup_tri( struct prim_stage *stage,
struct prim_header *prim )
{
+22 -7
View File
@@ -44,6 +44,9 @@ struct exec_machine {
};
/**
* Compute quad's attributes values, as constants (GL_FLAT shading).
*/
static void INLINE cinterp( struct exec_machine *exec,
GLuint attrib,
GLuint i )
@@ -56,7 +59,10 @@ static void INLINE cinterp( struct exec_machine *exec,
}
/* Push into the fp:
/**
* Compute quad's attribute values by linear interpolation.
*
* Push into the fp:
*
* INPUT[attr] = MAD COEF_A0[attr], COEF_DADX[attr], INPUT_WPOS.xxxx
* INPUT[attr] = MAD INPUT[attr], COEF_DADY[attr], INPUT_WPOS.yyyy
@@ -68,14 +74,20 @@ static INLINE void linterp( struct exec_machine *exec,
GLuint j;
for (j = 0; j < QUAD_SIZE; j++) {
const GLfloat x = exec->attr[FRAG_ATTRIB_WPOS][0][j];
const GLfloat y = exec->attr[FRAG_ATTRIB_WPOS][1][j];
exec->attr[attrib][i][j] = (exec->coef[attrib].a0[i] +
exec->coef[attrib].dadx[i] * exec->attr[0][0][j] +
exec->coef[attrib].dady[i] * exec->attr[0][1][j]);
exec->coef[attrib].dadx[i] * x +
exec->coef[attrib].dady[i] * y);
}
}
/* Push into the fp:
/**
* Compute quad's attribute values by linear interpolation with
* perspective correction.
*
* Push into the fp:
*
* INPUT[attr] = MAD COEF_A0[attr], COEF_DADX[attr], INPUT_WPOS.xxxx
* INPUT[attr] = MAD INPUT[attr], COEF_DADY[attr], INPUT_WPOS.yyyy
@@ -90,10 +102,12 @@ static INLINE void pinterp( struct exec_machine *exec,
GLuint j;
for (j = 0; j < QUAD_SIZE; j++) {
const GLfloat x = exec->attr[FRAG_ATTRIB_WPOS][0][j];
const GLfloat y = exec->attr[FRAG_ATTRIB_WPOS][1][j];
const GLfloat invW = exec->attr[FRAG_ATTRIB_WPOS][3][j];
exec->attr[attrib][i][j] = ((exec->coef[attrib].a0[i] +
exec->coef[attrib].dadx[i] * exec->attr[0][0][j] +
exec->coef[attrib].dady[i] * exec->attr[0][1][j]) *
exec->attr[0][3][j]);
exec->coef[attrib].dadx[i] * x +
exec->coef[attrib].dady[i] * y) * invW);
}
}
@@ -125,6 +139,7 @@ void quad_shade( struct generic_context *generic,
exec.attr[FRAG_ATTRIB_WPOS][1][3] = fy + 1.0;
/* Z and W are done by linear interpolation:
* XXX we'll probably have to use integers for Z
*/
if (generic->need_z) {
linterp(&exec, 0, 2);