Skip to content

Commit

Permalink
Optimise VBO creation by eliminating memcpy() use.
Browse files Browse the repository at this point in the history
  • Loading branch information
Darren Salt committed May 3, 2012
1 parent 0cf06f6 commit 9b0fe6c
Showing 1 changed file with 25 additions and 117 deletions.
142 changes: 25 additions & 117 deletions src/engine/rendererGL/tr_vbo.c
Expand Up @@ -94,8 +94,6 @@ VBO_t *R_CreateVBO( const char *name, byte *vertexes, int vertexesSize,
/* /*
============ ============
R_CreateVBO2 R_CreateVBO2
RB: OPTIMIZE rewrite to not use memcpy
============ ============
*/ */
VBO_t *R_CreateVBO2( const char *name, int numVertexes, srfVert_t *verts, unsigned int stateBits, vboUsage_t usage ) VBO_t *R_CreateVBO2( const char *name, int numVertexes, srfVert_t *verts, unsigned int stateBits, vboUsage_t usage )
Expand All @@ -107,7 +105,6 @@ VBO_t *R_CreateVBO2( const char *name, int numVertexes, srfVert_t *vert
int dataSize; int dataSize;
int dataOfs; int dataOfs;


vec4_t tmp;
int glUsage; int glUsage;


switch ( usage ) switch ( usage )
Expand Down Expand Up @@ -165,132 +162,65 @@ VBO_t *R_CreateVBO2( const char *name, int numVertexes, srfVert_t *vert
data = ri.Hunk_AllocateTempMemory( dataSize ); data = ri.Hunk_AllocateTempMemory( dataSize );
dataOfs = 0; dataOfs = 0;


// set up xyz array // since this is all float, point tmp directly into data
for ( i = 0; i < numVertexes; i++ ) // 2-entry -> { memb[0], memb[1], 0, 1 }
{ // 3-entry -> { memb[0], memb[1], memb[2], 1 }
for ( j = 0; j < 3; j++ ) #define VERTEXSIZE(memb) ( sizeof( verts->memb ) / sizeof( verts->memb[ 0 ] ) )
{ #define VERTEXCOPY(memb) \
tmp[ j ] = verts[ i ].xyz[ j ]; do { \
} vec_t *tmp = (vec_t *) ( data + dataOfs ); \

for ( i = 0; i < numVertexes; i++ ) \
tmp[ 3 ] = 1; { \
for ( j = 0; j < VERTEXSIZE( memb ); j++ ) { *tmp++ = verts[ i ].memb[ j ]; } \
if ( VERTEXSIZE( memb ) < 3 ) { *tmp++ = 0; } \
if ( VERTEXSIZE( memb ) < 4 ) { *tmp++ = 1; } \
} \
dataOfs += i * sizeof( vec4_t ); \
} while ( 0 )


memcpy( data + dataOfs, ( vec_t * ) tmp, sizeof( vec4_t ) ); // set up xyz array
dataOfs += sizeof( vec4_t ); VERTEXCOPY( xyz );
}


// feed vertex texcoords // feed vertex texcoords
if ( stateBits & ATTR_TEXCOORD ) if ( stateBits & ATTR_TEXCOORD )
{ {
vbo->ofsTexCoords = dataOfs; vbo->ofsTexCoords = dataOfs;

VERTEXCOPY( st );
for ( i = 0; i < numVertexes; i++ )
{
for ( j = 0; j < 2; j++ )
{
tmp[ j ] = verts[ i ].st[ j ];
}

tmp[ 2 ] = 0;
tmp[ 3 ] = 1;

memcpy( data + dataOfs, ( vec_t * ) tmp, sizeof( vec4_t ) );
dataOfs += sizeof( vec4_t );
}
} }


// feed vertex lightmap texcoords // feed vertex lightmap texcoords
if ( stateBits & ATTR_LIGHTCOORD ) if ( stateBits & ATTR_LIGHTCOORD )
{ {
vbo->ofsLightCoords = dataOfs; vbo->ofsLightCoords = dataOfs;

VERTEXCOPY( lightmap );
for ( i = 0; i < numVertexes; i++ )
{
for ( j = 0; j < 2; j++ )
{
tmp[ j ] = verts[ i ].lightmap[ j ];
}

tmp[ 2 ] = 0;
tmp[ 3 ] = 1;

memcpy( data + dataOfs, ( vec_t * ) tmp, sizeof( vec4_t ) );
dataOfs += sizeof( vec4_t );
}
} }


// feed vertex tangents // feed vertex tangents
if ( stateBits & ATTR_TANGENT ) if ( stateBits & ATTR_TANGENT )
{ {
vbo->ofsTangents = dataOfs; vbo->ofsTangents = dataOfs;

VERTEXCOPY( tangent );
for ( i = 0; i < numVertexes; i++ )
{
for ( j = 0; j < 3; j++ )
{
tmp[ j ] = verts[ i ].tangent[ j ];
}

tmp[ 3 ] = 1;

memcpy( data + dataOfs, ( vec_t * ) tmp, sizeof( vec4_t ) );
dataOfs += sizeof( vec4_t );
}
} }


// feed vertex binormals // feed vertex binormals
if ( stateBits & ATTR_BINORMAL ) if ( stateBits & ATTR_BINORMAL )
{ {
vbo->ofsBinormals = dataOfs; vbo->ofsBinormals = dataOfs;

VERTEXCOPY( binormal );
for ( i = 0; i < numVertexes; i++ )
{
for ( j = 0; j < 3; j++ )
{
tmp[ j ] = verts[ i ].binormal[ j ];
}

tmp[ 3 ] = 1;

memcpy( data + dataOfs, ( vec_t * ) tmp, sizeof( vec4_t ) );
dataOfs += sizeof( vec4_t );
}
} }


// feed vertex normals // feed vertex normals
if ( stateBits & ATTR_NORMAL ) if ( stateBits & ATTR_NORMAL )
{ {
vbo->ofsNormals = dataOfs; vbo->ofsNormals = dataOfs;

VERTEXCOPY( normal );
for ( i = 0; i < numVertexes; i++ )
{
for ( j = 0; j < 3; j++ )
{
tmp[ j ] = verts[ i ].normal[ j ];
}

tmp[ 3 ] = 1;

memcpy( data + dataOfs, ( vec_t * ) tmp, sizeof( vec4_t ) );
dataOfs += sizeof( vec4_t );
}
} }


// feed vertex colors // feed vertex colors
if ( stateBits & ATTR_COLOR ) if ( stateBits & ATTR_COLOR )
{ {
vbo->ofsColors = dataOfs; vbo->ofsColors = dataOfs;

VERTEXCOPY( lightColor );
for ( i = 0; i < numVertexes; i++ )
{
for ( j = 0; j < 4; j++ )
{
tmp[ j ] = verts[ i ].lightColor[ j ];
}

memcpy( data + dataOfs, ( vec_t * ) tmp, sizeof( vec4_t ) );
dataOfs += sizeof( vec4_t );
}
} }


#if !defined( COMPAT_Q3A ) && !defined( COMPAT_ET ) #if !defined( COMPAT_Q3A ) && !defined( COMPAT_ET )
Expand All @@ -299,36 +229,14 @@ VBO_t *R_CreateVBO2( const char *name, int numVertexes, srfVert_t *vert
if ( stateBits & ATTR_PAINTCOLOR ) if ( stateBits & ATTR_PAINTCOLOR )
{ {
vbo->ofsPaintColors = dataOfs; vbo->ofsPaintColors = dataOfs;

VERTEXCOPY( paintColor );
for ( i = 0; i < numVertexes; i++ )
{
for ( j = 0; j < 4; j++ )
{
tmp[ j ] = verts[ i ].paintColor[ j ];
}

memcpy( data + dataOfs, ( vec_t * ) tmp, sizeof( vec4_t ) );
dataOfs += sizeof( vec4_t );
}
} }


// feed vertex light directions // feed vertex light directions
if ( stateBits & ATTR_LIGHTDIRECTION ) if ( stateBits & ATTR_LIGHTDIRECTION )
{ {
vbo->ofsLightDirections = dataOfs; vbo->ofsLightDirections = dataOfs;

VERTEXCOPY( lightDirection );
for ( i = 0; i < numVertexes; i++ )
{
for ( j = 0; j < 3; j++ )
{
tmp[ j ] = verts[ i ].lightDirection[ j ];
}

tmp[ 3 ] = 1;

memcpy( data + dataOfs, ( vec_t * ) tmp, sizeof( vec4_t ) );
dataOfs += sizeof( vec4_t );
}
} }


#endif #endif
Expand Down

0 comments on commit 9b0fe6c

Please sign in to comment.