Templatize the fastpaths.
This commit is contained in:
@@ -41,9 +41,6 @@
|
||||
*/
|
||||
|
||||
|
||||
static void choose_emit_func( GLcontext *ctx, GLuint count, GLubyte *dest);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -276,6 +273,11 @@ static INLINE void insert_1f_1( const struct tnl_clipspace_attr *a, GLubyte *v,
|
||||
out[0] = in[0];
|
||||
}
|
||||
|
||||
static INLINE void insert_null( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in )
|
||||
{
|
||||
(void) a; (void) v; (void) in;
|
||||
}
|
||||
|
||||
static INLINE void insert_4chan_4f_rgba_4( const struct tnl_clipspace_attr *a, GLubyte *v,
|
||||
const GLfloat *in )
|
||||
{
|
||||
@@ -730,7 +732,7 @@ static void extract_1ub_1f( const struct tnl_clipspace_attr *a, GLfloat *out, co
|
||||
}
|
||||
|
||||
|
||||
static struct {
|
||||
const static struct {
|
||||
const char *name;
|
||||
tnl_extract_func extract;
|
||||
tnl_insert_func insert[4];
|
||||
@@ -842,266 +844,81 @@ static struct {
|
||||
* Hardwired fastpaths for emitting whole vertices or groups of
|
||||
* vertices
|
||||
*/
|
||||
static void choose_emit_func( GLcontext *ctx, GLuint count, GLubyte *dest);
|
||||
|
||||
|
||||
static void emit_xyz3_rgba4( GLcontext *ctx,
|
||||
GLuint count,
|
||||
GLubyte *v )
|
||||
{
|
||||
struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx);
|
||||
struct tnl_clipspace_attr *a = vtx->attr;
|
||||
GLuint i;
|
||||
|
||||
if (a[0].emit != insert_3f_3 ||
|
||||
a[1].emit != insert_4ub_4f_rgba_4) {
|
||||
choose_emit_func( ctx, count, v );
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < count ; i++, v += vtx->vertex_size) {
|
||||
insert_3f_3( &a[0], v + a[0].vertoffset, (GLfloat *)a[0].inputptr );
|
||||
a[0].inputptr += a[0].inputstride;
|
||||
|
||||
insert_4ub_4f_rgba_4( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr );
|
||||
a[1].inputptr += a[1].inputstride;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void emit_viewport3_rgba4( GLcontext *ctx,
|
||||
GLuint count,
|
||||
GLubyte *v )
|
||||
{
|
||||
struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx);
|
||||
struct tnl_clipspace_attr *a = vtx->attr;
|
||||
GLuint i;
|
||||
|
||||
if (a[0].emit != insert_3f_viewport_3 ||
|
||||
a[1].emit != insert_4ub_4f_rgba_4) {
|
||||
choose_emit_func( ctx, count, v );
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < count ; i++, v += vtx->vertex_size) {
|
||||
insert_3f_viewport_3( &a[0], v + a[0].vertoffset, (GLfloat *)a[0].inputptr );
|
||||
a[0].inputptr += a[0].inputstride;
|
||||
|
||||
insert_4ub_4f_rgba_4( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr );
|
||||
a[1].inputptr += a[1].inputstride;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void emit_viewport3_bgra4( GLcontext *ctx,
|
||||
GLuint count,
|
||||
GLubyte *v )
|
||||
{
|
||||
struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx);
|
||||
struct tnl_clipspace_attr *a = vtx->attr;
|
||||
GLuint i;
|
||||
|
||||
if (a[0].emit != insert_3f_viewport_3 ||
|
||||
a[1].emit != insert_4ub_4f_bgra_4) {
|
||||
choose_emit_func( ctx, count, v );
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < count ; i++, v += vtx->vertex_size) {
|
||||
insert_3f_viewport_3( &a[0], v + a[0].vertoffset, (GLfloat *)a[0].inputptr );
|
||||
a[0].inputptr += a[0].inputstride;
|
||||
|
||||
insert_4ub_4f_bgra_4( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr );
|
||||
a[1].inputptr += a[1].inputstride;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void emit_xyzw4_rgba4_st2( GLcontext *ctx,
|
||||
GLuint count,
|
||||
GLubyte *v )
|
||||
{
|
||||
struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx);
|
||||
struct tnl_clipspace_attr *a = vtx->attr;
|
||||
GLuint i;
|
||||
|
||||
if (a[0].emit != insert_4f_4 ||
|
||||
a[1].emit != insert_4ub_4f_rgba_4 ||
|
||||
a[2].emit != insert_2f_2) {
|
||||
choose_emit_func( ctx, count, v );
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < count ; i++, v += vtx->vertex_size) {
|
||||
insert_4f_4( &a[0], v + a[0].vertoffset, (GLfloat *)a[0].inputptr );
|
||||
a[0].inputptr += a[0].inputstride;
|
||||
|
||||
insert_4ub_4f_rgba_4( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr );
|
||||
a[1].inputptr += a[1].inputstride;
|
||||
|
||||
insert_2f_2( &a[2], v + a[2].vertoffset, (GLfloat *)a[2].inputptr );
|
||||
a[2].inputptr += a[2].inputstride;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void emit_viewport4_rgba4_st2( GLcontext *ctx,
|
||||
GLuint count,
|
||||
GLubyte *v )
|
||||
{
|
||||
struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx);
|
||||
struct tnl_clipspace_attr *a = vtx->attr;
|
||||
GLuint i;
|
||||
|
||||
if (a[0].emit != insert_4f_viewport_4 ||
|
||||
a[1].emit != insert_4ub_4f_rgba_4 ||
|
||||
a[2].emit != insert_2f_2) {
|
||||
choose_emit_func( ctx, count, v );
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < count ; i++, v += vtx->vertex_size) {
|
||||
insert_4f_viewport_4( &a[0], v + a[0].vertoffset, (GLfloat *)a[0].inputptr );
|
||||
a[0].inputptr += a[0].inputstride;
|
||||
|
||||
insert_4ub_4f_rgba_4( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr );
|
||||
a[1].inputptr += a[1].inputstride;
|
||||
|
||||
insert_2f_2( &a[2], v + a[2].vertoffset, (GLfloat *)a[2].inputptr );
|
||||
a[2].inputptr += a[2].inputstride;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void emit_viewport4_bgra4_st2( GLcontext *ctx,
|
||||
GLuint count,
|
||||
GLubyte *v )
|
||||
{
|
||||
struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx);
|
||||
struct tnl_clipspace_attr *a = vtx->attr;
|
||||
GLuint i;
|
||||
|
||||
if (a[0].emit != insert_4f_viewport_4 ||
|
||||
a[1].emit != insert_4ub_4f_bgra_4 ||
|
||||
a[2].emit != insert_2f_2) {
|
||||
choose_emit_func( ctx, count, v );
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < count ; i++, v += vtx->vertex_size) {
|
||||
insert_4f_viewport_4( &a[0], v + a[0].vertoffset, (GLfloat *)a[0].inputptr );
|
||||
a[0].inputptr += a[0].inputstride;
|
||||
|
||||
insert_4ub_4f_bgra_4( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr );
|
||||
a[1].inputptr += a[1].inputstride;
|
||||
|
||||
insert_2f_2( &a[2], v + a[2].vertoffset, (GLfloat *)a[2].inputptr );
|
||||
a[2].inputptr += a[2].inputstride;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void emit_xyzw4_rgba4_st2_st2( GLcontext *ctx,
|
||||
GLuint count,
|
||||
GLubyte *v )
|
||||
{
|
||||
struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx);
|
||||
struct tnl_clipspace_attr *a = vtx->attr;
|
||||
GLuint i;
|
||||
|
||||
if (a[0].emit != insert_4f_4 ||
|
||||
a[1].emit != insert_4ub_4f_rgba_4 ||
|
||||
a[2].emit != insert_2f_2 ||
|
||||
a[3].emit != insert_2f_2) {
|
||||
choose_emit_func( ctx, count, v );
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < count ; i++, v += vtx->vertex_size) {
|
||||
insert_4f_4( &a[0], v + a[0].vertoffset, (GLfloat *)a[0].inputptr );
|
||||
a[0].inputptr += a[0].inputstride;
|
||||
|
||||
insert_4ub_4f_rgba_4( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr );
|
||||
a[1].inputptr += a[1].inputstride;
|
||||
|
||||
insert_2f_2( &a[2], v + a[2].vertoffset, (GLfloat *)a[2].inputptr );
|
||||
a[2].inputptr += a[2].inputstride;
|
||||
|
||||
insert_2f_2( &a[3], v + a[3].vertoffset, (GLfloat *)a[3].inputptr );
|
||||
a[3].inputptr += a[3].inputstride;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void emit_viewport4_rgba4_st2_st2( GLcontext *ctx,
|
||||
GLuint count,
|
||||
GLubyte *v )
|
||||
{
|
||||
struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx);
|
||||
struct tnl_clipspace_attr *a = vtx->attr;
|
||||
GLuint i;
|
||||
|
||||
if (a[0].emit != insert_4f_viewport_4 ||
|
||||
a[1].emit != insert_4ub_4f_rgba_4 ||
|
||||
a[2].emit != insert_2f_2 ||
|
||||
a[3].emit != insert_2f_2) {
|
||||
choose_emit_func( ctx, count, v );
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < count ; i++, v += vtx->vertex_size) {
|
||||
insert_4f_viewport_4( &a[0], v + a[0].vertoffset, (GLfloat *)a[0].inputptr );
|
||||
a[0].inputptr += a[0].inputstride;
|
||||
|
||||
insert_4ub_4f_rgba_4( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr );
|
||||
a[1].inputptr += a[1].inputstride;
|
||||
|
||||
insert_2f_2( &a[2], v + a[2].vertoffset, (GLfloat *)a[2].inputptr );
|
||||
a[2].inputptr += a[2].inputstride;
|
||||
|
||||
insert_2f_2( &a[3], v + a[3].vertoffset, (GLfloat *)a[3].inputptr );
|
||||
a[3].inputptr += a[3].inputstride;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void emit_viewport4_bgra4_st2_st2( GLcontext *ctx,
|
||||
GLuint count,
|
||||
GLubyte *v )
|
||||
{
|
||||
struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx);
|
||||
struct tnl_clipspace_attr *a = vtx->attr;
|
||||
GLuint i;
|
||||
|
||||
if (a[0].emit != insert_4f_viewport_4 ||
|
||||
a[1].emit != insert_4ub_4f_bgra_4 ||
|
||||
a[2].emit != insert_2f_2 ||
|
||||
a[3].emit != insert_2f_2) {
|
||||
choose_emit_func( ctx, count, v );
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < count ; i++, v += vtx->vertex_size) {
|
||||
insert_4f_viewport_4( &a[0], v + a[0].vertoffset, (GLfloat *)a[0].inputptr );
|
||||
a[0].inputptr += a[0].inputstride;
|
||||
|
||||
insert_4ub_4f_bgra_4( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr );
|
||||
a[1].inputptr += a[1].inputstride;
|
||||
|
||||
insert_2f_2( &a[2], v + a[2].vertoffset, (GLfloat *)a[2].inputptr );
|
||||
a[2].inputptr += a[2].inputstride;
|
||||
|
||||
insert_2f_2( &a[3], v + a[3].vertoffset, (GLfloat *)a[3].inputptr );
|
||||
a[3].inputptr += a[3].inputstride;
|
||||
}
|
||||
#define EMIT5(NR, F0, F1, F2, F3, F4, NAME) \
|
||||
static void NAME( GLcontext *ctx, \
|
||||
GLuint count, \
|
||||
GLubyte *v ) \
|
||||
{ \
|
||||
struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); \
|
||||
struct tnl_clipspace_attr *a = vtx->attr; \
|
||||
GLuint i; \
|
||||
\
|
||||
if (vtx->attr_count != NR || \
|
||||
(NR > 0 && a[0].emit != F0) || \
|
||||
(NR > 1 && a[1].emit != F1) || \
|
||||
(NR > 2 && a[2].emit != F2) || \
|
||||
(NR > 3 && a[3].emit != F3) || \
|
||||
(NR > 4 && a[4].emit != F4)) { \
|
||||
choose_emit_func( ctx, count, v ); \
|
||||
return; \
|
||||
} \
|
||||
\
|
||||
for (i = 0 ; i < count ; i++, v += vtx->vertex_size) { \
|
||||
if (NR > 0) { \
|
||||
F0( &a[0], v + a[0].vertoffset, (GLfloat *)a[0].inputptr ); \
|
||||
a[0].inputptr += a[0].inputstride; \
|
||||
} \
|
||||
\
|
||||
if (NR > 1) { \
|
||||
F1( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr ); \
|
||||
a[1].inputptr += a[1].inputstride; \
|
||||
} \
|
||||
\
|
||||
if (NR > 2) { \
|
||||
F1( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr ); \
|
||||
a[1].inputptr += a[1].inputstride; \
|
||||
} \
|
||||
\
|
||||
if (NR > 3) { \
|
||||
F1( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr ); \
|
||||
a[1].inputptr += a[1].inputstride; \
|
||||
} \
|
||||
\
|
||||
if (NR > 4) { \
|
||||
F1( &a[1], v + a[1].vertoffset, (GLfloat *)a[1].inputptr ); \
|
||||
a[1].inputptr += a[1].inputstride; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
#define EMIT2(F0, F1, NAME) EMIT5(2, F0, F1, insert_null, \
|
||||
insert_null, insert_null, NAME)
|
||||
|
||||
#define EMIT3(F0, F1, F2, NAME) EMIT5(2, F0, F1, F2, insert_null, \
|
||||
insert_null, NAME)
|
||||
|
||||
#define EMIT4(F0, F1, F2, F3, NAME) EMIT5(2, F0, F1, F2, F3, \
|
||||
insert_null, NAME)
|
||||
|
||||
|
||||
EMIT2(insert_3f_viewport_3, insert_4ub_4f_rgba_4, emit_viewport3_rgba4)
|
||||
EMIT2(insert_3f_viewport_3, insert_4ub_4f_bgra_4, emit_viewport3_bgra4)
|
||||
EMIT2(insert_3f_3, insert_4ub_4f_rgba_4, emit_xyz3_rgba4)
|
||||
|
||||
EMIT3(insert_4f_viewport_4, insert_4ub_4f_rgba_4, insert_2f_2, emit_viewport4_rgba4_st2)
|
||||
EMIT3(insert_4f_viewport_4, insert_4ub_4f_bgra_4, insert_2f_2, emit_viewport4_bgra4_st2)
|
||||
EMIT3(insert_4f_4, insert_4ub_4f_rgba_4, insert_2f_2, emit_xyzw4_rgba4_st2)
|
||||
|
||||
EMIT4(insert_4f_viewport_4, insert_4ub_4f_rgba_4, insert_2f_2, insert_2f_2, emit_viewport4_rgba4_st2_st2)
|
||||
EMIT4(insert_4f_viewport_4, insert_4ub_4f_bgra_4, insert_2f_2, insert_2f_2, emit_viewport4_bgra4_st2_st2)
|
||||
EMIT4(insert_4f_4, insert_4ub_4f_rgba_4, insert_2f_2, insert_2f_2, emit_xyzw4_rgba4_st2_st2)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
|
Reference in New Issue
Block a user