summaryrefslogtreecommitdiff
path: root/engine/cbenchmark.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/cbenchmark.cpp')
-rw-r--r--engine/cbenchmark.cpp169
1 files changed, 169 insertions, 0 deletions
diff --git a/engine/cbenchmark.cpp b/engine/cbenchmark.cpp
new file mode 100644
index 0000000..0a265a9
--- /dev/null
+++ b/engine/cbenchmark.cpp
@@ -0,0 +1,169 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "client_pch.h"
+
+#ifdef IS_WINDOWS_PC
+#include "winlite.h"
+#include <winsock2.h> // INADDR_ANY defn
+#endif
+#include "cbenchmark.h"
+#include "tier0/vcrmode.h"
+#include "filesystem_engine.h"
+#include "sys.h"
+#include "KeyValues.h"
+#include "sv_uploaddata.h"
+#include "FindSteamServers.h"
+#include "vstdlib/random.h"
+#include "cl_steamauth.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+#define DEFAULT_RESULTS_FOLDER "results"
+#define DEFAULT_RESULTS_FILENAME "results.txt"
+
+CBenchmarkResults g_BenchmarkResults;
+extern ConVar host_framerate;
+extern void GetMaterialSystemConfigForBenchmarkUpload(KeyValues *dataToUpload);
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CBenchmarkResults::CBenchmarkResults()
+{
+ m_bIsTestRunning = false;
+ m_szFilename[0] = 0;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool CBenchmarkResults::IsBenchmarkRunning()
+{
+ return m_bIsTestRunning;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: starts recording data
+//-----------------------------------------------------------------------------
+void CBenchmarkResults::StartBenchmark( const CCommand &args )
+{
+ const char *pszFilename = DEFAULT_RESULTS_FILENAME;
+
+ if ( args.ArgC() > 1 )
+ {
+ pszFilename = args[1];
+ }
+
+ // check path first
+ if ( !COM_IsValidPath( pszFilename ) )
+ {
+ ConMsg( "bench_start %s: invalid path.\n", pszFilename );
+ return;
+ }
+
+ m_bIsTestRunning = true;
+
+ SetResultsFilename( pszFilename );
+
+ // set any necessary settings
+ host_framerate.SetValue( (float)(1.0f / host_state.interval_per_tick) );
+
+ // get the current frame and time
+ m_iStartFrame = host_framecount;
+ m_flStartTime = realtime;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: writes out results to file
+//-----------------------------------------------------------------------------
+void CBenchmarkResults::StopBenchmark()
+{
+ m_bIsTestRunning = false;
+
+ // reset
+ host_framerate.SetValue( 0 );
+
+ // print out some stats
+ int numticks = host_framecount - m_iStartFrame;
+ float framerate = numticks / ( realtime - m_flStartTime );
+ Msg( "Average framerate: %.2f\n", framerate );
+
+ // work out where to write the file
+ g_pFileSystem->CreateDirHierarchy( DEFAULT_RESULTS_FOLDER, "MOD" );
+ char szFilename[256];
+ Q_snprintf( szFilename, sizeof( szFilename ), "%s\\%s", DEFAULT_RESULTS_FOLDER, m_szFilename );
+
+ // write out the data as keyvalues
+ KeyValues *kv = new KeyValues( "benchmark" );
+ kv->SetFloat( "framerate", framerate );
+ kv->SetInt( "build", build_number() );
+
+ // get material system info
+ GetMaterialSystemConfigForBenchmarkUpload( kv );
+
+ // save
+ kv->SaveToFile( g_pFileSystem, szFilename, "MOD" );
+ kv->deleteThis();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Sets which file the results will be written to
+//-----------------------------------------------------------------------------
+void CBenchmarkResults::SetResultsFilename( const char *pFilename )
+{
+ Q_strncpy( m_szFilename, pFilename, sizeof( m_szFilename ) );
+ Q_DefaultExtension( m_szFilename, ".txt", sizeof( m_szFilename ) );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: uploads the most recent results to Steam
+//-----------------------------------------------------------------------------
+void CBenchmarkResults::Upload()
+{
+#ifndef SWDS
+ if ( !m_szFilename[0] || !Steam3Client().SteamUtils() )
+ return;
+ uint32 cserIP = 0;
+ uint16 cserPort = 0;
+ while ( cserIP == 0 )
+ {
+ Steam3Client().SteamUtils()->GetCSERIPPort( &cserIP, &cserPort );
+ if ( !cserIP )
+ Sys_Sleep( 10 );
+ }
+
+ netadr_t netadr_CserIP( cserIP, cserPort );
+ // upload
+ char szFilename[256];
+ Q_snprintf( szFilename, sizeof( szFilename ), "%s\\%s", DEFAULT_RESULTS_FOLDER, m_szFilename );
+ KeyValues *kv = new KeyValues( "benchmark" );
+ if ( kv->LoadFromFile( g_pFileSystem, szFilename, "MOD" ) )
+ {
+ // this sends the data to the Steam CSER
+ UploadData( netadr_CserIP.ToString(), "benchmark", kv );
+ }
+
+ kv->deleteThis();
+#endif
+}
+
+CON_COMMAND_F( bench_start, "Starts gathering of info. Arguments: filename to write results into", FCVAR_CHEAT )
+{
+ GetBenchResultsMgr()->StartBenchmark( args );
+}
+
+CON_COMMAND_F( bench_end, "Ends gathering of info.", FCVAR_CHEAT )
+{
+ GetBenchResultsMgr()->StopBenchmark();
+}
+
+CON_COMMAND_F( bench_upload, "Uploads most recent benchmark stats to the Valve servers.", FCVAR_CHEAT )
+{
+ GetBenchResultsMgr()->Upload();
+}
+