From 235fc348aff0a74d1c70a57de98a5afdc97a4baf Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 2 Mar 2019 14:25:50 -0500 Subject: [PATCH 1/7] logging/backend: Move CreateEntry into the Impl class This function is only ever used within this source file and makes it easier to remove static state in the following change. --- src/common/logging/backend.cpp | 55 +++++++++++++++++----------------- src/common/logging/backend.h | 4 --- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index d440d910a..f0ccfbf25 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -39,8 +39,10 @@ public: Impl(Impl const&) = delete; const Impl& operator=(Impl const&) = delete; - void PushEntry(Entry e) { - message_queue.Push(std::move(e)); + void PushEntry(Class log_class, Level log_level, const char* filename, unsigned int line_num, + const char* function, std::string message) { + message_queue.Push( + CreateEntry(log_class, log_level, filename, line_num, function, std::move(message))); } void AddBackend(std::unique_ptr backend) { @@ -108,6 +110,28 @@ private: backend_thread.join(); } + Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr, + const char* function, std::string message) const { + using std::chrono::duration_cast; + using std::chrono::steady_clock; + + // matches from the beginning up to the last '../' or 'src/' + static const std::regex trim_source_path(R"(.*([\/\\]|^)((\.\.)|(src))[\/\\])"); + static steady_clock::time_point time_origin = steady_clock::now(); + + Entry entry; + entry.timestamp = + duration_cast(steady_clock::now() - time_origin); + entry.log_class = log_class; + entry.log_level = log_level; + entry.filename = std::regex_replace(filename, trim_source_path, ""); + entry.line_num = line_nr; + entry.function = function; + entry.message = std::move(message); + + return entry; + } + std::mutex writing_mutex; std::thread backend_thread; std::vector> backends; @@ -249,27 +273,6 @@ const char* GetLevelName(Level log_level) { #undef LVL } -Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr, - const char* function, std::string message) { - using std::chrono::duration_cast; - using std::chrono::steady_clock; - - // matches from the beginning up to the last '../' or 'src/' - static const std::regex trim_source_path(R"(.*([\/\\]|^)((\.\.)|(src))[\/\\])"); - static steady_clock::time_point time_origin = steady_clock::now(); - - Entry entry; - entry.timestamp = duration_cast(steady_clock::now() - time_origin); - entry.log_class = log_class; - entry.log_level = log_level; - entry.filename = std::regex_replace(filename, trim_source_path, ""); - entry.line_num = line_nr; - entry.function = function; - entry.message = std::move(message); - - return entry; -} - void SetGlobalFilter(const Filter& filter) { Impl::Instance().SetGlobalFilter(filter); } @@ -294,9 +297,7 @@ void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename, if (!filter.CheckMessage(log_class, log_level)) return; - Entry entry = - CreateEntry(log_class, log_level, filename, line_num, function, fmt::vformat(format, args)); - - instance.PushEntry(std::move(entry)); + instance.PushEntry(log_class, log_level, filename, line_num, function, + fmt::vformat(format, args)); } } // namespace Log diff --git a/src/common/logging/backend.h b/src/common/logging/backend.h index 781c63628..57884e247 100644 --- a/src/common/logging/backend.h +++ b/src/common/logging/backend.h @@ -136,10 +136,6 @@ const char* GetLogClassName(Class log_class); */ const char* GetLevelName(Level log_level); -/// Creates a log entry by formatting the given source location, and message. -Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr, - const char* function, std::string message); - /** * The global filter will prevent any messages from even being processed if they are filtered. Each * backend can have a filter, but if the level is lower than the global filter, the backend will From 592ec9b08470b4447adb4a70cc669b5d7e40fb4e Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 2 Mar 2019 14:28:58 -0500 Subject: [PATCH 2/7] logging/backend: Make time_origin a class variable instead of a local static Moves local global state into the Impl class itself and initializes it at the creation of the instance instead of in the function. This makes it nicer for weakly-ordered architectures, given the CreateEntry() class won't need to have atomic loads executed for each individual call to the CreateEntry class. --- src/common/logging/backend.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index f0ccfbf25..e28b527ef 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -117,7 +117,6 @@ private: // matches from the beginning up to the last '../' or 'src/' static const std::regex trim_source_path(R"(.*([\/\\]|^)((\.\.)|(src))[\/\\])"); - static steady_clock::time_point time_origin = steady_clock::now(); Entry entry; entry.timestamp = @@ -137,6 +136,7 @@ private: std::vector> backends; Common::MPSCQueue message_queue; Filter filter; + std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()}; }; void ConsoleBackend::Write(const Entry& entry) { From 6f251a6db28542b72dc60262af491cb70ca6befe Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 2 Mar 2019 15:17:40 -0500 Subject: [PATCH 3/7] core/core: Replace direct usage of the global system telemetry accessor from Shutdown() The telemetry instance is actually a member of the class itself, so we can access it directly instead of going through the global accessor. --- src/core/core.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/core/core.cpp b/src/core/core.cpp index 9473b5c0c..fdd9ac2ff 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -280,13 +280,13 @@ void System::RegisterSoftwareKeyboard(std::shared_ptrAddField(Telemetry::FieldType::Performance, "Shutdown_EmulationSpeed", + perf_results.emulation_speed * 100.0); + telemetry_session->AddField(Telemetry::FieldType::Performance, "Shutdown_Framerate", + perf_results.game_fps); + telemetry_session->AddField(Telemetry::FieldType::Performance, "Shutdown_Frametime", + perf_results.frametime * 1000.0); // Shutdown emulation session GDBStub::Shutdown(); From d37a2fb9e636fd435b9584e63fb9e8729e0b2ed2 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 2 Mar 2019 15:18:59 -0500 Subject: [PATCH 4/7] yuzu-cmd/yuzu: Replace direct usage of the global system telemetry accessor in main() We already have the system instance around, so we can use that instead of the accessor. --- src/citra/citra.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp index 2fabfbfc7..4c13713c1 100644 --- a/src/citra/citra.cpp +++ b/src/citra/citra.cpp @@ -374,7 +374,7 @@ int main(int argc, char** argv) { break; // Expected case } - Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "SDL"); + system.TelemetrySession().AddField(Telemetry::FieldType::App, "Frontend", "SDL"); if (use_multiplayer) { if (auto member = Network::GetRoomMember().lock()) { From 65572a0fb87c55edf1f963fe5d7e50a3bc775907 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 2 Mar 2019 15:20:49 -0500 Subject: [PATCH 5/7] yuzu: Remove usage of the global telemetry accessor In these cases the system object is nearby, and in the other, the long-form of accessing the telemetry instance is already used, so we can get rid of the use of the global accessor. --- src/citra_qt/compatdb.cpp | 4 ++-- src/citra_qt/main.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/citra_qt/compatdb.cpp b/src/citra_qt/compatdb.cpp index 4209b16cf..6b6c7f37f 100644 --- a/src/citra_qt/compatdb.cpp +++ b/src/citra_qt/compatdb.cpp @@ -51,8 +51,8 @@ void CompatDB::Submit() { case CompatDBPage::Final: back(); LOG_DEBUG(Frontend, "Compatibility Rating: {}", compatibility->checkedId()); - Core::Telemetry().AddField(Telemetry::FieldType::UserFeedback, "Compatibility", - compatibility->checkedId()); + Core::System::GetInstance().TelemetrySession().AddField( + Telemetry::FieldType::UserFeedback, "Compatibility", compatibility->checkedId()); button(NextButton)->setEnabled(false); button(NextButton)->setText(tr("Submitting")); diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index d0a3a3720..b57ae18a2 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -798,7 +798,7 @@ bool GMainWindow::LoadROM(const QString& filename) { game_path = filename; - Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "Qt"); + system.TelemetrySession().AddField(Telemetry::FieldType::App, "Frontend", "Qt"); return true; } From dbc3c8e9bb220f10c9631ffafb18146769ff9434 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 2 Mar 2019 15:22:14 -0500 Subject: [PATCH 6/7] core/core: Remove the global telemetry accessor function With all usages converted off of it, this function can be removed. --- src/core/core.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/core/core.h b/src/core/core.h index 2e0c9ce7f..88379f9c8 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -295,8 +295,4 @@ inline AudioCore::DspInterface& DSP() { return System::GetInstance().DSP(); } -inline TelemetrySession& Telemetry() { - return System::GetInstance().TelemetrySession(); -} - } // namespace Core From d755a15891b80f96c0990b07e7fb231a5b0ca5d6 Mon Sep 17 00:00:00 2001 From: fearlessTobi Date: Sat, 9 Mar 2019 18:46:37 +0100 Subject: [PATCH 7/7] fix compilation problems --- src/core/loader/ncch.cpp | 5 +++-- src/video_core/renderer_opengl/gl_shader_gen.cpp | 4 ++-- src/video_core/renderer_opengl/pica_to_gl.h | 6 +++--- src/video_core/renderer_opengl/renderer_opengl.cpp | 7 ++++--- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp index 34f49663a..a8329ba19 100644 --- a/src/core/loader/ncch.cpp +++ b/src/core/loader/ncch.cpp @@ -173,7 +173,8 @@ ResultStatus AppLoader_NCCH::Load(Kernel::SharedPtr& process) { overlay_ncch = &update_ncch; } - Core::Telemetry().AddField(Telemetry::FieldType::Session, "ProgramId", program_id); + auto& system = Core::System::GetInstance(); + system.TelemetrySession().AddField(Telemetry::FieldType::Session, "ProgramId", program_id); if (auto room_member = Network::GetRoomMember().lock()) { Network::GameInfo game_info; @@ -188,7 +189,7 @@ ResultStatus AppLoader_NCCH::Load(Kernel::SharedPtr& process) { if (ResultStatus::Success != result) return result; - Core::System::GetInstance().ArchiveManager().RegisterSelfNCCH(*this); + system.ArchiveManager().RegisterSelfNCCH(*this); ParseRegionLockoutInfo(); diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp index 3ea883038..fdf139c3c 100644 --- a/src/video_core/renderer_opengl/gl_shader_gen.cpp +++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp @@ -1549,8 +1549,8 @@ vec4 secondary_fragment_color = vec4(0.0); // Blend the fog out += "last_tex_env_out.rgb = mix(fog_color.rgb, last_tex_env_out.rgb, fog_factor);\n"; } else if (state.fog_mode == TexturingRegs::FogMode::Gas) { - Core::Telemetry().AddField(Telemetry::FieldType::Session, "VideoCore_Pica_UseGasMode", - true); + Core::System::GetInstance().TelemetrySession().AddField(Telemetry::FieldType::Session, + "VideoCore_Pica_UseGasMode", true); LOG_CRITICAL(Render_OpenGL, "Unimplemented gas mode"); out += "discard; }"; return out; diff --git a/src/video_core/renderer_opengl/pica_to_gl.h b/src/video_core/renderer_opengl/pica_to_gl.h index 0bdc63d4a..e923bb838 100644 --- a/src/video_core/renderer_opengl/pica_to_gl.h +++ b/src/video_core/renderer_opengl/pica_to_gl.h @@ -83,9 +83,9 @@ inline GLenum WrapMode(Pica::TexturingRegs::TextureConfig::WrapMode mode) { } if (index > 3) { - Core::Telemetry().AddField(Telemetry::FieldType::Session, - "VideoCore_Pica_UnsupportedTextureWrapMode", - static_cast(index)); + Core::System::GetInstance().TelemetrySession().AddField( + Telemetry::FieldType::Session, "VideoCore_Pica_UnsupportedTextureWrapMode", + static_cast(index)); LOG_WARNING(Render_OpenGL, "Using texture wrap mode {}", index); } diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index fc63bfea7..8084ce8e7 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -552,9 +552,10 @@ Core::System::ResultStatus RendererOpenGL::Init() { LOG_INFO(Render_OpenGL, "GL_VENDOR: {}", gpu_vendor); LOG_INFO(Render_OpenGL, "GL_RENDERER: {}", gpu_model); - Core::Telemetry().AddField(Telemetry::FieldType::UserSystem, "GPU_Vendor", gpu_vendor); - Core::Telemetry().AddField(Telemetry::FieldType::UserSystem, "GPU_Model", gpu_model); - Core::Telemetry().AddField(Telemetry::FieldType::UserSystem, "GPU_OpenGL_Version", gl_version); + auto& telemetry_session = Core::System::GetInstance().TelemetrySession(); + telemetry_session.AddField(Telemetry::FieldType::UserSystem, "GPU_Vendor", gpu_vendor); + telemetry_session.AddField(Telemetry::FieldType::UserSystem, "GPU_Model", gpu_model); + telemetry_session.AddField(Telemetry::FieldType::UserSystem, "GPU_OpenGL_Version", gl_version); if (!strcmp(gpu_vendor, "GDI Generic")) { return Core::System::ResultStatus::ErrorVideoCore_ErrorGenericDrivers;