summaryrefslogtreecommitdiff
path: root/common/vgui/vgui_budgetpanelshared.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/vgui/vgui_budgetpanelshared.cpp')
-rw-r--r--common/vgui/vgui_budgetpanelshared.cpp263
1 files changed, 263 insertions, 0 deletions
diff --git a/common/vgui/vgui_budgetpanelshared.cpp b/common/vgui/vgui_budgetpanelshared.cpp
new file mode 100644
index 0000000..0cc075a
--- /dev/null
+++ b/common/vgui/vgui_budgetpanelshared.cpp
@@ -0,0 +1,263 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "vgui_budgetpanelshared.h"
+#include "vgui/IVGui.h"
+#include "vgui/ILocalize.h"
+#include "vgui/ISurface.h"
+#include "vgui_controls/Label.h"
+#include "ivprofexport.h"
+#include "convar.h"
+#include "mathlib/mathlib.h"
+
+// NOTE: This has to be the last file included!
+#include "tier0/memdbgon.h"
+
+
+#ifdef VPROF_ENABLED
+
+#ifdef BUDGET_ADMIN_SERVER
+ #define BUDGET_CVAR_CALLBACK NULL
+#else
+ #define BUDGET_CVAR_CALLBACK PanelGeometryChangedCallBack
+#endif
+
+
+// Global ConVars.
+ConVar budget_history_range_ms( "budget_history_range_ms", "66.666666667", FCVAR_ARCHIVE, "budget history range in milliseconds", BUDGET_CVAR_CALLBACK );
+ConVar budget_panel_bottom_of_history_fraction( "budget_panel_bottom_of_history_fraction", ".25", FCVAR_ARCHIVE, "number between 0 and 1", BUDGET_CVAR_CALLBACK );
+ConVar budget_bargraph_range_ms( "budget_bargraph_range_ms", "16.6666666667", FCVAR_ARCHIVE, "budget bargraph range in milliseconds", BUDGET_CVAR_CALLBACK );
+ConVar budget_background_alpha( "budget_background_alpha", "128", FCVAR_ARCHIVE, "how translucent the budget panel is" );
+
+ConVar budget_panel_x( "budget_panel_x", "0", FCVAR_ARCHIVE, "number of pixels from the left side of the game screen to draw the budget panel", BUDGET_CVAR_CALLBACK );
+ConVar budget_panel_y( "budget_panel_y", "50", FCVAR_ARCHIVE, "number of pixels from the top side of the game screen to draw the budget panel", BUDGET_CVAR_CALLBACK );
+ConVar budget_panel_width( "budget_panel_width", "512", FCVAR_ARCHIVE, "width in pixels of the budget panel", BUDGET_CVAR_CALLBACK );
+ConVar budget_panel_height( "budget_panel_height", "384", FCVAR_ARCHIVE, "height in pixels of the budget panel", BUDGET_CVAR_CALLBACK );
+
+
+static CUtlVector<IVProfExport::CExportedBudgetGroupInfo> g_TempBudgetGroupSpace;
+
+
+double CBudgetPanelShared::g_fFrameTimeLessBudget = 0;
+double CBudgetPanelShared::g_fFrameRate = 0;
+
+static CFastTimer g_TimerLessBudget;
+static CBudgetPanelShared *g_pBudgetPanelShared = NULL;
+extern IVProfExport *g_pVProfExport;
+
+
+void PanelGeometryChangedCallBack( IConVar *var, const char *pOldString, float flOldValue )
+{
+ // screw it . . rebuild the whole damn thing.
+ // GetBudgetPanel()->InvalidateLayout();
+ if ( g_pBudgetPanelShared )
+ {
+ g_pBudgetPanelShared->SendConfigDataToBase();
+ }
+}
+
+
+// -------------------------------------------------------------------------------------------------------------------- //
+// CBudgetPanelShared implementation.
+// -------------------------------------------------------------------------------------------------------------------- //
+
+CBudgetPanelShared::CBudgetPanelShared( vgui::Panel *pParent, const char *pElementName, int budgetFlagsFilter )
+ : BaseClass( pParent, pElementName )
+{
+ Assert( !g_pBudgetPanelShared );
+ g_pBudgetPanelShared = this;
+
+ if ( g_pVProfExport )
+ g_pVProfExport->SetBudgetFlagsFilter( budgetFlagsFilter );
+
+ SendConfigDataToBase();
+ SetZPos( 1001 );
+ SetVisible( false );
+ vgui::ivgui()->AddTickSignal( GetVPanel() );
+ SetPostChildPaintEnabled( true ); // so we can turn vprof back on
+}
+
+
+CBudgetPanelShared::~CBudgetPanelShared()
+{
+ Assert( g_pBudgetPanelShared == this );
+ g_pBudgetPanelShared = NULL;
+}
+
+
+void CBudgetPanelShared::OnNumBudgetGroupsChanged()
+{
+ SendConfigDataToBase();
+}
+
+
+void CBudgetPanelShared::SetupCustomConfigData( CBudgetPanelConfigData &data )
+{
+ data.m_xCoord = budget_panel_x.GetInt();
+ data.m_yCoord = budget_panel_y.GetInt();
+ data.m_Width = budget_panel_width.GetInt();
+ data.m_Height = budget_panel_height.GetInt();
+}
+
+
+void CBudgetPanelShared::SendConfigDataToBase()
+{
+ // Setup all the data.
+ CBudgetPanelConfigData data;
+
+ // Copy the budget group names in.
+ int nGroups = 0;
+ if ( g_pVProfExport )
+ {
+ nGroups = g_pVProfExport->GetNumBudgetGroups();
+
+ // Make sure we have space to store the results.
+ if ( g_TempBudgetGroupSpace.Count() < nGroups )
+ g_TempBudgetGroupSpace.SetSize( nGroups );
+
+ g_pVProfExport->GetBudgetGroupInfos( g_TempBudgetGroupSpace.Base() );
+ }
+
+ data.m_BudgetGroupInfo.SetSize( nGroups );
+ for ( int i=0; i < nGroups; i++ )
+ {
+ data.m_BudgetGroupInfo[i].m_Name = g_TempBudgetGroupSpace[i].m_pName;
+ data.m_BudgetGroupInfo[i].m_Color = g_TempBudgetGroupSpace[i].m_Color;
+ }
+
+ data.m_HistoryLabelValues.AddToTail( 1000.0 / 20 );
+ data.m_HistoryLabelValues.AddToTail( 1000.0 / 30 );
+ data.m_HistoryLabelValues.AddToTail( 1000.0 / 60 );
+
+ // Copy all the cvars in.
+ data.m_flHistoryRange = budget_history_range_ms.GetFloat();
+ data.m_flBottomOfHistoryFraction = budget_panel_bottom_of_history_fraction.GetFloat();
+
+ data.m_flBarGraphRange = budget_bargraph_range_ms.GetFloat();
+ data.m_flTimeLabelInterval = 5;
+ data.m_nLinesPerTimeLabel = 5;
+
+ data.m_flBackgroundAlpha = budget_background_alpha.GetFloat();
+
+ SetupCustomConfigData( data );
+
+ // Send the config data to the base class.
+ OnConfigDataChanged( data );
+}
+
+
+void CBudgetPanelShared::DrawColoredText(
+ vgui::HFont font,
+ int x, int y,
+ int r, int g, int b, int a,
+ const char *pText,
+ ... )
+{
+ char msg[4096];
+ va_list marker;
+ va_start( marker, pText );
+ _vsnprintf( msg, sizeof( msg ), pText, marker );
+ va_end( marker );
+
+ wchar_t unicodeStr[4096];
+ int nChars = g_pVGuiLocalize->ConvertANSIToUnicode( msg, unicodeStr, sizeof( unicodeStr ) );
+
+ vgui::surface()->DrawSetTextFont( font );
+ vgui::surface()->DrawSetTextColor( r, g, b, a );
+ vgui::surface()->DrawSetTextPos( x, y );
+ vgui::surface()->DrawPrintText( unicodeStr, nChars );
+}
+
+
+void CBudgetPanelShared::PaintBackground()
+{
+ if ( g_pVProfExport )
+ g_pVProfExport->PauseProfile();
+
+ BaseClass::PaintBackground();
+}
+
+
+void CBudgetPanelShared::Paint()
+{
+ if( m_BudgetGroupTimes.Count() == 0 )
+ {
+ return;
+ }
+
+ static bool TimerInitialized = false;
+ if( !TimerInitialized )
+ {
+ g_TimerLessBudget.Start();
+ TimerInitialized=true;
+ }
+
+ g_TimerLessBudget.End();
+
+ BaseClass::Paint();
+
+ g_fFrameTimeLessBudget = ( g_TimerLessBudget.GetDuration().GetSeconds() );
+ g_fFrameRate = 1.0 / g_fFrameTimeLessBudget;
+}
+
+void CBudgetPanelShared::PostChildPaint()
+{
+ g_TimerLessBudget.Start();
+
+ if ( g_pVProfExport )
+ g_pVProfExport->ResumeProfile();
+}
+
+void CBudgetPanelShared::SnapshotVProfHistory( float filteredtime )
+{
+ m_BudgetHistoryOffset = ( m_BudgetHistoryOffset + 1 ) % BUDGET_HISTORY_COUNT;
+ ClearTimesForAllGroupsForThisFrame();
+
+ if ( g_pVProfExport )
+ {
+ if ( GetNumCachedBudgetGroups() != g_pVProfExport->GetNumBudgetGroups() )
+ {
+ SendConfigDataToBase();
+ }
+
+ float times[IVProfExport::MAX_BUDGETGROUP_TIMES];
+ g_pVProfExport->GetBudgetGroupTimes( times );
+
+ for ( int groupID=0; groupID < GetNumCachedBudgetGroups(); groupID++ )
+ {
+ float dt = times[groupID];
+ // Hack: add filtered time into unnaccounted group...
+ if ( groupID == VPROF_BUDGET_GROUP_ID_UNACCOUNTED )
+ {
+ dt += 1000.0f * filteredtime;
+ }
+ m_BudgetGroupTimes[groupID].m_Time[m_BudgetHistoryOffset] = dt;
+ }
+ }
+}
+
+
+void CBudgetPanelShared::SetTimeLabelText()
+{
+ for ( int i=0; i < m_TimeLabels.Count(); i++ )
+ {
+ char text[512];
+ Q_snprintf( text, sizeof( text ), "%dms", (int)( i * GetConfigData().m_flTimeLabelInterval ) );
+ m_TimeLabels[i]->SetText( text );
+ }
+}
+
+
+void CBudgetPanelShared::SetHistoryLabelText()
+{
+ Assert( m_HistoryLabels.Count() == 3 );
+ m_HistoryLabels[0]->SetText( "20 fps (50 ms)" );
+ m_HistoryLabels[1]->SetText( "30 fps (33 1/3 ms)" );
+ m_HistoryLabels[2]->SetText( "60 fps (16 2/3 ms)" );
+}
+
+
+#endif // VPROF_ENABLED