summaryrefslogtreecommitdiff
path: root/src/mesa/tnl
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2004-01-05 15:24:53 +0000
committerKeith Whitwell <keith@tungstengraphics.com>2004-01-05 15:24:53 +0000
commit588225770c60834dfd2a95850435cc549167dc05 (patch)
treeeded850ee7eabc94d90e1b067df660233ad7fc48 /src/mesa/tnl
parentce81fe69da00f86464a109243d6e109b71335329 (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.c6
-rw-r--r--src/mesa/tnl/t_context.h31
-rw-r--r--src/mesa/tnl/t_vb_light.c5
-rw-r--r--src/mesa/tnl/t_vb_points.c1
-rw-r--r--src/mesa/tnl/t_vb_program.c1
-rw-r--r--src/mesa/tnl/t_vertex.c469
-rw-r--r--src/mesa/tnl/t_vertex.h8
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 );
+