diff options
| author | 2017-07-12 22:19:34 -0400 | |
|---|---|---|
| committer | 2017-07-17 21:32:28 -0400 | |
| commit | df8b9863f93da24e25d25f32e548605743ed8f66 (patch) | |
| tree | b537192701ae290292d231cecb773af7897a4d8b | |
| parent | Merge pull request #2804 from Kloen/theming (diff) | |
| download | yuzu-df8b9863f93da24e25d25f32e548605743ed8f66.tar.gz yuzu-df8b9863f93da24e25d25f32e548605743ed8f66.tar.xz yuzu-df8b9863f93da24e25d25f32e548605743ed8f66.zip | |
telemetry: Log performance, configuration, and system data.
Diffstat (limited to '')
| -rw-r--r-- | src/core/core.cpp | 10 | ||||
| -rw-r--r-- | src/core/loader/ncch.cpp | 6 | ||||
| -rw-r--r-- | src/core/telemetry_session.cpp | 76 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/pica_to_gl.h | 7 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 15 |
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 | ||
| 170 | void System::Shutdown() { | 170 | void 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 | ||
| 14 | namespace Core { | 17 | namespace Core { |
| 15 | 18 | ||
| 19 | static 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 | |||
| 16 | TelemetrySession::TelemetrySession() { | 31 | TelemetrySession::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 | ||
| 34 | TelemetrySession::~TelemetrySession() { | 89 | TelemetrySession::~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 | } |