diff options
author | Keith Whitwell <[email protected]> | 1999-10-19 18:37:02 +0000 |
---|---|---|
committer | Keith Whitwell <[email protected]> | 1999-10-19 18:37:02 +0000 |
commit | d471473b5842154c0b44b7bec149401f6dab43cc (patch) | |
tree | 5a6e53fde0662dcd2eb4b3455eaaf0a470126c1d /src/mesa/main/eval.c | |
parent | 52880f85b5270fb156c1b75effabc9c2c8b61511 (diff) |
Changes to reduce the memory footprint of display lists
Diffstat (limited to 'src/mesa/main/eval.c')
-rw-r--r-- | src/mesa/main/eval.c | 186 |
1 files changed, 112 insertions, 74 deletions
diff --git a/src/mesa/main/eval.c b/src/mesa/main/eval.c index 18676e73add..eee7a84509a 100644 --- a/src/mesa/main/eval.c +++ b/src/mesa/main/eval.c @@ -1,4 +1,4 @@ -/* $Id: eval.c,v 1.4 1999/10/13 18:42:50 brianp Exp $ */ +/* $Id: eval.c,v 1.5 1999/10/19 18:37:03 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -1990,12 +1990,13 @@ void gl_GetMapiv( GLcontext* ctx, GLenum target, GLenum query, GLint *v ) static void eval_points1( GLfloat outcoord[][4], - GLfloat coord[][4], - const GLuint *flags, - GLfloat du, GLfloat u1 ) + GLfloat coord[][4], + const GLuint *flags, + GLuint start, + GLfloat du, GLfloat u1 ) { GLuint i; - for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for (i = start ; !(flags[i] & VERT_END_VB) ; i++) if (flags[i] & VERT_EVAL_P1) outcoord[i][0] = coord[i][0] * du + u1; else if (flags[i] & VERT_EVAL_ANY) { @@ -2005,13 +2006,14 @@ static void eval_points1( GLfloat outcoord[][4], } static void eval_points2( GLfloat outcoord[][4], - GLfloat coord[][4], - const GLuint *flags, - GLfloat du, GLfloat u1, - GLfloat dv, GLfloat v1 ) + GLfloat coord[][4], + const GLuint *flags, + GLuint start, + GLfloat du, GLfloat u1, + GLfloat dv, GLfloat v1 ) { GLuint i; - for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for (i = start ; !(flags[i] & VERT_END_VB) ; i++) if (flags[i] & VERT_EVAL_P2) { outcoord[i][0] = coord[i][0] * du + u1; outcoord[i][1] = coord[i][1] * dv + v1; @@ -2033,7 +2035,8 @@ static const GLubyte dirty_flags[5] = { static GLvector4f *eval1_4f( GLvector4f *dest, GLfloat coord[][4], - const GLuint *flags, + const GLuint *flags, + GLuint start, GLuint dimension, struct gl_1d_map *map ) { @@ -2042,7 +2045,7 @@ static GLvector4f *eval1_4f( GLvector4f *dest, GLfloat (*to)[4] = dest->data; GLuint i; - for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for (i = start ; !(flags[i] & VERT_END_VB) ; i++) if (flags[i] & (VERT_EVAL_C1|VERT_EVAL_P1)) { GLfloat u = (coord[i][0] - u1) * du; ASSIGN_4V(to[i], 0,0,0,1); @@ -2050,6 +2053,7 @@ static GLvector4f *eval1_4f( GLvector4f *dest, } dest->count = i; + dest->start = VEC_ELT(dest, GLfloat, start); dest->size = MAX2(dest->size, dimension); dest->flags |= dirty_flags[dimension]; return dest; @@ -2058,7 +2062,8 @@ static GLvector4f *eval1_4f( GLvector4f *dest, static GLvector1ui *eval1_1ui( GLvector1ui *dest, GLfloat coord[][4], - const GLuint *flags, + const GLuint *flags, + GLuint start, struct gl_1d_map *map ) { const GLfloat u1 = map->u1; @@ -2066,7 +2071,7 @@ static GLvector1ui *eval1_1ui( GLvector1ui *dest, GLuint *to = dest->data; GLuint i; - for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for (i = start ; !(flags[i] & VERT_END_VB) ; i++) if (flags[i] & (VERT_EVAL_C1|VERT_EVAL_P1)) { GLfloat u = (coord[i][0] - u1) * du; GLfloat tmp; @@ -2074,42 +2079,46 @@ static GLvector1ui *eval1_1ui( GLvector1ui *dest, to[i] = (GLuint) (GLint) tmp; } + dest->start = VEC_ELT(dest, GLuint, start); dest->count = i; return dest; } static GLvector3f *eval1_norm( GLvector3f *dest, - GLfloat coord[][4], - GLuint *flags, /* not const */ - struct gl_1d_map *map ) + GLfloat coord[][4], + GLuint *flags, /* not const */ + GLuint start, + struct gl_1d_map *map ) { const GLfloat u1 = map->u1; const GLfloat du = map->du; GLfloat (*to)[3] = dest->data; GLuint i; - for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for (i = start ; !(flags[i] & VERT_END_VB) ; i++) if (flags[i] & (VERT_EVAL_C1|VERT_EVAL_P1)) { GLfloat u = (coord[i][0] - u1) * du; horner_bezier_curve(map->Points, to[i], u, 3, map->Order); flags[i+1] |= VERT_NORM; /* reset */ } + dest->start = VEC_ELT(dest, GLfloat, start); dest->count = i; return dest; } static GLvector4ub *eval1_color( GLvector4ub *dest, - GLfloat coord[][4], - GLuint *flags, /* not const */ - struct gl_1d_map *map ) + GLfloat coord[][4], + GLuint *flags, /* not const */ + GLuint start, + struct gl_1d_map *map ) { const GLfloat u1 = map->u1; const GLfloat du = map->du; GLubyte (*to)[4] = dest->data; GLuint i; - for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for (i = start ; !(flags[i] & VERT_END_VB) ; i++) if (flags[i] & (VERT_EVAL_C1|VERT_EVAL_P1)) { GLfloat u = (coord[i][0] - u1) * du; GLfloat fcolor[4]; @@ -2118,6 +2127,7 @@ static GLvector4ub *eval1_color( GLvector4ub *dest, flags[i+1] |= VERT_RGBA; /* reset */ } + dest->start = VEC_ELT(dest, GLubyte, start); dest->count = i; return dest; } @@ -2129,6 +2139,7 @@ static GLvector4f *eval2_obj_norm( GLvector4f *obj_ptr, GLvector3f *norm_ptr, GLfloat coord[][4], GLuint *flags, + GLuint start, GLuint dimension, struct gl_2d_map *map ) { @@ -2140,7 +2151,7 @@ static GLvector4f *eval2_obj_norm( GLvector4f *obj_ptr, GLfloat (*normal)[3] = norm_ptr->data; GLuint i; - for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for (i = start ; !(flags[i] & VERT_END_VB) ; i++) if (flags[i] & (VERT_EVAL_C2|VERT_EVAL_P2)) { GLfloat u = (coord[i][0] - u1) * du; GLfloat v = (coord[i][1] - v1) * dv; @@ -2155,6 +2166,7 @@ static GLvector4f *eval2_obj_norm( GLvector4f *obj_ptr, flags[i+1] |= VERT_NORM; } + obj_ptr->start = VEC_ELT(obj_ptr, GLfloat, start); obj_ptr->count = i; obj_ptr->size = MAX2(obj_ptr->size, dimension); obj_ptr->flags |= dirty_flags[dimension]; @@ -2164,7 +2176,8 @@ static GLvector4f *eval2_obj_norm( GLvector4f *obj_ptr, static GLvector4f *eval2_4f( GLvector4f *dest, GLfloat coord[][4], - const GLuint *flags, + const GLuint *flags, + GLuint start, GLuint dimension, struct gl_2d_map *map ) { @@ -2175,7 +2188,7 @@ static GLvector4f *eval2_4f( GLvector4f *dest, GLfloat (*to)[4] = dest->data; GLuint i; - for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for (i = start ; !(flags[i] & VERT_END_VB) ; i++) if (flags[i] & (VERT_EVAL_C2|VERT_EVAL_P2)) { GLfloat u = (coord[i][0] - u1) * du; GLfloat v = (coord[i][1] - v1) * dv; @@ -2183,6 +2196,7 @@ static GLvector4f *eval2_4f( GLvector4f *dest, map->Uorder, map->Vorder); } + dest->start = VEC_ELT(dest, GLfloat, start); dest->count = i; dest->size = MAX2(dest->size, dimension); dest->flags |= dirty_flags[dimension]; @@ -2193,6 +2207,7 @@ static GLvector4f *eval2_4f( GLvector4f *dest, static GLvector3f *eval2_norm( GLvector3f *dest, GLfloat coord[][4], GLuint *flags, + GLuint start, struct gl_2d_map *map ) { const GLfloat u1 = map->u1; @@ -2202,7 +2217,7 @@ static GLvector3f *eval2_norm( GLvector3f *dest, GLfloat (*to)[3] = dest->data; GLuint i; - for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for (i = start ; !(flags[i] & VERT_END_VB) ; i++) if (flags[i] & (VERT_EVAL_C2|VERT_EVAL_P2)) { GLfloat u = (coord[i][0] - u1) * du; GLfloat v = (coord[i][1] - v1) * dv; @@ -2211,6 +2226,7 @@ static GLvector3f *eval2_norm( GLvector3f *dest, flags[i+1] |= VERT_NORM; /* reset */ } + dest->start = VEC_ELT(dest, GLfloat, start); dest->count = i; return dest; } @@ -2218,7 +2234,8 @@ static GLvector3f *eval2_norm( GLvector3f *dest, static GLvector1ui *eval2_1ui( GLvector1ui *dest, GLfloat coord[][4], - const GLuint *flags, + const GLuint *flags, + GLuint start, struct gl_2d_map *map ) { const GLfloat u1 = map->u1; @@ -2228,7 +2245,7 @@ static GLvector1ui *eval2_1ui( GLvector1ui *dest, GLuint *to = dest->data; GLuint i; - for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for (i = start ; !(flags[i] & VERT_END_VB) ; i++) if (flags[i] & (VERT_EVAL_C2|VERT_EVAL_P2)) { GLfloat u = (coord[i][0] - u1) * du; GLfloat v = (coord[i][1] - v1) * dv; @@ -2239,6 +2256,7 @@ static GLvector1ui *eval2_1ui( GLvector1ui *dest, to[i] = (GLuint) (GLint) tmp; } + dest->start = VEC_ELT(dest, GLuint, start); dest->count = i; return dest; } @@ -2248,6 +2266,7 @@ static GLvector1ui *eval2_1ui( GLvector1ui *dest, static GLvector4ub *eval2_color( GLvector4ub *dest, GLfloat coord[][4], GLuint *flags, + GLuint start, struct gl_2d_map *map ) { const GLfloat u1 = map->u1; @@ -2257,7 +2276,7 @@ static GLvector4ub *eval2_color( GLvector4ub *dest, GLubyte (*to)[4] = dest->data; GLuint i; - for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for (i = start ; !(flags[i] & VERT_END_VB) ; i++) if (flags[i] & (VERT_EVAL_C2|VERT_EVAL_P2)) { GLfloat u = (coord[i][0] - u1) * du; GLfloat v = (coord[i][1] - v1) * dv; @@ -2268,64 +2287,75 @@ static GLvector4ub *eval2_color( GLvector4ub *dest, flags[i+1] |= VERT_RGBA; /* reset */ } + dest->start = VEC_ELT(dest, GLubyte, start); dest->count = i; return dest; } static GLvector4f *copy_4f( GLvector4f *out, CONST GLvector4f *in, - const GLuint *flags) + const GLuint *flags, + GLuint start ) { GLfloat (*to)[4] = out->data; GLfloat (*from)[4] = in->data; GLuint i; - for ( i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for ( i = start ; !(flags[i] & VERT_END_VB) ; i++) if (!(flags[i] & VERT_EVAL_ANY)) COPY_4FV( to[i], from[i] ); + out->start = VEC_ELT(out, GLfloat, start); return out; } static GLvector3f *copy_3f( GLvector3f *out, CONST GLvector3f *in, - const GLuint *flags) + const GLuint *flags, + GLuint start ) { GLfloat (*to)[3] = out->data; GLfloat (*from)[3] = in->data; GLuint i; - for ( i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for ( i = start ; !(flags[i] & VERT_END_VB) ; i++) if (!(flags[i] & VERT_EVAL_ANY)) COPY_3V( to[i], from[i] ); + out->start = VEC_ELT(out, GLfloat, start); return out; } -static GLvector4ub *copy_4ub( GLvector4ub *out, CONST GLvector4ub *in, - const GLuint *flags ) +static GLvector4ub *copy_4ub( GLvector4ub *out, + CONST GLvector4ub *in, + const GLuint *flags, + GLuint start ) { GLubyte (*to)[4] = out->data; GLubyte (*from)[4] = in->data; GLuint i; - for ( i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for ( i = start ; !(flags[i] & VERT_END_VB) ; i++) if (!(flags[i] & VERT_EVAL_ANY)) COPY_4UBV( to[i], from[i] ); + out->start = VEC_ELT(out, GLubyte, start); return out; } -static GLvector1ui *copy_1ui( GLvector1ui *out, CONST GLvector1ui *in, - const GLuint *flags ) +static GLvector1ui *copy_1ui( GLvector1ui *out, + CONST GLvector1ui *in, + const GLuint *flags, + GLuint start ) { GLuint *to = out->data; CONST GLuint *from = in->data; GLuint i; - for ( i = VB_START ; !(flags[i] & VERT_END_VB) ; i++) + for ( i = start ; !(flags[i] & VERT_END_VB) ; i++) if (!(flags[i] & VERT_EVAL_ANY)) to[i] = from[i]; + out->start = VEC_ELT(out, GLuint, start); return out; } @@ -2354,7 +2384,7 @@ void gl_eval_vb( struct vertex_buffer *VB ) GLuint any_eval1 = VB->OrFlag & (VERT_EVAL_C1|VERT_EVAL_P1); GLuint any_eval2 = VB->OrFlag & (VERT_EVAL_C2|VERT_EVAL_P2); - GLuint all_eval = VB->AndFlag & VERT_EVAL_ANY; + GLuint all_eval = IM->AndFlag & VERT_EVAL_ANY; /* Handle the degenerate cases. */ @@ -2379,7 +2409,7 @@ void gl_eval_vb( struct vertex_buffer *VB ) * work on useful changes. */ if (VB->PurgeFlags) { - if (!any_eval1 && !any_eval2 && all_eval) VB->Count = VB_START; + if (!any_eval1 && !any_eval2 && all_eval) VB->Count = VB->Start; gl_purge_vertices( VB ); if (!any_eval1 && !any_eval2) return; } else @@ -2389,7 +2419,7 @@ void gl_eval_vb( struct vertex_buffer *VB ) */ if (any_eval1 && (VB->OrFlag & VERT_EVAL_P1)) { - eval_points1( IM->Obj, coord, flags, + eval_points1( IM->Obj, coord, flags, IM->Start, ctx->Eval.MapGrid1du, ctx->Eval.MapGrid1u1); @@ -2398,7 +2428,7 @@ void gl_eval_vb( struct vertex_buffer *VB ) if (any_eval2 && (VB->OrFlag & VERT_EVAL_P2)) { - eval_points2( IM->Obj, coord, flags, + eval_points2( IM->Obj, coord, flags, IM->Start, ctx->Eval.MapGrid2du, ctx->Eval.MapGrid2u1, ctx->Eval.MapGrid2dv, @@ -2415,17 +2445,17 @@ void gl_eval_vb( struct vertex_buffer *VB ) GLvector1ui *out_index = &IM->v.Index; if (ctx->Eval.Map1Index && any_eval1) - VB->IndexPtr = eval1_1ui( out_index, coord, flags, + VB->IndexPtr = eval1_1ui( out_index, coord, flags, IM->Start, &ctx->EvalMap.Map1Index ); if (ctx->Eval.Map2Index && any_eval2) - VB->IndexPtr = eval2_1ui( out_index, coord, flags, + VB->IndexPtr = eval2_1ui( out_index, coord, flags, IM->Start, &ctx->EvalMap.Map2Index ); if (VB->IndexPtr != in_index) { new_flags |= VERT_INDEX; if (!all_eval) - VB->IndexPtr = copy_1ui( out_index, in_index, flags ); + VB->IndexPtr = copy_1ui( out_index, in_index, flags, IM->Start ); } } @@ -2435,17 +2465,17 @@ void gl_eval_vb( struct vertex_buffer *VB ) GLvector4ub *out_color = &IM->v.Color; if (ctx->Eval.Map1Color4 && any_eval1) - VB->ColorPtr = eval1_color( out_color, coord, flags, + VB->ColorPtr = eval1_color( out_color, coord, flags, IM->Start, &ctx->EvalMap.Map1Color4 ); if (ctx->Eval.Map2Color4 && any_eval2) - VB->ColorPtr = eval2_color( out_color, coord, flags, + VB->ColorPtr = eval2_color( out_color, coord, flags, IM->Start, &ctx->EvalMap.Map2Color4 ); if (VB->ColorPtr != in_color) { new_flags |= VERT_RGBA; if (!all_eval) - VB->ColorPtr = copy_4ub( out_color, in_color, flags ); + VB->ColorPtr = copy_4ub( out_color, in_color, flags, IM->Start ); } VB->Color[0] = VB->Color[1] = VB->ColorPtr; @@ -2458,17 +2488,17 @@ void gl_eval_vb( struct vertex_buffer *VB ) GLvector3f *out_normal = &IM->v.Normal; if (ctx->Eval.Map1Normal && any_eval1) - VB->NormalPtr = eval1_norm( out_normal, coord, flags, + VB->NormalPtr = eval1_norm( out_normal, coord, flags, IM->Start, &ctx->EvalMap.Map1Normal ); if (ctx->Eval.Map2Normal && any_eval2) - VB->NormalPtr = eval2_norm( out_normal, coord, flags, + VB->NormalPtr = eval2_norm( out_normal, coord, flags, IM->Start, &ctx->EvalMap.Map2Normal ); if (VB->NormalPtr != in_normal) { new_flags |= VERT_NORM; if (!all_eval) - VB->NormalPtr = copy_3f( out_normal, in_normal, flags ); + VB->NormalPtr = copy_3f( out_normal, in_normal, flags, IM->Start ); } } @@ -2481,30 +2511,38 @@ void gl_eval_vb( struct vertex_buffer *VB ) if (any_eval1) { if (ctx->Eval.Map1TextureCoord4) - tc = eval1_4f( out, coord, flags, 4, &ctx->EvalMap.Map1Texture4); + tc = eval1_4f( out, coord, flags, IM->Start, + 4, &ctx->EvalMap.Map1Texture4); else if (ctx->Eval.Map1TextureCoord3) - tc = eval1_4f( out, coord, flags, 3, &ctx->EvalMap.Map1Texture3); + tc = eval1_4f( out, coord, flags, IM->Start, 3, + &ctx->EvalMap.Map1Texture3); else if (ctx->Eval.Map1TextureCoord2) - tc = eval1_4f( out, coord, flags, 2, &ctx->EvalMap.Map1Texture2); + tc = eval1_4f( out, coord, flags, IM->Start, 2, + &ctx->EvalMap.Map1Texture2); else if (ctx->Eval.Map1TextureCoord1) - tc = eval1_4f( out, coord, flags, 1, &ctx->EvalMap.Map1Texture1); + tc = eval1_4f( out, coord, flags, IM->Start, 1, + &ctx->EvalMap.Map1Texture1); } if (any_eval2) { if (ctx->Eval.Map2TextureCoord4) - tc = eval2_4f( out, coord, flags, 4, &ctx->EvalMap.Map2Texture4); + tc = eval2_4f( out, coord, flags, IM->Start, + 4, &ctx->EvalMap.Map2Texture4); else if (ctx->Eval.Map2TextureCoord3) - tc = eval2_4f( out, coord, flags, 3, &ctx->EvalMap.Map2Texture3); + tc = eval2_4f( out, coord, flags, IM->Start, + 3, &ctx->EvalMap.Map2Texture3); else if (ctx->Eval.Map2TextureCoord2) - tc = eval2_4f( out, coord, flags, 2, &ctx->EvalMap.Map2Texture2); + tc = eval2_4f( out, coord, flags, IM->Start, + 2, &ctx->EvalMap.Map2Texture2); else if (ctx->Eval.Map2TextureCoord1) - tc = eval2_4f( out, coord, flags, 1, &ctx->EvalMap.Map2Texture1); + tc = eval2_4f( out, coord, flags, IM->Start, + 1, &ctx->EvalMap.Map2Texture1); } if (tc != in) { new_flags |= VERT_TEX_ANY(0); /* fix for sizes.. */ if (!all_eval) - tc = copy_4f( out, in, flags ); + tc = copy_4f( out, in, flags, IM->Start ); } VB->TexCoordPtr[0] = tc; @@ -2518,34 +2556,36 @@ void gl_eval_vb( struct vertex_buffer *VB ) if (any_eval1) { if (ctx->Eval.Map1Vertex4) - obj = eval1_4f( out, coord, flags, 4, &ctx->EvalMap.Map1Vertex4); + obj = eval1_4f( out, coord, flags, IM->Start, + 4, &ctx->EvalMap.Map1Vertex4); else - obj = eval1_4f( out, coord, flags, 3, &ctx->EvalMap.Map1Vertex3); + obj = eval1_4f( out, coord, flags, IM->Start, + 3, &ctx->EvalMap.Map1Vertex3); } if (any_eval2) { if (ctx->Eval.Map2Vertex4) { if (ctx->Eval.AutoNormal && (req & VERT_NORM)) - obj = eval2_obj_norm( out, VB->NormalPtr, coord, flags, 4, - &ctx->EvalMap.Map2Vertex4 ); + obj = eval2_obj_norm( out, VB->NormalPtr, coord, flags, IM->Start, + 4, &ctx->EvalMap.Map2Vertex4 ); else - obj = eval2_4f( out, coord, flags, 4, - &ctx->EvalMap.Map2Vertex4); + obj = eval2_4f( out, coord, flags, IM->Start, + 4, &ctx->EvalMap.Map2Vertex4); } else if (ctx->Eval.Map2Vertex3) { if (ctx->Eval.AutoNormal && (req & VERT_NORM)) - obj = eval2_obj_norm( out, VB->NormalPtr, coord, flags, 3, - &ctx->EvalMap.Map2Vertex3 ); + obj = eval2_obj_norm( out, VB->NormalPtr, coord, flags, IM->Start, + 3, &ctx->EvalMap.Map2Vertex3 ); else - obj = eval2_4f( out, coord, flags, 3, - &ctx->EvalMap.Map2Vertex3 ); + obj = eval2_4f( out, coord, flags, IM->Start, + 3, &ctx->EvalMap.Map2Vertex3 ); } } if (obj != in && !all_eval) - obj = copy_4f( out, in, flags ); + obj = copy_4f( out, in, flags, IM->Start ); VB->ObjPtr = obj; } @@ -2564,7 +2604,6 @@ void gl_eval_vb( struct vertex_buffer *VB ) if (all_eval) { for (i = 0 ; i < count ; i++) flags[i] = oldflags[i] | new_flags; - VB->AndFlag |= new_flags; } else { GLuint andflag = ~0; for (i = 0 ; i < count ; i++) { @@ -2572,7 +2611,6 @@ void gl_eval_vb( struct vertex_buffer *VB ) flags[i] = oldflags[i] | new_flags; andflag &= flags[i]; } - VB->AndFlag = andflag; } } } |