diff options
author | Keith Whitwell <keith@tungstengraphics.com> | 2004-01-05 15:24:53 +0000 |
---|---|---|
committer | Keith Whitwell <keith@tungstengraphics.com> | 2004-01-05 15:24:53 +0000 |
commit | 588225770c60834dfd2a95850435cc549167dc05 (patch) | |
tree | eded850ee7eabc94d90e1b067df660233ad7fc48 /src/mesa/tnl | |
parent | ce81fe69da00f86464a109243d6e109b71335329 (diff) |
Beef up t_vertex.c:
- cope with input vectors with size less than that of the emitted
attribute.
- cope with vertices with 'holes' inside and between vertices.
Fix calculation of tnl->render_inputs to work with fp programs.
Mirror VB->PointSizePtr in VB->AttribPtr so that it can work with t_vertex.c.
Transition swrast_setup/ to use t_vertex.c to build swrast vertices.
Diffstat (limited to 'src/mesa/tnl')
-rw-r--r-- | src/mesa/tnl/t_context.c | 6 | ||||
-rw-r--r-- | src/mesa/tnl/t_context.h | 31 | ||||
-rw-r--r-- | src/mesa/tnl/t_vb_light.c | 5 | ||||
-rw-r--r-- | src/mesa/tnl/t_vb_points.c | 1 | ||||
-rw-r--r-- | src/mesa/tnl/t_vb_program.c | 1 | ||||
-rw-r--r-- | src/mesa/tnl/t_vertex.c | 469 | ||||
-rw-r--r-- | src/mesa/tnl/t_vertex.h | 8 |
7 files changed, 394 insertions, 127 deletions
diff --git a/src/mesa/tnl/t_context.c b/src/mesa/tnl/t_context.c index 8b83372fa7..ec5f88cd96 100644 --- a/src/mesa/tnl/t_context.c +++ b/src/mesa/tnl/t_context.c @@ -161,7 +161,7 @@ _tnl_InvalidateState( GLcontext *ctx, GLuint new_state ) if (ctx->Visual.rgbMode) { tnl->render_inputs = (_TNL_BIT_POS| _TNL_BIT_COLOR0| - (ctx->Texture._EnabledUnits << _TNL_ATTRIB_TEX0)); + (ctx->Texture._EnabledCoordUnits << _TNL_ATTRIB_TEX0)); if (NEED_SECONDARY_COLOR(ctx)) tnl->render_inputs |= _TNL_BIT_COLOR1; @@ -179,6 +179,10 @@ _tnl_InvalidateState( GLcontext *ctx, GLuint new_state ) if (ctx->RenderMode == GL_FEEDBACK) tnl->render_inputs |= _TNL_BIT_TEX0; + + if (ctx->Point._Attenuated || + (ctx->VertexProgram.Enabled && ctx->VertexProgram.PointSizeEnabled)) + tnl->render_inputs |= _TNL_BIT_POINTSIZE; } diff --git a/src/mesa/tnl/t_context.h b/src/mesa/tnl/t_context.h index ab146b2930..a9d36d2488 100644 --- a/src/mesa/tnl/t_context.h +++ b/src/mesa/tnl/t_context.h @@ -88,6 +88,13 @@ * in mtypes.h. However, the tnl module has additional attributes * for materials, color indexes, edge flags, etc. */ +/* Note: These are currently being used to define both inputs and + * outputs from the tnl pipeline. A better solution (which would also + * releive the congestion to slightly prolong the life of the bitmask + * below) is to have the fixed function pipeline populate a set of + * arrays named after those produced by the vertex program stage, and + * have the rest the mesa backend work on those. + */ enum { _TNL_ATTRIB_POS = 0, _TNL_ATTRIB_WEIGHT = 1, @@ -119,7 +126,8 @@ enum { _TNL_ATTRIB_MAT_BACK_INDEXES = 27, _TNL_ATTRIB_INDEX = 28, _TNL_ATTRIB_EDGEFLAG = 29, - _TNL_ATTRIB_MAX = 30 + _TNL_ATTRIB_POINTSIZE = 30, + _TNL_ATTRIB_MAX = 31 } ; /* Will probably have to revise this scheme fairly shortly, eg. by @@ -156,6 +164,7 @@ enum { #define _TNL_BIT_MAT_BACK_INDEXES (1<<27) #define _TNL_BIT_INDEX (1<<28) #define _TNL_BIT_EDGEFLAG (1<<29) +#define _TNL_BIT_POINTSIZE (1<<30) #define _TNL_BIT_TEX(u) (1 << (_TNL_ATTRIB_TEX0 + (u))) @@ -495,20 +504,24 @@ struct tnl_pipeline { GLuint nr_stages; }; +struct tnl_clipspace_attr; + +typedef void (*extract_func)( const struct tnl_clipspace_attr *a, GLfloat *out, + const GLubyte *v ); + +typedef void (*insert_func)( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ); + struct tnl_clipspace_attr { int attrib; int vertoffset; int vertattrsize; - GLfloat *inputptr; + GLubyte *inputptr; int inputstride; - - void (*insert)( const struct tnl_clipspace_attr *a, - char *v, const GLfloat *input ); - - void (*extract)( const struct tnl_clipspace_attr *a, - GLfloat *output, const char *v ); - + insert_func *insert; + insert_func emit; + extract_func extract; const GLfloat *vp; }; diff --git a/src/mesa/tnl/t_vb_light.c b/src/mesa/tnl/t_vb_light.c index 7bdf54bf43..3ca25395da 100644 --- a/src/mesa/tnl/t_vb_light.c +++ b/src/mesa/tnl/t_vb_light.c @@ -291,6 +291,11 @@ static GLboolean run_init_lighting( GLcontext *ctx, _mesa_vector4f_alloc( &store->LitIndex[0], 0, size, 32 ); _mesa_vector4f_alloc( &store->LitIndex[1], 0, size, 32 ); + store->LitColor[0].size = 4; + store->LitColor[1].size = 4; + store->LitSecondary[0].size = 3; + store->LitSecondary[1].size = 3; + store->LitIndex[0].size = 1; store->LitIndex[0].stride = sizeof(GLfloat); store->LitIndex[1].size = 1; diff --git a/src/mesa/tnl/t_vb_points.c b/src/mesa/tnl/t_vb_points.c index 7a071ed373..9ef98fab22 100644 --- a/src/mesa/tnl/t_vb_points.c +++ b/src/mesa/tnl/t_vb_points.c @@ -65,6 +65,7 @@ static GLboolean run_point_stage( GLcontext *ctx, } VB->PointSizePtr = &store->PointSize; + VB->AttribPtr[_TNL_ATTRIB_POINTSIZE] = &store->PointSize; return GL_TRUE; } diff --git a/src/mesa/tnl/t_vb_program.c b/src/mesa/tnl/t_vb_program.c index ba8a98f612..62141ad124 100644 --- a/src/mesa/tnl/t_vb_program.c +++ b/src/mesa/tnl/t_vb_program.c @@ -174,6 +174,7 @@ static GLboolean run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage ) VB->AttribPtr[VERT_ATTRIB_COLOR0] = VB->ColorPtr[0]; VB->AttribPtr[VERT_ATTRIB_COLOR1] = VB->SecondaryColorPtr[0]; VB->AttribPtr[VERT_ATTRIB_FOG] = VB->FogCoordPtr; + VB->AttribPtr[_TNL_ATTRIB_POINTSIZE] = &store->attribs[VERT_RESULT_PSIZ]; for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { VB->AttribPtr[VERT_ATTRIB_TEX0+i] = VB->TexCoordPtr[i] = diff --git a/src/mesa/tnl/t_vertex.c b/src/mesa/tnl/t_vertex.c index 6ac9f8a90c..b10b3c4ce8 100644 --- a/src/mesa/tnl/t_vertex.c +++ b/src/mesa/tnl/t_vertex.c @@ -44,7 +44,7 @@ #define GET_VERTEX_STATE(ctx) &(TNL_CONTEXT(ctx)->clipspace) -static void insert_4f_viewport( const struct tnl_clipspace_attr *a, char *v, +static void insert_4f_viewport_4( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLfloat *out = (GLfloat *)v; @@ -56,7 +56,7 @@ static void insert_4f_viewport( const struct tnl_clipspace_attr *a, char *v, out[3] = in[3]; } -static void insert_3f_viewport( const struct tnl_clipspace_attr *a, char *v, +static void insert_4f_viewport_3( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLfloat *out = (GLfloat *)v; @@ -65,9 +65,10 @@ static void insert_3f_viewport( const struct tnl_clipspace_attr *a, char *v, out[0] = vp[0] * in[0] + vp[12]; out[1] = vp[5] * in[1] + vp[13]; out[2] = vp[10] * in[2] + vp[14]; + out[3] = 1; } -static void insert_2f_viewport( const struct tnl_clipspace_attr *a, char *v, +static void insert_4f_viewport_2( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLfloat *out = (GLfloat *)v; @@ -75,10 +76,77 @@ static void insert_2f_viewport( const struct tnl_clipspace_attr *a, char *v, out[0] = vp[0] * in[0] + vp[12]; out[1] = vp[5] * in[1] + vp[13]; + out[2] = vp[14]; + out[3] = 1; } +static void insert_4f_viewport_1( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + GLfloat *out = (GLfloat *)v; + const GLfloat * const vp = a->vp; + + out[0] = vp[0] * in[0] + vp[12]; + out[1] = vp[13]; + out[2] = vp[14]; + out[3] = 1; +} -static void insert_4f( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ) +static void insert_3f_viewport_3( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + GLfloat *out = (GLfloat *)v; + const GLfloat * const vp = a->vp; + + out[0] = vp[0] * in[0] + vp[12]; + out[1] = vp[5] * in[1] + vp[13]; + out[2] = vp[10] * in[2] + vp[14]; +} + +static void insert_3f_viewport_2( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + GLfloat *out = (GLfloat *)v; + const GLfloat * const vp = a->vp; + + out[0] = vp[0] * in[0] + vp[12]; + out[1] = vp[5] * in[1] + vp[13]; + out[2] = vp[10] * in[2] + vp[14]; +} + +static void insert_3f_viewport_1( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + GLfloat *out = (GLfloat *)v; + const GLfloat * const vp = a->vp; + + out[0] = vp[0] * in[0] + vp[12]; + out[1] = vp[13]; + out[2] = vp[14]; +} + +static void insert_2f_viewport_2( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + GLfloat *out = (GLfloat *)v; + const GLfloat * const vp = a->vp; + + out[0] = vp[0] * in[0] + vp[12]; + out[1] = vp[5] * in[1] + vp[13]; +} + +static void insert_2f_viewport_1( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + GLfloat *out = (GLfloat *)v; + const GLfloat * const vp = a->vp; + + out[0] = vp[0] * in[0] + vp[12]; + out[1] = vp[13]; +} + + +static void insert_4f_4( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLfloat *out = (GLfloat *)(v); @@ -88,73 +156,102 @@ static void insert_4f( const struct tnl_clipspace_attr *a, char *v, const GLfloa out[3] = in[3]; } -static void insert_3f_xyw( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ) +static void insert_4f_3( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLfloat *out = (GLfloat *)(v); out[0] = in[0]; out[1] = in[1]; - out[2] = in[3]; + out[2] = in[2]; + out[3] = 1; } - -static void insert_3f( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ) +static void insert_4f_2( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLfloat *out = (GLfloat *)(v); out[0] = in[0]; out[1] = in[1]; - out[2] = in[2]; + out[2] = 0; + out[3] = 1; } - -static void insert_2f( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ) +static void insert_4f_1( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLfloat *out = (GLfloat *)(v); out[0] = in[0]; - out[1] = in[1]; + out[1] = 0; + out[2] = 0; + out[3] = 1; } -static void insert_1f( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ) +static void insert_3f_xyw_4( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLfloat *out = (GLfloat *)(v); out[0] = in[0]; + out[1] = in[1]; + out[2] = in[3]; +} + +static void insert_3f_xyw_err( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) +{ + abort(); } -static void insert_3f_pad( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ) +static void insert_3f_3( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLfloat *out = (GLfloat *)(v); out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; - out[3] = 1; } - -static void insert_2f_pad( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ) +static void insert_3f_2( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLfloat *out = (GLfloat *)(v); out[0] = in[0]; out[1] = in[1]; out[2] = 0; - out[3] = 1; } -static void insert_1f_pad( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ) +static void insert_3f_1( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLfloat *out = (GLfloat *)(v); out[0] = in[0]; out[1] = 0; out[2] = 0; - out[3] = 1; } -static void insert_4chan_4f_rgba( const struct tnl_clipspace_attr *a, char *v, + +static void insert_2f_2( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) +{ + GLfloat *out = (GLfloat *)(v); + + out[0] = in[0]; + out[1] = in[1]; +} + +static void insert_2f_1( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) +{ + GLfloat *out = (GLfloat *)(v); + + out[0] = in[0]; + out[1] = 0; +} + +static void insert_1f_1( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) +{ + GLfloat *out = (GLfloat *)(v); + + out[0] = in[0]; +} + +static void insert_4chan_4f_rgba_4( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { GLchan *c = (GLchan *)v; @@ -164,7 +261,37 @@ static void insert_4chan_4f_rgba( const struct tnl_clipspace_attr *a, char *v, UNCLAMPED_FLOAT_TO_CHAN(c[3], in[3]); } -static void insert_4ub_4f_rgba( const struct tnl_clipspace_attr *a, char *v, +static void insert_4chan_4f_rgba_3( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + GLchan *c = (GLchan *)v; + UNCLAMPED_FLOAT_TO_CHAN(c[0], in[0]); + UNCLAMPED_FLOAT_TO_CHAN(c[1], in[1]); + UNCLAMPED_FLOAT_TO_CHAN(c[2], in[2]); + c[3] = CHAN_MAX; +} + +static void insert_4chan_4f_rgba_2( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + GLchan *c = (GLchan *)v; + UNCLAMPED_FLOAT_TO_CHAN(c[0], in[0]); + UNCLAMPED_FLOAT_TO_CHAN(c[1], in[1]); + c[2] = 0; + c[3] = CHAN_MAX; +} + +static void insert_4chan_4f_rgba_1( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + GLchan *c = (GLchan *)v; + UNCLAMPED_FLOAT_TO_CHAN(c[0], in[0]); + c[1] = 0; + c[2] = 0; + c[3] = CHAN_MAX; +} + +static void insert_4ub_4f_rgba_4( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); @@ -173,7 +300,34 @@ static void insert_4ub_4f_rgba( const struct tnl_clipspace_attr *a, char *v, UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[3]); } -static void insert_4ub_4f_bgra( const struct tnl_clipspace_attr *a, char *v, +static void insert_4ub_4f_rgba_3( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); + UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); + UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[2]); + v[3] = 0xff; +} + +static void insert_4ub_4f_rgba_2( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); + UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); + v[2] = 0; + v[3] = 0xff; +} + +static void insert_4ub_4f_rgba_1( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); + v[1] = 0; + v[2] = 0; + v[3] = 0xff; +} + +static void insert_4ub_4f_bgra_4( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); @@ -182,7 +336,34 @@ static void insert_4ub_4f_bgra( const struct tnl_clipspace_attr *a, char *v, UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[3]); } -static void insert_3ub_3f_rgb( const struct tnl_clipspace_attr *a, char *v, +static void insert_4ub_4f_bgra_3( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); + UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); + UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[2]); + v[3] = 0xff; +} + +static void insert_4ub_4f_bgra_2( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); + UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); + v[0] = 0; + v[3] = 0xff; +} + +static void insert_4ub_4f_bgra_1( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); + v[1] = 0; + v[0] = 0; + v[3] = 0xff; +} + +static void insert_3ub_3f_rgb_3( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); @@ -190,15 +371,48 @@ static void insert_3ub_3f_rgb( const struct tnl_clipspace_attr *a, char *v, UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[2]); } -static void insert_3ub_3f_bgr( const struct tnl_clipspace_attr *a, char *v, +static void insert_3ub_3f_rgb_2( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); + UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); + v[2] = 0; +} + +static void insert_3ub_3f_rgb_1( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { + UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); + v[1] = 0; + v[2] = 0; +} + +static void insert_3ub_3f_bgr_3( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[2]); } -static void insert_1ub_1f( const struct tnl_clipspace_attr *a, char *v, +static void insert_3ub_3f_bgr_2( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); + UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); + v[0] = 0; +} + +static void insert_3ub_3f_bgr_1( const struct tnl_clipspace_attr *a, GLubyte *v, + const GLfloat *in ) +{ + UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); + v[1] = 0; + v[0]= 0; +} + + +static void insert_1ub_1f_1( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ) { UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); @@ -213,7 +427,7 @@ static void insert_1ub_1f( const struct tnl_clipspace_attr *a, char *v, */ static void extract_4f_viewport( const struct tnl_clipspace_attr *a, GLfloat *out, - const char *v ) + const GLubyte *v ) { const GLfloat *in = (const GLfloat *)v; const GLfloat * const vp = a->vp; @@ -225,7 +439,7 @@ static void extract_4f_viewport( const struct tnl_clipspace_attr *a, GLfloat *ou } static void extract_3f_viewport( const struct tnl_clipspace_attr *a, GLfloat *out, - const char *v ) + const GLubyte *v ) { const GLfloat *in = (const GLfloat *)v; const GLfloat * const vp = a->vp; @@ -238,7 +452,7 @@ static void extract_3f_viewport( const struct tnl_clipspace_attr *a, GLfloat *ou static void extract_2f_viewport( const struct tnl_clipspace_attr *a, GLfloat *out, - const char *v ) + const GLubyte *v ) { const GLfloat *in = (const GLfloat *)v; const GLfloat * const vp = a->vp; @@ -250,7 +464,7 @@ static void extract_2f_viewport( const struct tnl_clipspace_attr *a, GLfloat *ou } -static void extract_4f( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v ) +static void extract_4f( const struct tnl_clipspace_attr *a, GLfloat *out, const GLubyte *v ) { const GLfloat *in = (const GLfloat *)v; @@ -260,7 +474,7 @@ static void extract_4f( const struct tnl_clipspace_attr *a, GLfloat *out, const out[3] = in[3]; } -static void extract_3f_xyw( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v ) +static void extract_3f_xyw( const struct tnl_clipspace_attr *a, GLfloat *out, const GLubyte *v ) { const GLfloat *in = (const GLfloat *)v; @@ -271,7 +485,7 @@ static void extract_3f_xyw( const struct tnl_clipspace_attr *a, GLfloat *out, co } -static void extract_3f( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v ) +static void extract_3f( const struct tnl_clipspace_attr *a, GLfloat *out, const GLubyte *v ) { const GLfloat *in = (const GLfloat *)v; @@ -282,7 +496,7 @@ static void extract_3f( const struct tnl_clipspace_attr *a, GLfloat *out, const } -static void extract_2f( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v ) +static void extract_2f( const struct tnl_clipspace_attr *a, GLfloat *out, const GLubyte *v ) { const GLfloat *in = (const GLfloat *)v; @@ -292,7 +506,7 @@ static void extract_2f( const struct tnl_clipspace_attr *a, GLfloat *out, const out[3] = 1; } -static void extract_1f( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v ) +static void extract_1f( const struct tnl_clipspace_attr *a, GLfloat *out, const GLubyte *v ) { const GLfloat *in = (const GLfloat *)v; @@ -303,7 +517,7 @@ static void extract_1f( const struct tnl_clipspace_attr *a, GLfloat *out, const } static void extract_4chan_4f_rgba( const struct tnl_clipspace_attr *a, GLfloat *out, - const char *v ) + const GLubyte *v ) { GLchan *c = (GLchan *)v; @@ -314,7 +528,7 @@ static void extract_4chan_4f_rgba( const struct tnl_clipspace_attr *a, GLfloat * } static void extract_4ub_4f_rgba( const struct tnl_clipspace_attr *a, GLfloat *out, - const char *v ) + const GLubyte *v ) { out[0] = UBYTE_TO_FLOAT(v[0]); out[1] = UBYTE_TO_FLOAT(v[1]); @@ -323,7 +537,7 @@ static void extract_4ub_4f_rgba( const struct tnl_clipspace_attr *a, GLfloat *ou } static void extract_4ub_4f_bgra( const struct tnl_clipspace_attr *a, GLfloat *out, - const char *v ) + const GLubyte *v ) { out[2] = UBYTE_TO_FLOAT(v[0]); out[1] = UBYTE_TO_FLOAT(v[1]); @@ -332,7 +546,7 @@ static void extract_4ub_4f_bgra( const struct tnl_clipspace_attr *a, GLfloat *ou } static void extract_3ub_3f_rgb( const struct tnl_clipspace_attr *a, GLfloat *out, - const char *v ) + const GLubyte *v ) { out[0] = UBYTE_TO_FLOAT(v[0]); out[1] = UBYTE_TO_FLOAT(v[1]); @@ -341,7 +555,7 @@ static void extract_3ub_3f_rgb( const struct tnl_clipspace_attr *a, GLfloat *out } static void extract_3ub_3f_bgr( const struct tnl_clipspace_attr *a, GLfloat *out, - const char *v ) + const GLubyte *v ) { out[2] = UBYTE_TO_FLOAT(v[0]); out[1] = UBYTE_TO_FLOAT(v[1]); @@ -349,7 +563,7 @@ static void extract_3ub_3f_bgr( const struct tnl_clipspace_attr *a, GLfloat *out out[3] = 1; } -static void extract_1ub_1f( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v ) +static void extract_1ub_1f( const struct tnl_clipspace_attr *a, GLfloat *out, const GLubyte *v ) { out[0] = UBYTE_TO_FLOAT(v[0]); out[1] = 0; @@ -358,86 +572,91 @@ static void extract_1ub_1f( const struct tnl_clipspace_attr *a, GLfloat *out, co } -typedef void (*extract_func)( const struct tnl_clipspace_attr *a, GLfloat *out, - const char *v ); - -typedef void (*insert_func)( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ); - - struct { + const char *name; extract_func extract; - insert_func insert; + insert_func insert[4]; GLuint attrsize; } format_info[EMIT_MAX] = { - { extract_1f, - insert_1f, + { "1f", + extract_1f, + { insert_1f_1, insert_1f_1, insert_1f_1, insert_1f_1 }, sizeof(GLfloat) }, - { extract_2f, - insert_2f, + { "2f", + extract_2f, + { insert_2f_1, insert_2f_2, insert_2f_2, insert_2f_2 }, 2 * sizeof(GLfloat) }, - { extract_3f, - insert_3f, + { "3f", + extract_3f, + { insert_3f_1, insert_3f_2, insert_3f_3, insert_3f_3 }, 3 * sizeof(GLfloat) }, - { extract_4f, - insert_4f, + { "4f", + extract_4f, + { insert_4f_1, insert_4f_2, insert_4f_3, insert_4f_4 }, 4 * sizeof(GLfloat) }, - { extract_2f_viewport, - insert_2f_viewport, + { "2f_viewport", + extract_2f_viewport, + { insert_2f_viewport_1, insert_2f_viewport_2, insert_2f_viewport_2, + insert_2f_viewport_2 }, 2 * sizeof(GLfloat) }, - { extract_3f_viewport, - insert_3f_viewport, + { "3f_viewport", + extract_3f_viewport, + { insert_3f_viewport_1, insert_3f_viewport_2, insert_3f_viewport_3, + insert_3f_viewport_3 }, 3 * sizeof(GLfloat) }, - { extract_4f_viewport, - insert_4f_viewport, + { "4f_viewport", + extract_4f_viewport, + { insert_4f_viewport_1, insert_4f_viewport_2, insert_4f_viewport_3, + insert_4f_viewport_4 }, 4 * sizeof(GLfloat) }, - { extract_3f_xyw, - insert_3f_xyw, + { "3f_xyw", + extract_3f_xyw, + { insert_3f_xyw_err, insert_3f_xyw_err, insert_3f_xyw_err, + insert_3f_xyw_4 }, 3 * sizeof(GLfloat) }, - { extract_1ub_1f, - insert_1ub_1f, + { "1ub_1f", + extract_1ub_1f, + { insert_1ub_1f_1, insert_1ub_1f_1, insert_1ub_1f_1, insert_1ub_1f_1 }, sizeof(GLubyte) }, - { extract_3ub_3f_rgb, - insert_3ub_3f_rgb, + { "3ub_3f_rgb", + extract_3ub_3f_rgb, + { insert_3ub_3f_rgb_1, insert_3ub_3f_rgb_2, insert_3ub_3f_rgb_3, + insert_3ub_3f_rgb_3 }, 3 * sizeof(GLubyte) }, - { extract_3ub_3f_bgr, - insert_3ub_3f_bgr, + { "3ub_3f_bgr", + extract_3ub_3f_bgr, + { insert_3ub_3f_bgr_1, insert_3ub_3f_bgr_2, insert_3ub_3f_bgr_3, + insert_3ub_3f_bgr_3 }, 3 * sizeof(GLubyte) }, - { extract_4ub_4f_rgba, - insert_4ub_4f_rgba, + { "4ub_4f_rgba", + extract_4ub_4f_rgba, + { insert_4ub_4f_rgba_1, insert_4ub_4f_rgba_2, insert_4ub_4f_rgba_3, + insert_4ub_4f_rgba_4 }, 4 * sizeof(GLubyte) }, - { extract_4ub_4f_bgra, - insert_4ub_4f_bgra, + { "4ub_4f_bgra", + extract_4ub_4f_bgra, + { insert_4ub_4f_bgra_1, insert_4ub_4f_bgra_2, insert_4ub_4f_bgra_3, + insert_4ub_4f_bgra_4 }, 4 * sizeof(GLubyte) }, - { extract_4chan_4f_rgba, - insert_4chan_4f_rgba, - 4 * sizeof(GLchan) }, - - { extract_1f, - insert_1f_pad, - 4 * sizeof(GLfloat) }, - - { extract_2f, - insert_2f_pad, - 4 * sizeof(GLfloat) }, - - { extract_3f, - insert_3f_pad, - 4 * sizeof(GLfloat) }, - + { "4chan_4f_rgba", + extract_4chan_4f_rgba, + { insert_4chan_4f_rgba_1, insert_4chan_4f_rgba_2, insert_4chan_4f_rgba_3, + insert_4chan_4f_rgba_4 }, + 4 * sizeof(GLchan) } }; @@ -454,7 +673,7 @@ static void generic_emit( GLcontext *ctx, struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); struct tnl_clipspace_attr *a = vtx->attr; - char *v = (char *)dest; + GLubyte *v = (GLubyte *)dest; int i, j; GLuint count = vtx->attr_count; GLuint stride; @@ -462,7 +681,8 @@ static void generic_emit( GLcontext *ctx, for (j = 0; j < count; j++) { GLvector4f *vptr = VB->AttribPtr[a[j].attrib]; a[j].inputstride = vptr->stride; - a[j].inputptr = (GLfloat *)STRIDE_4F(vptr->data, start * vptr->stride); + a[j].inputptr = (GLubyte *)STRIDE_4F(vptr->data, start * vptr->stride); + a[j].emit = a[j].insert[vptr->size - 1]; } end -= start; @@ -470,9 +690,9 @@ static void generic_emit( GLcontext *ctx, for (i = 0 ; i < end ; i++, v += stride) { for (j = 0; j < count; j++) { - GLfloat *in = a[j].inputptr; - (char *)a[j].inputptr += a[j].inputstride; - a[j].insert( &a[j], v + a[j].vertoffset, in ); + GLfloat *in = (GLfloat *)a[j].inputptr; + a[j].inputptr += a[j].inputstride; + a[j].emit( &a[j], v + a[j].vertoffset, in ); } } } @@ -486,9 +706,9 @@ static void generic_interp( GLcontext *ctx, TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &tnl->vb; struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); - char *vin = vtx->vertex_buf + ein * vtx->vertex_size; - char *vout = vtx->vertex_buf + eout * vtx->vertex_size; - char *vdst = vtx->vertex_buf + edst * vtx->vertex_size; + GLubyte *vin = vtx->vertex_buf + ein * vtx->vertex_size; + GLubyte *vout = vtx->vertex_buf + eout * vtx->vertex_size; + GLubyte *vdst = vtx->vertex_buf + edst * vtx->vertex_size; const struct tnl_clipspace_attr *a = vtx->attr; int attr_count = vtx->attr_count; int j; @@ -503,10 +723,10 @@ static void generic_interp( GLcontext *ctx, pos[2] = dstclip[2] * w; pos[3] = w; - a[0].insert( &a[0], vdst, pos ); + a[0].insert[4-1]( &a[0], vdst, pos ); } else { - a[0].insert( &a[0], vdst, VB->ClipPtr->data[edst] ); + a[0].insert[4-1]( &a[0], vdst, VB->ClipPtr->data[edst] ); } @@ -521,7 +741,7 @@ static void generic_interp( GLcontext *ctx, INTERP_F( t, fdst[1], fout[1], fin[1] ); INTERP_F( t, fdst[0], fout[0], fin[0] ); - a[j].insert( &a[j], vdst + a[j].vertoffset, fdst ); + a[j].insert[4-1]( &a[j], vdst + a[j].vertoffset, fdst ); } } @@ -532,8 +752,8 @@ static void generic_interp( GLcontext *ctx, static void generic_copy_pv( GLcontext *ctx, GLuint edst, GLuint esrc ) { struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); - char *vsrc = vtx->vertex_buf + esrc * vtx->vertex_size; - char *vdst = vtx->vertex_buf + edst * vtx->vertex_size; + GLubyte *vsrc = vtx->vertex_buf + esrc * vtx->vertex_size; + GLubyte *vdst = vtx->vertex_buf + edst * vtx->vertex_size; const struct tnl_clipspace_attr *a = vtx->attr; int attr_count = vtx->attr_count; int j; @@ -575,6 +795,11 @@ static void generic_interp_extras( GLcontext *ctx, VB->SecondaryColorPtr[1]->data[in] ); } } + else if (VB->IndexPtr[1]) { + VB->IndexPtr[1]->data[dst][0] = LINTERP( t, + VB->IndexPtr[1]->data[out][0], + VB->IndexPtr[1]->data[in][0] ); + } if (VB->EdgeFlag) { VB->EdgeFlag[dst] = VB->EdgeFlag[out] || force_boundary; @@ -597,6 +822,9 @@ static void generic_copy_pv_extras( GLcontext *ctx, VB->SecondaryColorPtr[1]->data[src] ); } } + else if (VB->IndexPtr[1]) { + VB->IndexPtr[1]->data[dst][0] = VB->IndexPtr[1]->data[src][0]; + } _tnl_copy_pv(ctx, dst, src); } @@ -722,7 +950,8 @@ void _tnl_invalidate_vertex_state( GLcontext *ctx, GLuint new_state ) GLuint _tnl_install_attrs( GLcontext *ctx, const struct tnl_attr_map *map, - GLuint nr, const GLfloat *vp ) + GLuint nr, const GLfloat *vp, + GLuint unpacked_size ) { struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); int offset = 0; @@ -740,19 +969,30 @@ GLuint _tnl_install_attrs( GLcontext *ctx, const struct tnl_attr_map *map, for (i = 0; i < nr; i++) { GLuint format = map[i].format; vtx->attr[i].attrib = map[i].attrib; -/* vtx->attr[i].format = map[i].format; */ vtx->attr[i].vp = vp; vtx->attr[i].insert = format_info[format].insert; vtx->attr[i].extract = format_info[format].extract; vtx->attr[i].vertattrsize = format_info[format].attrsize; - vtx->attr[i].vertoffset = offset; - offset += format_info[format].attrsize; + if (!unpacked_size) { + vtx->attr[i].vertoffset = offset; + offset += format_info[format].attrsize; + } + else { + vtx->attr[i].vertoffset = map[i].offset; + assert(map[i].offset + format_info[format].attrsize < unpacked_size); + } + + fprintf(stderr, "%d: offset %d, format: %s\n", + i, vtx->attr[i].vertoffset, format_info[format].name); } - assert(offset <= vtx->max_vertex_size); - - vtx->vertex_size = offset; + if (unpacked_size) + vtx->vertex_size = unpacked_size; + else + vtx->vertex_size = offset; + assert(vtx->vertex_size <= vtx->max_vertex_size); + return vtx->vertex_size; } @@ -790,7 +1030,7 @@ void *_tnl_emit_vertices_to_buffer( GLcontext *ctx, { struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); vtx->emit( ctx, start, count, dest ); - return (void *)((char *)dest + vtx->vertex_size * (count - start)); + return (void *)((GLubyte *)dest + vtx->vertex_size * (count - start)); } @@ -800,11 +1040,14 @@ void _tnl_init_vertices( GLcontext *ctx, { struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); - _tnl_install_attrs( ctx, 0, 0, 0 ); + _tnl_install_attrs( ctx, 0, 0, 0, 0 ); vtx->need_extras = GL_TRUE; - vtx->max_vertex_size = max_vertex_size; - vtx->vertex_buf = (char *)ALIGN_MALLOC(vb_size * 4 * 18, max_vertex_size); + if (max_vertex_size > vtx->max_vertex_size) { + _tnl_free_vertices( ctx ); + vtx->max_vertex_size = max_vertex_size; + vtx->vertex_buf = (GLubyte *)ALIGN_MALLOC(vb_size * max_vertex_size, 32 ); + } } diff --git a/src/mesa/tnl/t_vertex.h b/src/mesa/tnl/t_vertex.h index 050f525e29..10d67631c5 100644 --- a/src/mesa/tnl/t_vertex.h +++ b/src/mesa/tnl/t_vertex.h @@ -51,15 +51,13 @@ enum tnl_attr_format { EMIT_4UB_4F_BGRA, /* for color */ EMIT_4UB_4F_RGBA, /* for color */ EMIT_4CHAN_4F_RGBA, /* for swrast color */ - EMIT_1F_PAD_4F, /* for swrast texcoords */ - EMIT_2F_PAD_4F, /* for swrast texcoords */ - EMIT_3F_PAD_4F, /* for swrast texcoords */ EMIT_MAX }; struct tnl_attr_map { GLuint attrib; /* _TNL_ATTRIB_ enum */ enum tnl_attr_format format; + GLuint offset; }; @@ -90,7 +88,9 @@ extern void *_tnl_get_vertex( GLcontext *ctx, GLuint nr ); */ extern GLuint _tnl_install_attrs( GLcontext *ctx, const struct tnl_attr_map *map, - GLuint nr, const GLfloat *vp ); + GLuint nr, const GLfloat *vp, + GLuint unpacked_size ); + |