summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/core.cpp10
-rw-r--r--src/core/loader/ncch.cpp6
-rw-r--r--src/core/telemetry_session.cpp76
-rw-r--r--src/video_core/renderer_opengl/pica_to_gl.h7
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp15
5 files changed, 96 insertions, 18 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 5429bcb26..d08f18623 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -168,6 +168,16 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) {
168} 168}
169 169
170void System::Shutdown() { 170void System::Shutdown() {
171 // Log last frame performance stats
172 auto perf_results = GetAndResetPerfStats();
173 Telemetry().AddField(Telemetry::FieldType::Performance, "Shutdown_EmulationSpeed",
174 perf_results.emulation_speed * 100.0);
175 Telemetry().AddField(Telemetry::FieldType::Performance, "Shutdown_Framerate",
176 perf_results.game_fps);
177 Telemetry().AddField(Telemetry::FieldType::Performance, "Shutdown_Frametime",
178 perf_results.frametime * 1000.0);
179
180 // Shutdown emulation session
171 GDBStub::Shutdown(); 181 GDBStub::Shutdown();
172 AudioCore::Shutdown(); 182 AudioCore::Shutdown();
173 VideoCore::Shutdown(); 183 VideoCore::Shutdown();
diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp
index ffc019560..fc4d14a59 100644
--- a/src/core/loader/ncch.cpp
+++ b/src/core/loader/ncch.cpp
@@ -342,9 +342,11 @@ ResultStatus AppLoader_NCCH::Load() {
342 if (result != ResultStatus::Success) 342 if (result != ResultStatus::Success)
343 return result; 343 return result;
344 344
345 LOG_INFO(Loader, "Program ID: %016" PRIX64, ncch_header.program_id); 345 std::string program_id{Common::StringFromFormat("%016" PRIX64, ncch_header.program_id)};
346 346
347 Core::Telemetry().AddField(Telemetry::FieldType::Session, "ProgramId", ncch_header.program_id); 347 LOG_INFO(Loader, "Program ID: %s", program_id.c_str());
348
349 Core::Telemetry().AddField(Telemetry::FieldType::Session, "ProgramId", program_id);
348 350
349 is_loaded = true; // Set state to loaded 351 is_loaded = true; // Set state to loaded
350 352
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp
index 70eff4340..841d6cfa1 100644
--- a/src/core/telemetry_session.cpp
+++ b/src/core/telemetry_session.cpp
@@ -4,7 +4,10 @@
4 4
5#include <cstring> 5#include <cstring>
6 6
7#include "common/assert.h"
7#include "common/scm_rev.h" 8#include "common/scm_rev.h"
9#include "common/x64/cpu_detect.h"
10#include "core/settings.h"
8#include "core/telemetry_session.h" 11#include "core/telemetry_session.h"
9 12
10#ifdef ENABLE_WEB_SERVICE 13#ifdef ENABLE_WEB_SERVICE
@@ -13,6 +16,18 @@
13 16
14namespace Core { 17namespace Core {
15 18
19static const char* CpuVendorToStr(Common::CPUVendor vendor) {
20 switch (vendor) {
21 case Common::CPUVendor::INTEL:
22 return "Intel";
23 case Common::CPUVendor::AMD:
24 return "Amd";
25 case Common::CPUVendor::OTHER:
26 return "Other";
27 }
28 UNREACHABLE();
29}
30
16TelemetrySession::TelemetrySession() { 31TelemetrySession::TelemetrySession() {
17#ifdef ENABLE_WEB_SERVICE 32#ifdef ENABLE_WEB_SERVICE
18 backend = std::make_unique<WebService::TelemetryJson>(); 33 backend = std::make_unique<WebService::TelemetryJson>();
@@ -20,22 +35,63 @@ TelemetrySession::TelemetrySession() {
20 backend = std::make_unique<Telemetry::NullVisitor>(); 35 backend = std::make_unique<Telemetry::NullVisitor>();
21#endif 36#endif
22 // Log one-time session start information 37 // Log one-time session start information
23 const auto duration{std::chrono::steady_clock::now().time_since_epoch()}; 38 const s64 init_time{std::chrono::duration_cast<std::chrono::milliseconds>(
24 const auto start_time{std::chrono::duration_cast<std::chrono::microseconds>(duration).count()}; 39 std::chrono::system_clock::now().time_since_epoch())
25 AddField(Telemetry::FieldType::Session, "StartTime", start_time); 40 .count()};
41 AddField(Telemetry::FieldType::Session, "Init_Time", init_time);
26 42
27 // Log one-time application information 43 // Log application information
28 const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr}; 44 const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr};
29 AddField(Telemetry::FieldType::App, "GitIsDirty", is_git_dirty); 45 AddField(Telemetry::FieldType::App, "Git_IsDirty", is_git_dirty);
30 AddField(Telemetry::FieldType::App, "GitBranch", Common::g_scm_branch); 46 AddField(Telemetry::FieldType::App, "Git_Branch", Common::g_scm_branch);
31 AddField(Telemetry::FieldType::App, "GitRevision", Common::g_scm_rev); 47 AddField(Telemetry::FieldType::App, "Git_Revision", Common::g_scm_rev);
48
49 // Log user system information
50 AddField(Telemetry::FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string);
51 AddField(Telemetry::FieldType::UserSystem, "CPU_BrandString",
52 Common::GetCPUCaps().brand_string);
53 AddField(Telemetry::FieldType::UserSystem, "CPU_Vendor",
54 CpuVendorToStr(Common::GetCPUCaps().vendor));
55 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_AES", Common::GetCPUCaps().aes);
56 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_AVX", Common::GetCPUCaps().avx);
57 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_AVX2", Common::GetCPUCaps().avx2);
58 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_BMI1", Common::GetCPUCaps().bmi1);
59 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_BMI2", Common::GetCPUCaps().bmi2);
60 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_FMA", Common::GetCPUCaps().fma);
61 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_FMA4", Common::GetCPUCaps().fma4);
62 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE", Common::GetCPUCaps().sse);
63 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE2", Common::GetCPUCaps().sse2);
64 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE3", Common::GetCPUCaps().sse3);
65 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSSE3",
66 Common::GetCPUCaps().ssse3);
67 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE41",
68 Common::GetCPUCaps().sse4_1);
69 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE42",
70 Common::GetCPUCaps().sse4_2);
71
72 // Log user configuration information
73 AddField(Telemetry::FieldType::UserConfig, "Audio_EnableAudioStretching",
74 Settings::values.enable_audio_stretching);
75 AddField(Telemetry::FieldType::UserConfig, "Core_UseCpuJit", Settings::values.use_cpu_jit);
76 AddField(Telemetry::FieldType::UserConfig, "Renderer_ResolutionFactor",
77 Settings::values.resolution_factor);
78 AddField(Telemetry::FieldType::UserConfig, "Renderer_ToggleFramelimit",
79 Settings::values.toggle_framelimit);
80 AddField(Telemetry::FieldType::UserConfig, "Renderer_UseHwRenderer",
81 Settings::values.use_hw_renderer);
82 AddField(Telemetry::FieldType::UserConfig, "Renderer_UseShaderJit",
83 Settings::values.use_shader_jit);
84 AddField(Telemetry::FieldType::UserConfig, "Renderer_UseVsync", Settings::values.use_vsync);
85 AddField(Telemetry::FieldType::UserConfig, "System_IsNew3ds", Settings::values.is_new_3ds);
86 AddField(Telemetry::FieldType::UserConfig, "System_RegionValue", Settings::values.region_value);
32} 87}
33 88
34TelemetrySession::~TelemetrySession() { 89TelemetrySession::~TelemetrySession() {
35 // Log one-time session end information 90 // Log one-time session end information
36 const auto duration{std::chrono::steady_clock::now().time_since_epoch()}; 91 const s64 shutdown_time{std::chrono::duration_cast<std::chrono::milliseconds>(
37 const auto end_time{std::chrono::duration_cast<std::chrono::microseconds>(duration).count()}; 92 std::chrono::system_clock::now().time_since_epoch())
38 AddField(Telemetry::FieldType::Session, "EndTime", end_time); 93 .count()};
94 AddField(Telemetry::FieldType::Session, "Shutdown_Time", shutdown_time);
39 95
40 // Complete the session, submitting to web service if necessary 96 // Complete the session, submitting to web service if necessary
41 // This is just a placeholder to wrap up the session once the core completes and this is 97 // This is just a placeholder to wrap up the session once the core completes and this is
diff --git a/src/video_core/renderer_opengl/pica_to_gl.h b/src/video_core/renderer_opengl/pica_to_gl.h
index 70298e211..c7fa1f873 100644
--- a/src/video_core/renderer_opengl/pica_to_gl.h
+++ b/src/video_core/renderer_opengl/pica_to_gl.h
@@ -12,6 +12,7 @@
12#include "common/common_funcs.h" 12#include "common/common_funcs.h"
13#include "common/common_types.h" 13#include "common/common_types.h"
14#include "common/logging/log.h" 14#include "common/logging/log.h"
15#include "core/core.h"
15#include "video_core/regs_framebuffer.h" 16#include "video_core/regs_framebuffer.h"
16#include "video_core/regs_lighting.h" 17#include "video_core/regs_lighting.h"
17#include "video_core/regs_texturing.h" 18#include "video_core/regs_texturing.h"
@@ -72,9 +73,9 @@ inline GLenum WrapMode(Pica::TexturingRegs::TextureConfig::WrapMode mode) {
72 } 73 }
73 74
74 if (static_cast<u32>(mode) > 3) { 75 if (static_cast<u32>(mode) > 3) {
75 // It is still unclear whether mode 4-7 are valid, so log it if a game uses them. 76 Core::Telemetry().AddField(Telemetry::FieldType::Session,
76 // TODO(wwylele): telemetry should be added here so we can collect more info about which 77 "VideoCore_Pica_UnsupportedTextureWrapMode",
77 // game uses this. 78 static_cast<u32>(mode));
78 LOG_WARNING(Render_OpenGL, "Using texture wrap mode %u", static_cast<u32>(mode)); 79 LOG_WARNING(Render_OpenGL, "Using texture wrap mode %u", static_cast<u32>(mode));
79 } 80 }
80 81
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index d90c776f9..65c18aecc 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -481,9 +481,18 @@ bool RendererOpenGL::Init() {
481 glDebugMessageCallback(DebugHandler, nullptr); 481 glDebugMessageCallback(DebugHandler, nullptr);
482 } 482 }
483 483
484 LOG_INFO(Render_OpenGL, "GL_VERSION: %s", glGetString(GL_VERSION)); 484 const char* gl_version{reinterpret_cast<char const*>(glGetString(GL_VERSION))};
485 LOG_INFO(Render_OpenGL, "GL_VENDOR: %s", glGetString(GL_VENDOR)); 485 const char* gpu_vendor{reinterpret_cast<char const*>(glGetString(GL_VENDOR))};
486 LOG_INFO(Render_OpenGL, "GL_RENDERER: %s", glGetString(GL_RENDERER)); 486 const char* gpu_model{reinterpret_cast<char const*>(glGetString(GL_RENDERER))};
487
488 LOG_INFO(Render_OpenGL, "GL_VERSION: %s", gl_version);
489 LOG_INFO(Render_OpenGL, "GL_VENDOR: %s", gpu_vendor);
490 LOG_INFO(Render_OpenGL, "GL_RENDERER: %s", gpu_model);
491
492 Core::Telemetry().AddField(Telemetry::FieldType::UserSystem, "GPU_Vendor", gpu_vendor);
493 Core::Telemetry().AddField(Telemetry::FieldType::UserSystem, "GPU_Model", gpu_model);
494 Core::Telemetry().AddField(Telemetry::FieldType::UserSystem, "GPU_OpenGL_Version", gl_version);
495
487 if (!GLAD_GL_VERSION_3_3) { 496 if (!GLAD_GL_VERSION_3_3) {
488 return false; 497 return false;
489 } 498 }