Skip to content

Commit ead772a

Browse files
committed
perf(vgui): backport CMatSystemSurface::DrawQuadArray from CSGO
* this greatly improves performance of various HUD element draws
1 parent ea39890 commit ead772a

File tree

1 file changed

+80
-61
lines changed

1 file changed

+80
-61
lines changed

src/vguimatsurface/MatSystemSurface.cpp

Lines changed: 80 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,80 +1092,99 @@ void CMatSystemSurface::DrawQuadArray( int quadCount, vgui::Vertex_t *pVerts, un
10921092
if ( !m_pMesh )
10931093
return;
10941094

1095-
meshBuilder.Begin( m_pMesh, MATERIAL_QUADS, quadCount );
1096-
10971095
vgui::Vertex_t ulc;
10981096
vgui::Vertex_t lrc;
10991097
vgui::Vertex_t *pulc;
11001098
vgui::Vertex_t *plrc;
11011099

1102-
if ( bShouldClip )
1103-
{
1104-
for ( int i = 0; i < quadCount; ++i )
1105-
{
1106-
PREFETCH360( &pVerts[ 2 * ( i + 1 ) ], 0 );
1107-
1108-
if ( !ClipRect( pVerts[2*i], pVerts[2*i + 1], &ulc, &lrc ) )
1109-
{
1110-
continue;
1111-
}
1112-
pulc = &ulc;
1113-
plrc = &lrc;
1114-
1115-
meshBuilder.Position3f( pulc->m_Position.x, pulc->m_Position.y, m_flZPos );
1116-
meshBuilder.Color4ubv( pColor );
1117-
meshBuilder.TexCoord2f( 0, pulc->m_TexCoord.x, pulc->m_TexCoord.y );
1118-
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1100+
int nMaxVertices, nMaxIndices;
1101+
CMatRenderContextPtr pRenderContext(g_pMaterialSystem);
1102+
pRenderContext->GetMaxToRender(m_pMesh, false, &nMaxVertices, &nMaxIndices);
1103+
if (!nMaxVertices || !nMaxIndices)
1104+
return; // probably in alt-tab
11191105

1120-
meshBuilder.Position3f( plrc->m_Position.x, pulc->m_Position.y, m_flZPos );
1121-
meshBuilder.Color4ubv( pColor );
1122-
meshBuilder.TexCoord2f( 0, plrc->m_TexCoord.x, pulc->m_TexCoord.y );
1123-
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1106+
int nMaxQuads = nMaxVertices / 4;
1107+
nMaxQuads = MIN(nMaxQuads, nMaxIndices / 6);
11241108

1125-
meshBuilder.Position3f( plrc->m_Position.x, plrc->m_Position.y, m_flZPos );
1126-
meshBuilder.Color4ubv( pColor );
1127-
meshBuilder.TexCoord2f( 0, plrc->m_TexCoord.x, plrc->m_TexCoord.y );
1128-
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1109+
int nFirstQuad = 0;
1110+
int nQuadsRemaining = quadCount;
11291111

1130-
meshBuilder.Position3f( pulc->m_Position.x, plrc->m_Position.y, m_flZPos );
1131-
meshBuilder.Color4ubv( pColor );
1132-
meshBuilder.TexCoord2f( 0, pulc->m_TexCoord.x, plrc->m_TexCoord.y );
1133-
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1134-
}
1135-
}
1136-
else
1112+
while (nQuadsRemaining > 0)
11371113
{
1138-
for ( int i = 0; i < quadCount; ++i )
1114+
quadCount = MIN( nQuadsRemaining, nMaxQuads );
1115+
meshBuilder.Begin( m_pMesh, MATERIAL_QUADS, quadCount );
1116+
if ( bShouldClip )
11391117
{
1140-
PREFETCH360( &pVerts[ 2 * ( i + 1 ) ], 0 );
1141-
1142-
pulc = &pVerts[2*i];
1143-
plrc = &pVerts[2*i + 1];
1144-
1145-
meshBuilder.Position3f( pulc->m_Position.x, pulc->m_Position.y, m_flZPos );
1146-
meshBuilder.Color4ubv( pColor );
1147-
meshBuilder.TexCoord2f( 0, pulc->m_TexCoord.x, pulc->m_TexCoord.y );
1148-
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1149-
1150-
meshBuilder.Position3f( plrc->m_Position.x, pulc->m_Position.y, m_flZPos );
1151-
meshBuilder.Color4ubv( pColor );
1152-
meshBuilder.TexCoord2f( 0, plrc->m_TexCoord.x, pulc->m_TexCoord.y );
1153-
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1154-
1155-
meshBuilder.Position3f( plrc->m_Position.x, plrc->m_Position.y, m_flZPos );
1156-
meshBuilder.Color4ubv( pColor );
1157-
meshBuilder.TexCoord2f( 0, plrc->m_TexCoord.x, plrc->m_TexCoord.y );
1158-
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1118+
for ( int q = 0; q < quadCount; ++q )
1119+
{
1120+
int i = q + nFirstQuad;
1121+
PREFETCH360( &pVerts[ 2 * ( i + 1 ) ], 0 );
11591122

1160-
meshBuilder.Position3f( pulc->m_Position.x, plrc->m_Position.y, m_flZPos );
1161-
meshBuilder.Color4ubv( pColor );
1162-
meshBuilder.TexCoord2f( 0, pulc->m_TexCoord.x, plrc->m_TexCoord.y );
1163-
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1123+
if ( !ClipRect( pVerts[2*i], pVerts[2*i + 1], &ulc, &lrc ) )
1124+
{
1125+
continue;
1126+
}
1127+
pulc = &ulc;
1128+
plrc = &lrc;
1129+
1130+
meshBuilder.Position3f( pulc->m_Position.x, pulc->m_Position.y, m_flZPos );
1131+
meshBuilder.Color4ubv( pColor );
1132+
meshBuilder.TexCoord2f( 0, pulc->m_TexCoord.x, pulc->m_TexCoord.y );
1133+
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1134+
1135+
meshBuilder.Position3f( plrc->m_Position.x, pulc->m_Position.y, m_flZPos );
1136+
meshBuilder.Color4ubv( pColor );
1137+
meshBuilder.TexCoord2f( 0, plrc->m_TexCoord.x, pulc->m_TexCoord.y );
1138+
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1139+
1140+
meshBuilder.Position3f( plrc->m_Position.x, plrc->m_Position.y, m_flZPos );
1141+
meshBuilder.Color4ubv( pColor );
1142+
meshBuilder.TexCoord2f( 0, plrc->m_TexCoord.x, plrc->m_TexCoord.y );
1143+
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1144+
1145+
meshBuilder.Position3f( pulc->m_Position.x, plrc->m_Position.y, m_flZPos );
1146+
meshBuilder.Color4ubv( pColor );
1147+
meshBuilder.TexCoord2f( 0, pulc->m_TexCoord.x, plrc->m_TexCoord.y );
1148+
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1149+
}
1150+
}
1151+
else
1152+
{
1153+
for (int q = 0; q < quadCount; ++q)
1154+
{
1155+
int i = q + nFirstQuad;
1156+
PREFETCH360( &pVerts[ 2 * ( i + 1 ) ], 0 );
1157+
1158+
pulc = &pVerts[2*i];
1159+
plrc = &pVerts[2*i + 1];
1160+
1161+
meshBuilder.Position3f( pulc->m_Position.x, pulc->m_Position.y, m_flZPos );
1162+
meshBuilder.Color4ubv( pColor );
1163+
meshBuilder.TexCoord2f( 0, pulc->m_TexCoord.x, pulc->m_TexCoord.y );
1164+
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1165+
1166+
meshBuilder.Position3f( plrc->m_Position.x, pulc->m_Position.y, m_flZPos );
1167+
meshBuilder.Color4ubv( pColor );
1168+
meshBuilder.TexCoord2f( 0, plrc->m_TexCoord.x, pulc->m_TexCoord.y );
1169+
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1170+
1171+
meshBuilder.Position3f( plrc->m_Position.x, plrc->m_Position.y, m_flZPos );
1172+
meshBuilder.Color4ubv( pColor );
1173+
meshBuilder.TexCoord2f( 0, plrc->m_TexCoord.x, plrc->m_TexCoord.y );
1174+
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1175+
1176+
meshBuilder.Position3f( pulc->m_Position.x, plrc->m_Position.y, m_flZPos );
1177+
meshBuilder.Color4ubv( pColor );
1178+
meshBuilder.TexCoord2f( 0, pulc->m_TexCoord.x, plrc->m_TexCoord.y );
1179+
meshBuilder.AdvanceVertexF<VTX_HAVEPOS | VTX_HAVECOLOR, 1>();
1180+
}
11641181
}
1165-
}
11661182

1167-
meshBuilder.End();
1168-
m_pMesh->Draw();
1183+
meshBuilder.End();
1184+
m_pMesh->Draw();
1185+
nFirstQuad += quadCount;
1186+
nQuadsRemaining -= quadCount;
1187+
}
11691188
}
11701189

11711190

0 commit comments

Comments
 (0)