From 07fd02f207fc4d5abb891fcfd40ba2e3f6f13baa Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Tue, 15 Sep 2020 03:13:10 -0700 Subject: rename Core/Analytics to Core/DolphinAnalytics --- Source/Core/Common/Analytics.h | 2 +- Source/Core/Core/Analytics.cpp | 415 ---------------------- Source/Core/Core/Analytics.h | 159 --------- Source/Core/Core/CMakeLists.txt | 270 +++++++------- Source/Core/Core/ConfigManager.cpp | 2 +- Source/Core/Core/Core.cpp | 2 +- Source/Core/Core/Core.vcxproj | 8 +- Source/Core/Core/Core.vcxproj.filters | 4 +- Source/Core/Core/DolphinAnalytics.cpp | 415 ++++++++++++++++++++++ Source/Core/Core/DolphinAnalytics.h | 159 +++++++++ Source/Core/Core/HW/DVD/DVDInterface.cpp | 2 +- Source/Core/Core/HW/WiimoteEmu/EmuSubroutines.cpp | 2 +- Source/Core/Core/IOS/DI/DI.cpp | 2 +- Source/Core/Core/IOS/Network/WD/Command.cpp | 2 +- Source/Core/Core/PowerPC/PPCCache.cpp | 2 +- Source/Core/DolphinNoGUI/MainNoGUI.cpp | 2 +- Source/Core/DolphinQt/Main.cpp | 2 +- Source/Core/DolphinQt/Settings/GeneralPane.cpp | 2 +- Source/Core/VideoCommon/RenderBase.cpp | 2 +- Source/Core/VideoCommon/VertexManagerBase.cpp | 2 +- 20 files changed, 728 insertions(+), 728 deletions(-) delete mode 100644 Source/Core/Core/Analytics.cpp delete mode 100644 Source/Core/Core/Analytics.h create mode 100644 Source/Core/Core/DolphinAnalytics.cpp create mode 100644 Source/Core/Core/DolphinAnalytics.h diff --git a/Source/Core/Common/Analytics.h b/Source/Core/Common/Analytics.h index b5d961d1d5..a49b6514f0 100644 --- a/Source/Core/Common/Analytics.h +++ b/Source/Core/Common/Analytics.h @@ -43,7 +43,7 @@ namespace Common { // Generic interface for an analytics reporting backends. The main -// implementation used in Dolphin can be found in Core/Analytics.h. +// implementation used in Dolphin can be found in Core/DolphinAnalytics.h. class AnalyticsReportingBackend { public: diff --git a/Source/Core/Core/Analytics.cpp b/Source/Core/Core/Analytics.cpp deleted file mode 100644 index a0b4fc2175..0000000000 --- a/Source/Core/Core/Analytics.cpp +++ /dev/null @@ -1,415 +0,0 @@ -#include "Core/Analytics.h" - -#include -#include -#include -#include -#include - -#include -#include - -#if defined(_WIN32) -#include -#elif defined(__APPLE__) -#include -#elif defined(ANDROID) -#include -#include "Common/AndroidAnalytics.h" -#endif - -#include "Common/Analytics.h" -#include "Common/CPUDetect.h" -#include "Common/CommonTypes.h" -#include "Common/Config/Config.h" -#include "Common/Random.h" -#include "Common/Timer.h" -#include "Common/Version.h" -#include "Core/Config/MainSettings.h" -#include "Core/ConfigManager.h" -#include "Core/HW/GCPad.h" -#include "Core/Movie.h" -#include "Core/NetPlayProto.h" -#include "InputCommon/GCAdapter.h" -#include "InputCommon/InputConfig.h" -#include "VideoCommon/VideoBackendBase.h" -#include "VideoCommon/VideoConfig.h" - -namespace -{ -constexpr char ANALYTICS_ENDPOINT[] = "https://analytics.dolphin-emu.org/report"; -} // namespace - -#if defined(ANDROID) -static std::function s_get_val_func; -void DolphinAnalytics::AndroidSetGetValFunc(std::function func) -{ - s_get_val_func = std::move(func); -} -#endif - -DolphinAnalytics::DolphinAnalytics() -{ - ReloadConfig(); - MakeBaseBuilder(); -} - -DolphinAnalytics& DolphinAnalytics::Instance() -{ - static DolphinAnalytics instance; - return instance; -} - -void DolphinAnalytics::ReloadConfig() -{ - std::lock_guard lk{m_reporter_mutex}; - - // Install the HTTP backend if analytics support is enabled. - std::unique_ptr new_backend; - if (Config::Get(Config::MAIN_ANALYTICS_ENABLED)) - { -#if defined(ANDROID) - new_backend = std::make_unique(ANALYTICS_ENDPOINT); -#else - new_backend = std::make_unique(ANALYTICS_ENDPOINT); -#endif - } - m_reporter.SetBackend(std::move(new_backend)); - - // Load the unique ID or generate it if needed. - m_unique_id = Config::Get(Config::MAIN_ANALYTICS_ID); - if (m_unique_id.empty()) - { - GenerateNewIdentity(); - } -} - -void DolphinAnalytics::GenerateNewIdentity() -{ - const u64 id_high = Common::Random::GenerateValue(); - const u64 id_low = Common::Random::GenerateValue(); - m_unique_id = fmt::format("{:016x}{:016x}", id_high, id_low); - - // Save the new id in the configuration. - Config::SetBase(Config::MAIN_ANALYTICS_ID, m_unique_id); - Config::Save(); -} - -std::string DolphinAnalytics::MakeUniqueId(std::string_view data) const -{ - std::array digest; - const auto input = std::string{m_unique_id}.append(data); - mbedtls_sha1_ret(reinterpret_cast(input.c_str()), input.size(), digest.data()); - - // Convert to hex string and truncate to 64 bits. - std::string out; - for (int i = 0; i < 8; ++i) - { - out += fmt::format("{:02x}", digest[i]); - } - return out; -} - -void DolphinAnalytics::ReportDolphinStart(std::string_view ui_type) -{ - Common::AnalyticsReportBuilder builder(m_base_builder); - builder.AddData("type", "dolphin-start"); - builder.AddData("ui-type", ui_type); - builder.AddData("id", MakeUniqueId("dolphin-start")); - Send(builder); -} - -void DolphinAnalytics::ReportGameStart() -{ - MakePerGameBuilder(); - - Common::AnalyticsReportBuilder builder(m_per_game_builder); - builder.AddData("type", "game-start"); - Send(builder); - - // Reset per-game state. - m_reported_quirks.fill(false); - InitializePerformanceSampling(); -} - -// Keep in sync with enum class GameQuirk definition. -constexpr std::array GAME_QUIRKS_NAMES{"icache-matters", - "directly-reads-wiimote-input", - "uses-DVDLowStopLaser", - "uses-DVDLowOffset", - "uses-DVDLowReadDiskBca", - "uses-DVDLowRequestDiscStatus", - "uses-DVDLowRequestRetryNumber", - "uses-DVDLowSerMeasControl", - "uses-different-partition-command", - "uses-di-interrupt-command", - "mismatched-gpu-texgens-between-xf-and-bp", - "mismatched-gpu-colors-between-xf-and-bp", - "uses-uncommon-wd-mode", - "uses-wd-unimplemented-ioctl"}; -static_assert(GAME_QUIRKS_NAMES.size() == static_cast(GameQuirk::COUNT), - "Game quirks names and enum definition are out of sync."); - -void DolphinAnalytics::ReportGameQuirk(GameQuirk quirk) -{ - u32 quirk_idx = static_cast(quirk); - - // Only report once per run. - if (m_reported_quirks[quirk_idx]) - return; - m_reported_quirks[quirk_idx] = true; - - Common::AnalyticsReportBuilder builder(m_per_game_builder); - builder.AddData("type", "quirk"); - builder.AddData("quirk", GAME_QUIRKS_NAMES[quirk_idx]); - Send(builder); -} - -void DolphinAnalytics::ReportPerformanceInfo(PerformanceSample&& sample) -{ - if (ShouldStartPerformanceSampling()) - { - m_sampling_performance_info = true; - } - - if (m_sampling_performance_info) - { - m_performance_samples.emplace_back(std::move(sample)); - } - - if (m_performance_samples.size() >= NUM_PERFORMANCE_SAMPLES_PER_REPORT) - { - std::vector speed_times_1000(m_performance_samples.size()); - std::vector num_prims(m_performance_samples.size()); - std::vector num_draw_calls(m_performance_samples.size()); - for (size_t i = 0; i < m_performance_samples.size(); ++i) - { - speed_times_1000[i] = static_cast(m_performance_samples[i].speed_ratio * 1000); - num_prims[i] = m_performance_samples[i].num_prims; - num_draw_calls[i] = m_performance_samples[i].num_draw_calls; - } - - // The per game builder should already exist -- there is no way we can be reporting performance - // info without a game start event having been generated. - Common::AnalyticsReportBuilder builder(m_per_game_builder); - builder.AddData("type", "performance"); - builder.AddData("speed", speed_times_1000); - builder.AddData("prims", num_prims); - builder.AddData("draw-calls", num_draw_calls); - - Send(builder); - - // Clear up and stop sampling until next time ShouldStartPerformanceSampling() says so. - m_performance_samples.clear(); - m_sampling_performance_info = false; - } -} - -void DolphinAnalytics::InitializePerformanceSampling() -{ - m_performance_samples.clear(); - m_sampling_performance_info = false; - - u64 wait_us = - PERFORMANCE_SAMPLING_INITIAL_WAIT_TIME_SECS * 1000000 + - Common::Random::GenerateValue() % (PERFORMANCE_SAMPLING_WAIT_TIME_JITTER_SECS * 1000000); - m_sampling_next_start_us = Common::Timer::GetTimeUs() + wait_us; -} - -bool DolphinAnalytics::ShouldStartPerformanceSampling() -{ - if (Common::Timer::GetTimeUs() < m_sampling_next_start_us) - return false; - - u64 wait_us = - PERFORMANCE_SAMPLING_INTERVAL_SECS * 1000000 + - Common::Random::GenerateValue() % (PERFORMANCE_SAMPLING_WAIT_TIME_JITTER_SECS * 1000000); - m_sampling_next_start_us = Common::Timer::GetTimeUs() + wait_us; - return true; -} - -void DolphinAnalytics::MakeBaseBuilder() -{ - Common::AnalyticsReportBuilder builder; - - // Version information. - builder.AddData("version-desc", Common::scm_desc_str); - builder.AddData("version-hash", Common::scm_rev_git_str); - builder.AddData("version-branch", Common::scm_branch_str); - builder.AddData("version-dist", Common::scm_distributor_str); - - // Auto-Update information. - builder.AddData("update-track", SConfig::GetInstance().m_auto_update_track); - - // CPU information. - builder.AddData("cpu-summary", cpu_info.Summarize()); - -// OS information. -#if defined(_WIN32) - builder.AddData("os-type", "windows"); - - // Windows 8 removes support for GetVersionEx and such. Stupid. - DWORD(WINAPI * RtlGetVersion)(LPOSVERSIONINFOEXW); - *(FARPROC*)&RtlGetVersion = GetProcAddress(GetModuleHandle(TEXT("ntdll")), "RtlGetVersion"); - - OSVERSIONINFOEXW winver; - winver.dwOSVersionInfoSize = sizeof(winver); - if (RtlGetVersion != nullptr) - { - RtlGetVersion(&winver); - builder.AddData("win-ver-major", static_cast(winver.dwMajorVersion)); - builder.AddData("win-ver-minor", static_cast(winver.dwMinorVersion)); - builder.AddData("win-ver-build", static_cast(winver.dwBuildNumber)); - builder.AddData("win-ver-spmajor", static_cast(winver.wServicePackMajor)); - builder.AddData("win-ver-spminor", static_cast(winver.wServicePackMinor)); - } -#elif defined(ANDROID) - builder.AddData("os-type", "android"); - builder.AddData("android-manufacturer", s_get_val_func("DEVICE_MANUFACTURER")); - builder.AddData("android-model", s_get_val_func("DEVICE_MODEL")); - builder.AddData("android-version", s_get_val_func("DEVICE_OS")); -#elif defined(__APPLE__) - builder.AddData("os-type", "osx"); - - // id processInfo = [NSProcessInfo processInfo] - id processInfo = reinterpret_cast(objc_msgSend)( - objc_getClass("NSProcessInfo"), sel_getUid("processInfo")); - if (processInfo) - { - struct OSVersion // NSOperatingSystemVersion - { - s64 major_version; // NSInteger majorVersion - s64 minor_version; // NSInteger minorVersion - s64 patch_version; // NSInteger patchVersion - }; - - // NSOperatingSystemVersion version = [processInfo operatingSystemVersion] - OSVersion version = reinterpret_cast(objc_msgSend_stret)( - processInfo, sel_getUid("operatingSystemVersion")); - - builder.AddData("osx-ver-major", version.major_version); - builder.AddData("osx-ver-minor", version.minor_version); - builder.AddData("osx-ver-bugfix", version.patch_version); - } -#elif defined(__linux__) - builder.AddData("os-type", "linux"); -#elif defined(__FreeBSD__) - builder.AddData("os-type", "freebsd"); -#elif defined(__OpenBSD__) - builder.AddData("os-type", "openbsd"); -#elif defined(__NetBSD__) - builder.AddData("os-type", "netbsd"); -#elif defined(__HAIKU__) - builder.AddData("os-type", "haiku"); -#else - builder.AddData("os-type", "unknown"); -#endif - - m_base_builder = builder; -} - -static const char* GetShaderCompilationMode(const VideoConfig& video_config) -{ - switch (video_config.iShaderCompilationMode) - { - case ShaderCompilationMode::AsynchronousUberShaders: - return "async-ubershaders"; - case ShaderCompilationMode::AsynchronousSkipRendering: - return "async-skip-rendering"; - case ShaderCompilationMode::SynchronousUberShaders: - return "sync-ubershaders"; - case ShaderCompilationMode::Synchronous: - default: - return "sync"; - } -} - -void DolphinAnalytics::MakePerGameBuilder() -{ - Common::AnalyticsReportBuilder builder(m_base_builder); - - // Gameid. - builder.AddData("gameid", SConfig::GetInstance().GetGameID()); - - // Unique id bound to the gameid. - builder.AddData("id", MakeUniqueId(SConfig::GetInstance().GetGameID())); - - // Configuration. - builder.AddData("cfg-dsp-hle", SConfig::GetInstance().bDSPHLE); - builder.AddData("cfg-dsp-jit", SConfig::GetInstance().m_DSPEnableJIT); - builder.AddData("cfg-dsp-thread", SConfig::GetInstance().bDSPThread); - builder.AddData("cfg-cpu-thread", SConfig::GetInstance().bCPUThread); - builder.AddData("cfg-fastmem", SConfig::GetInstance().bFastmem); - builder.AddData("cfg-syncgpu", SConfig::GetInstance().bSyncGPU); - builder.AddData("cfg-audio-backend", SConfig::GetInstance().sBackend); - builder.AddData("cfg-oc-enable", SConfig::GetInstance().m_OCEnable); - builder.AddData("cfg-oc-factor", SConfig::GetInstance().m_OCFactor); - builder.AddData("cfg-render-to-main", Config::Get(Config::MAIN_RENDER_TO_MAIN)); - if (g_video_backend) - { - builder.AddData("cfg-video-backend", g_video_backend->GetName()); - } - - // Video configuration. - builder.AddData("cfg-gfx-multisamples", g_Config.iMultisamples); - builder.AddData("cfg-gfx-ssaa", g_Config.bSSAA); - builder.AddData("cfg-gfx-anisotropy", g_Config.iMaxAnisotropy); - builder.AddData("cfg-gfx-vsync", g_Config.bVSync); - builder.AddData("cfg-gfx-aspect-ratio", static_cast(g_Config.aspect_mode)); - builder.AddData("cfg-gfx-efb-access", g_Config.bEFBAccessEnable); - builder.AddData("cfg-gfx-efb-copy-format-changes", g_Config.bEFBEmulateFormatChanges); - builder.AddData("cfg-gfx-efb-copy-ram", !g_Config.bSkipEFBCopyToRam); - builder.AddData("cfg-gfx-xfb-copy-ram", !g_Config.bSkipXFBCopyToRam); - builder.AddData("cfg-gfx-defer-efb-copies", g_Config.bDeferEFBCopies); - builder.AddData("cfg-gfx-immediate-xfb", !g_Config.bImmediateXFB); - builder.AddData("cfg-gfx-efb-copy-scaled", g_Config.bCopyEFBScaled); - builder.AddData("cfg-gfx-internal-resolution", g_Config.iEFBScale); - builder.AddData("cfg-gfx-tc-samples", g_Config.iSafeTextureCache_ColorSamples); - builder.AddData("cfg-gfx-stereo-mode", static_cast(g_Config.stereo_mode)); - builder.AddData("cfg-gfx-per-pixel-lighting", g_Config.bEnablePixelLighting); - builder.AddData("cfg-gfx-shader-compilation-mode", GetShaderCompilationMode(g_Config)); - builder.AddData("cfg-gfx-wait-for-shaders", g_Config.bWaitForShadersBeforeStarting); - builder.AddData("cfg-gfx-fast-depth", g_Config.bFastDepthCalc); - builder.AddData("cfg-gfx-vertex-rounding", g_Config.UseVertexRounding()); - - // GPU features. - if (g_Config.iAdapter < static_cast(g_Config.backend_info.Adapters.size())) - { - builder.AddData("gpu-adapter", g_Config.backend_info.Adapters[g_Config.iAdapter]); - } - else if (!g_Config.backend_info.AdapterName.empty()) - { - builder.AddData("gpu-adapter", g_Config.backend_info.AdapterName); - } - builder.AddData("gpu-has-exclusive-fullscreen", - g_Config.backend_info.bSupportsExclusiveFullscreen); - builder.AddData("gpu-has-dual-source-blend", g_Config.backend_info.bSupportsDualSourceBlend); - builder.AddData("gpu-has-primitive-restart", g_Config.backend_info.bSupportsPrimitiveRestart); - builder.AddData("gpu-has-oversized-viewports", g_Config.backend_info.bSupportsOversizedViewports); - builder.AddData("gpu-has-geometry-shaders", g_Config.backend_info.bSupportsGeometryShaders); - builder.AddData("gpu-has-3d-vision", g_Config.backend_info.bSupports3DVision); - builder.AddData("gpu-has-early-z", g_Config.backend_info.bSupportsEarlyZ); - builder.AddData("gpu-has-binding-layout", g_Config.backend_info.bSupportsBindingLayout); - builder.AddData("gpu-has-bbox", g_Config.backend_info.bSupportsBBox); - builder.AddData("gpu-has-fragment-stores-and-atomics", - g_Config.backend_info.bSupportsFragmentStoresAndAtomics); - builder.AddData("gpu-has-gs-instancing", g_Config.backend_info.bSupportsGSInstancing); - builder.AddData("gpu-has-post-processing", g_Config.backend_info.bSupportsPostProcessing); - builder.AddData("gpu-has-palette-conversion", g_Config.backend_info.bSupportsPaletteConversion); - builder.AddData("gpu-has-clip-control", g_Config.backend_info.bSupportsClipControl); - builder.AddData("gpu-has-ssaa", g_Config.backend_info.bSupportsSSAA); - - // NetPlay / recording. - builder.AddData("netplay", NetPlay::IsNetPlayRunning()); - builder.AddData("movie", Movie::IsMovieActive()); - - // Controller information - // We grab enough to tell what percentage of our users are playing with keyboard/mouse, some kind - // of gamepad - // or the official gamecube adapter. - builder.AddData("gcadapter-detected", GCAdapter::IsDetected(nullptr)); - builder.AddData("has-controller", Pad::GetConfig()->IsControllerControlledByGamepadDevice(0) || - GCAdapter::IsDetected(nullptr)); - - m_per_game_builder = builder; -} diff --git a/Source/Core/Core/Analytics.h b/Source/Core/Core/Analytics.h deleted file mode 100644 index 6416257b93..0000000000 --- a/Source/Core/Core/Analytics.h +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2016 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#pragma once - -#include -#include -#include -#include -#include -#include - -#include "Common/Analytics.h" -#include "Common/CommonTypes.h" - -#if defined(ANDROID) -#include -#endif -// Non generic part of the Dolphin Analytics framework. See Common/Analytics.h -// for the main documentation. - -enum class GameQuirk -{ - // Sometimes code run from ICache is different from its mirror in RAM. - ICACHE_MATTERS = 0, - - // The Wii remote hardware makes it possible to bypass normal data reporting and directly - // "read" extension or IR data. This would break our current TAS/NetPlay implementation. - DIRECTLY_READS_WIIMOTE_INPUT, - - // Several Wii DI commands that are rarely/never used and not implemented by Dolphin - USES_DVD_LOW_STOP_LASER, - USES_DVD_LOW_OFFSET, - USES_DVD_LOW_READ_DISK_BCA, // NSMBW known to use this - USES_DVD_LOW_REQUEST_DISC_STATUS, - USES_DVD_LOW_REQUEST_RETRY_NUMBER, - USES_DVD_LOW_SER_MEAS_CONTROL, - - // Dolphin only implements the simple DVDLowOpenPartition, not any of the variants where some - // already-read data is provided - USES_DIFFERENT_PARTITION_COMMAND, - - // IOS has implementations for ioctls 0x85 and 0x89 and a stub for 0x87, but - // DVDLowMaskCoverInterrupt/DVDLowUnmaskCoverInterrupt/DVDLowUnmaskStatusInterrupts - // are all stubbed on the PPC side so they presumably will never be used. - // (DVDLowClearCoverInterrupt is used, though) - USES_DI_INTERRUPT_MASK_COMMAND, - - // Some games configure a mismatched number of texture coordinates or colors between the transform - // and TEV/BP stages of the rendering pipeline. Currently, Dolphin just skips over these objects - // as the hardware renderers are not equipped to handle the case where the registers between - // stages are mismatched. - MISMATCHED_GPU_TEXGENS_BETWEEN_XF_AND_BP, - MISMATCHED_GPU_COLORS_BETWEEN_XF_AND_BP, - - // The WD module can be configured to operate in six different modes. - // In practice, only mode 1 (DS communications) and mode 3 (AOSS access point scanning) - // are used by games and the system menu respectively. - USES_UNCOMMON_WD_MODE, - - USES_WD_UNIMPLEMENTED_IOCTL, - - COUNT, -}; - -class DolphinAnalytics -{ -public: - // Performs lazy-initialization of a singleton and returns the instance. - static DolphinAnalytics& Instance(); - -#if defined(ANDROID) - // Get value from java. - static void AndroidSetGetValFunc(std::function function); -#endif - // Resets and recreates the analytics system in order to reload - // configuration. - void ReloadConfig(); - // Rotates the unique identifier used for this instance of Dolphin and saves - // it into the configuration. - void GenerateNewIdentity(); - - // Reports a Dolphin start event. - void ReportDolphinStart(std::string_view ui_type); - - // Generates a base report for a "Game start" event. Also preseeds the - // per-game base data. - void ReportGameStart(); - - // Generates a report for a special condition being hit by a game. This is automatically throttled - // to once per game run. - void ReportGameQuirk(GameQuirk quirk); - - struct PerformanceSample - { - double speed_ratio; // See SystemTimers::GetEstimatedEmulationPerformance(). - int num_prims; - int num_draw_calls; - }; - // Reports performance information. This method performs its own throttling / aggregation -- - // calling it does not guarantee when a report will actually be sent. - // - // This method is NOT thread-safe. - void ReportPerformanceInfo(PerformanceSample&& sample); - - // Forward Send method calls to the reporter. - template - void Send(T report) - { - std::lock_guard lk{m_reporter_mutex}; - m_reporter.Send(report); - } - -private: - DolphinAnalytics(); - - void MakeBaseBuilder(); - void MakePerGameBuilder(); - - // Returns a unique ID derived on the global unique ID, hashed with some - // report-specific data. This avoid correlation between different types of - // events. - std::string MakeUniqueId(std::string_view data) const; - - // Unique ID. This should never leave the application. Only used derived - // values created by MakeUniqueId. - std::string m_unique_id; - - // Performance sampling configuration constants. - // - // 5min after startup + rand(0, 3min) jitter time, collect performance for 100 frames in a row. - // Repeat collection after 30min + rand(0, 3min). - static constexpr int NUM_PERFORMANCE_SAMPLES_PER_REPORT = 100; - static constexpr int PERFORMANCE_SAMPLING_INITIAL_WAIT_TIME_SECS = 300; - static constexpr int PERFORMANCE_SAMPLING_WAIT_TIME_JITTER_SECS = 180; - static constexpr int PERFORMANCE_SAMPLING_INTERVAL_SECS = 1800; - - // Performance sampling state & internal helpers. - void InitializePerformanceSampling(); // Called on game start / title switch. - bool ShouldStartPerformanceSampling(); - u64 m_sampling_next_start_us; // Next timestamp (in us) at which to trigger sampling. - bool m_sampling_performance_info = false; // Whether we are currently collecting samples. - std::vector m_performance_samples; - - // What quirks have already been reported about the current game. - std::array(GameQuirk::COUNT)> m_reported_quirks; - - // Builder that contains all non variable data that should be sent with all - // reports. - Common::AnalyticsReportBuilder m_base_builder; - - // Builder that contains per game data and is initialized when a game start - // report is sent. - Common::AnalyticsReportBuilder m_per_game_builder; - - std::mutex m_reporter_mutex; - Common::AnalyticsReporter m_reporter; -}; diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt index 715945a319..df9a6a1834 100644 --- a/Source/Core/Core/CMakeLists.txt +++ b/Source/Core/Core/CMakeLists.txt @@ -1,67 +1,21 @@ add_library(core ActionReplay.cpp ActionReplay.h - Analytics.cpp - Analytics.h ARDecrypt.cpp ARDecrypt.h - BootManager.cpp - BootManager.h - CheatCodes.h - CommonTitles.h - ConfigManager.cpp - ConfigManager.h - Core.cpp - Core.h - CoreTiming.cpp - CoreTiming.h - DSPEmulator.cpp - DSPEmulator.h - FreeLookConfig.cpp - FreeLookConfig.h - FreeLookManager.cpp - FreeLookManager.h - GeckoCodeConfig.cpp - GeckoCodeConfig.h - GeckoCode.cpp - GeckoCode.h - Host.h - HotkeyManager.cpp - HotkeyManager.h - LibusbUtils.cpp - LibusbUtils.h - MemTools.cpp - MemTools.h - Movie.cpp - Movie.h - NetPlayClient.cpp - NetPlayClient.h - NetPlayServer.cpp - NetPlayServer.h - PatchEngine.cpp - PatchEngine.h - State.cpp - State.h - SyncIdentifier.h - SysConf.cpp - SysConf.h - System.cpp - System.h - TitleDatabase.cpp - TitleDatabase.h - WiiRoot.cpp - WiiRoot.h - WiiUtils.cpp - WiiUtils.h Boot/Boot_BS2Emu.cpp + Boot/Boot_WiiWAD.cpp Boot/Boot.cpp Boot/Boot.h - Boot/Boot_WiiWAD.cpp Boot/DolReader.cpp Boot/DolReader.h Boot/ElfReader.cpp Boot/ElfReader.h Boot/ElfTypes.h + BootManager.cpp + BootManager.h + CheatCodes.h + CommonTitles.h Config/FreeLookSettings.cpp Config/FreeLookSettings.h Config/GraphicsSettings.cpp @@ -84,6 +38,12 @@ add_library(core ConfigLoaders/MovieConfigLoader.h ConfigLoaders/NetPlayConfigLoader.cpp ConfigLoaders/NetPlayConfigLoader.h + ConfigManager.cpp + ConfigManager.h + Core.cpp + Core.h + CoreTiming.cpp + CoreTiming.h Debugger/Debugger_SymbolMap.cpp Debugger/Debugger_SymbolMap.h Debugger/Dump.cpp @@ -95,6 +55,8 @@ add_library(core Debugger/PPCDebugInterface.h Debugger/RSO.cpp Debugger/RSO.h + DolphinAnalytics.cpp + DolphinAnalytics.h DSP/DSPAccelerator.cpp DSP/DSPAccelerator.h DSP/DSPAnalyzer.cpp @@ -115,8 +77,6 @@ add_library(core DSP/DSPStacks.cpp DSP/DSPTables.cpp DSP/DSPTables.h - DSP/LabelMap.cpp - DSP/LabelMap.h DSP/Interpreter/DSPIntArithmetic.cpp DSP/Interpreter/DSPIntBranch.cpp DSP/Interpreter/DSPIntCCUtil.h @@ -131,6 +91,10 @@ add_library(core DSP/Interpreter/DSPIntUtil.h DSP/Jit/DSPEmitterBase.cpp DSP/Jit/DSPEmitterBase.h + DSP/LabelMap.cpp + DSP/LabelMap.h + DSPEmulator.cpp + DSPEmulator.h FifoPlayer/FifoAnalyzer.cpp FifoPlayer/FifoAnalyzer.h FifoPlayer/FifoDataFile.cpp @@ -143,14 +107,25 @@ add_library(core FifoPlayer/FifoRecordAnalyzer.h FifoPlayer/FifoRecorder.cpp FifoPlayer/FifoRecorder.h - HLE/HLE.cpp - HLE/HLE.h + FreeLookConfig.cpp + FreeLookConfig.h + FreeLookManager.cpp + FreeLookManager.h + GeckoCode.cpp + GeckoCode.h + GeckoCodeConfig.cpp + GeckoCodeConfig.h HLE/HLE_Misc.cpp HLE/HLE_Misc.h HLE/HLE_OS.cpp HLE/HLE_OS.h HLE/HLE_VarArgs.cpp HLE/HLE_VarArgs.h + HLE/HLE.cpp + HLE/HLE.h + Host.h + HotkeyManager.cpp + HotkeyManager.h HW/AddressSpace.cpp HW/AddressSpace.h HW/AudioInterface.cpp @@ -159,6 +134,10 @@ add_library(core HW/CPU.h HW/DSP.cpp HW/DSP.h + HW/DSPHLE/DSPHLE.cpp + HW/DSPHLE/DSPHLE.h + HW/DSPHLE/MailHandler.cpp + HW/DSPHLE/MailHandler.h HW/DSPHLE/UCodes/AX.cpp HW/DSPHLE/UCodes/AX.h HW/DSPHLE/UCodes/AXStructs.h @@ -177,17 +156,13 @@ add_library(core HW/DSPHLE/UCodes/UCodes.h HW/DSPHLE/UCodes/Zelda.cpp HW/DSPHLE/UCodes/Zelda.h - HW/DSPHLE/MailHandler.cpp - HW/DSPHLE/MailHandler.h - HW/DSPHLE/DSPHLE.cpp - HW/DSPHLE/DSPHLE.h HW/DSPLLE/DSPHost.cpp - HW/DSPLLE/DSPSymbols.cpp - HW/DSPLLE/DSPSymbols.h - HW/DSPLLE/DSPLLEGlobals.cpp - HW/DSPLLE/DSPLLEGlobals.h HW/DSPLLE/DSPLLE.cpp HW/DSPLLE/DSPLLE.h + HW/DSPLLE/DSPLLEGlobals.cpp + HW/DSPLLE/DSPLLEGlobals.h + HW/DSPLLE/DSPSymbols.cpp + HW/DSPLLE/DSPSymbols.h HW/DVD/DVDInterface.cpp HW/DVD/DVDInterface.h HW/DVD/DVDMath.cpp @@ -196,8 +171,6 @@ add_library(core HW/DVD/DVDThread.h HW/DVD/FileMonitor.cpp HW/DVD/FileMonitor.h - HW/EXI/EXI.cpp - HW/EXI/EXI.h HW/EXI/EXI_Channel.cpp HW/EXI/EXI_Channel.h HW/EXI/EXI_Device.cpp @@ -218,6 +191,8 @@ add_library(core HW/EXI/EXI_DeviceMemoryCard.h HW/EXI/EXI_DeviceMic.cpp HW/EXI/EXI_DeviceMic.h + HW/EXI/EXI.cpp + HW/EXI/EXI.h HW/GCKeyboard.cpp HW/GCKeyboard.h HW/GCKeyboardEmu.cpp @@ -249,8 +224,6 @@ add_library(core HW/MMIO.h HW/ProcessorInterface.cpp HW/ProcessorInterface.h - HW/SI/SI.cpp - HW/SI/SI.h HW/SI/SI_Device.cpp HW/SI/SI_Device.h HW/SI/SI_DeviceDanceMat.cpp @@ -267,6 +240,8 @@ add_library(core HW/SI/SI_DeviceKeyboard.h HW/SI/SI_DeviceNull.cpp HW/SI/SI_DeviceNull.h + HW/SI/SI.cpp + HW/SI/SI.h HW/Sram.cpp HW/Sram.h HW/StreamADPCM.cpp @@ -291,16 +266,6 @@ add_library(core HW/WiimoteEmu/EmuSubroutines.cpp HW/WiimoteEmu/Encryption.cpp HW/WiimoteEmu/Encryption.h - HW/WiimoteEmu/ExtensionPort.cpp - HW/WiimoteEmu/ExtensionPort.h - HW/WiimoteEmu/I2CBus.cpp - HW/WiimoteEmu/I2CBus.h - HW/WiimoteEmu/MotionPlus.cpp - HW/WiimoteEmu/MotionPlus.h - HW/WiimoteEmu/Speaker.cpp - HW/WiimoteEmu/Speaker.h - HW/WiimoteEmu/WiimoteEmu.cpp - HW/WiimoteEmu/WiimoteEmu.h HW/WiimoteEmu/Extension/Classic.cpp HW/WiimoteEmu/Extension/Classic.h HW/WiimoteEmu/Extension/DrawsomeTablet.cpp @@ -309,16 +274,26 @@ add_library(core HW/WiimoteEmu/Extension/Drums.h HW/WiimoteEmu/Extension/Extension.cpp HW/WiimoteEmu/Extension/Extension.h - HW/WiimoteEmu/Extension/Nunchuk.cpp - HW/WiimoteEmu/Extension/Nunchuk.h HW/WiimoteEmu/Extension/Guitar.cpp HW/WiimoteEmu/Extension/Guitar.h + HW/WiimoteEmu/Extension/Nunchuk.cpp + HW/WiimoteEmu/Extension/Nunchuk.h HW/WiimoteEmu/Extension/TaTaCon.cpp HW/WiimoteEmu/Extension/TaTaCon.h HW/WiimoteEmu/Extension/Turntable.cpp HW/WiimoteEmu/Extension/Turntable.h HW/WiimoteEmu/Extension/UDrawTablet.cpp HW/WiimoteEmu/Extension/UDrawTablet.h + HW/WiimoteEmu/ExtensionPort.cpp + HW/WiimoteEmu/ExtensionPort.h + HW/WiimoteEmu/I2CBus.cpp + HW/WiimoteEmu/I2CBus.h + HW/WiimoteEmu/MotionPlus.cpp + HW/WiimoteEmu/MotionPlus.h + HW/WiimoteEmu/Speaker.cpp + HW/WiimoteEmu/Speaker.h + HW/WiimoteEmu/WiimoteEmu.cpp + HW/WiimoteEmu/WiimoteEmu.h HW/WiimoteReal/WiimoteReal.cpp HW/WiimoteReal/WiimoteReal.h HW/WiiSave.cpp @@ -328,18 +303,10 @@ add_library(core IOS/Device.h IOS/DeviceStub.cpp IOS/DeviceStub.h - IOS/DolphinDevice.cpp - IOS/DolphinDevice.h - IOS/IOS.cpp - IOS/IOS.h - IOS/IOSC.cpp - IOS/IOSC.h - IOS/MIOS.cpp - IOS/MIOS.h - IOS/VersionInfo.cpp - IOS/VersionInfo.h IOS/DI/DI.cpp IOS/DI/DI.h + IOS/DolphinDevice.cpp + IOS/DolphinDevice.h IOS/ES/ES.cpp IOS/ES/ES.h IOS/ES/Formats.cpp @@ -357,14 +324,14 @@ add_library(core IOS/FS/HostBackend/File.cpp IOS/FS/HostBackend/FS.cpp IOS/FS/HostBackend/FS.h + IOS/IOS.cpp + IOS/IOS.h + IOS/IOSC.cpp + IOS/IOSC.h + IOS/MIOS.cpp + IOS/MIOS.h IOS/Network/ICMP.h IOS/Network/ICMPLin.cpp - IOS/Network/MACUtils.cpp - IOS/Network/MACUtils.h - IOS/Network/Socket.cpp - IOS/Network/Socket.h - IOS/Network/SSL.cpp - IOS/Network/SSL.h IOS/Network/IP/Top.cpp IOS/Network/IP/Top.h IOS/Network/KD/NetKDRequest.cpp @@ -373,16 +340,34 @@ add_library(core IOS/Network/KD/NetKDTime.h IOS/Network/KD/NWC24Config.cpp IOS/Network/KD/NWC24Config.h - IOS/Network/NCD/WiiNetConfig.cpp - IOS/Network/NCD/WiiNetConfig.h + IOS/Network/MACUtils.cpp + IOS/Network/MACUtils.h IOS/Network/NCD/Manage.cpp IOS/Network/NCD/Manage.h + IOS/Network/NCD/WiiNetConfig.cpp + IOS/Network/NCD/WiiNetConfig.h + IOS/Network/Socket.cpp + IOS/Network/Socket.h + IOS/Network/SSL.cpp + IOS/Network/SSL.h IOS/Network/WD/Command.cpp IOS/Network/WD/Command.h IOS/SDIO/SDIOSlot0.cpp IOS/SDIO/SDIOSlot0.h IOS/STM/STM.cpp IOS/STM/STM.h + IOS/USB/Bluetooth/BTBase.cpp + IOS/USB/Bluetooth/BTBase.h + IOS/USB/Bluetooth/BTEmu.cpp + IOS/USB/Bluetooth/BTEmu.h + IOS/USB/Bluetooth/BTStub.cpp + IOS/USB/Bluetooth/BTStub.h + IOS/USB/Bluetooth/hci.h + IOS/USB/Bluetooth/l2cap.h + IOS/USB/Bluetooth/WiimoteDevice.cpp + IOS/USB/Bluetooth/WiimoteDevice.h + IOS/USB/Bluetooth/WiimoteHIDAttr.cpp + IOS/USB/Bluetooth/WiimoteHIDAttr.h IOS/USB/Common.cpp IOS/USB/Common.h IOS/USB/Host.cpp @@ -395,6 +380,8 @@ add_library(core IOS/USB/USB_HID/HIDv4.h IOS/USB/USB_HID/HIDv5.cpp IOS/USB/USB_HID/HIDv5.h + IOS/USB/USB_KBD.cpp + IOS/USB/USB_KBD.h IOS/USB/USB_VEN/VEN.cpp IOS/USB/USB_VEN/VEN.h IOS/USB/USBV0.cpp @@ -403,28 +390,50 @@ add_library(core IOS/USB/USBV4.h IOS/USB/USBV5.cpp IOS/USB/USBV5.h - IOS/USB/USB_KBD.cpp - IOS/USB/USB_KBD.h - IOS/USB/Bluetooth/BTBase.cpp - IOS/USB/Bluetooth/BTBase.h - IOS/USB/Bluetooth/BTEmu.cpp - IOS/USB/Bluetooth/BTEmu.h - IOS/USB/Bluetooth/BTStub.cpp - IOS/USB/Bluetooth/BTStub.h - IOS/USB/Bluetooth/hci.h - IOS/USB/Bluetooth/l2cap.h - IOS/USB/Bluetooth/WiimoteDevice.cpp - IOS/USB/Bluetooth/WiimoteDevice.h - IOS/USB/Bluetooth/WiimoteHIDAttr.cpp - IOS/USB/Bluetooth/WiimoteHIDAttr.h - IOS/WFS/WFSSRV.cpp - IOS/WFS/WFSSRV.h + IOS/VersionInfo.cpp + IOS/VersionInfo.h IOS/WFS/WFSI.cpp IOS/WFS/WFSI.h + IOS/WFS/WFSSRV.cpp + IOS/WFS/WFSSRV.h + LibusbUtils.cpp + LibusbUtils.h + MemTools.cpp + MemTools.h + Movie.cpp + Movie.h + NetPlayClient.cpp + NetPlayClient.h + NetPlayServer.cpp + NetPlayServer.h + PatchEngine.cpp + PatchEngine.h PowerPC/BreakPoints.cpp PowerPC/BreakPoints.h + PowerPC/CachedInterpreter/CachedInterpreter.cpp + PowerPC/CachedInterpreter/CachedInterpreter.h + PowerPC/CachedInterpreter/InterpreterBlockCache.cpp + PowerPC/CachedInterpreter/InterpreterBlockCache.h PowerPC/ConditionRegister.cpp PowerPC/ConditionRegister.h + PowerPC/Interpreter/ExceptionUtils.h + PowerPC/Interpreter/Interpreter_Branch.cpp + PowerPC/Interpreter/Interpreter_FloatingPoint.cpp + PowerPC/Interpreter/Interpreter_FPUtils.h + PowerPC/Interpreter/Interpreter_Integer.cpp + PowerPC/Interpreter/Interpreter_LoadStore.cpp + PowerPC/Interpreter/Interpreter_LoadStorePaired.cpp + PowerPC/Interpreter/Interpreter_Paired.cpp + PowerPC/Interpreter/Interpreter_SystemRegisters.cpp + PowerPC/Interpreter/Interpreter_Tables.cpp + PowerPC/Interpreter/Interpreter.cpp + PowerPC/Interpreter/Interpreter.h + PowerPC/JitCommon/JitAsmCommon.cpp + PowerPC/JitCommon/JitAsmCommon.h + PowerPC/JitCommon/JitBase.cpp + PowerPC/JitCommon/JitBase.h + PowerPC/JitCommon/JitCache.cpp + PowerPC/JitCommon/JitCache.h PowerPC/JitInterface.cpp PowerPC/JitInterface.h PowerPC/MMU.cpp @@ -440,16 +449,6 @@ add_library(core PowerPC/PPCTables.cpp PowerPC/PPCTables.h PowerPC/Profiler.h - PowerPC/CachedInterpreter/CachedInterpreter.cpp - PowerPC/CachedInterpreter/CachedInterpreter.h - PowerPC/CachedInterpreter/InterpreterBlockCache.cpp - PowerPC/CachedInterpreter/InterpreterBlockCache.h - PowerPC/JitCommon/JitAsmCommon.cpp - PowerPC/JitCommon/JitAsmCommon.h - PowerPC/JitCommon/JitBase.cpp - PowerPC/JitCommon/JitBase.h - PowerPC/JitCommon/JitCache.cpp - PowerPC/JitCommon/JitCache.h PowerPC/SignatureDB/CSVSignatureDB.cpp PowerPC/SignatureDB/CSVSignatureDB.h PowerPC/SignatureDB/DSYSignatureDB.cpp @@ -458,18 +457,19 @@ add_library(core PowerPC/SignatureDB/MEGASignatureDB.h PowerPC/SignatureDB/SignatureDB.cpp PowerPC/SignatureDB/SignatureDB.h - PowerPC/Interpreter/ExceptionUtils.h - PowerPC/Interpreter/Interpreter_Branch.cpp - PowerPC/Interpreter/Interpreter.cpp - PowerPC/Interpreter/Interpreter.h - PowerPC/Interpreter/Interpreter_FloatingPoint.cpp - PowerPC/Interpreter/Interpreter_FPUtils.h - PowerPC/Interpreter/Interpreter_Integer.cpp - PowerPC/Interpreter/Interpreter_LoadStore.cpp - PowerPC/Interpreter/Interpreter_LoadStorePaired.cpp - PowerPC/Interpreter/Interpreter_Paired.cpp - PowerPC/Interpreter/Interpreter_SystemRegisters.cpp - PowerPC/Interpreter/Interpreter_Tables.cpp + State.cpp + State.h + SyncIdentifier.h + SysConf.cpp + SysConf.h + System.cpp + System.h + TitleDatabase.cpp + TitleDatabase.h + WiiRoot.cpp + WiiRoot.h + WiiUtils.cpp + WiiUtils.h ) if(_M_X86) diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp index d68c215998..472a54a99e 100644 --- a/Source/Core/Core/ConfigManager.cpp +++ b/Source/Core/Core/ConfigManager.cpp @@ -28,13 +28,13 @@ #include "Common/StringUtil.h" #include "Common/scmrev.h" -#include "Core/Analytics.h" #include "Core/Boot/Boot.h" #include "Core/CommonTitles.h" #include "Core/Config/MainSettings.h" #include "Core/Config/SYSCONFSettings.h" #include "Core/ConfigLoaders/GameConfigLoader.h" #include "Core/Core.h" +#include "Core/DolphinAnalytics.h" #include "Core/FifoPlayer/FifoDataFile.h" #include "Core/HLE/HLE.h" #include "Core/HW/DVD/DVDInterface.h" diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 8bd48aff74..88bb42579b 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -36,12 +36,12 @@ #include "Common/Timer.h" #include "Common/Version.h" -#include "Core/Analytics.h" #include "Core/Boot/Boot.h" #include "Core/BootManager.h" #include "Core/ConfigManager.h" #include "Core/CoreTiming.h" #include "Core/DSPEmulator.h" +#include "Core/DolphinAnalytics.h" #include "Core/FifoPlayer/FifoPlayer.h" #include "Core/FreeLookManager.h" #include "Core/HLE/HLE.h" diff --git a/Source/Core/Core/Core.vcxproj b/Source/Core/Core/Core.vcxproj index efcec09564..78e8cd3c9c 100644 --- a/Source/Core/Core/Core.vcxproj +++ b/Source/Core/Core/Core.vcxproj @@ -17,7 +17,6 @@ - @@ -44,7 +43,7 @@ - + @@ -77,6 +76,7 @@ + @@ -380,7 +380,6 @@ - @@ -408,7 +407,7 @@ - + @@ -429,6 +428,7 @@ + diff --git a/Source/Core/Core/Core.vcxproj.filters b/Source/Core/Core/Core.vcxproj.filters index a30d217970..ba664ef409 100644 --- a/Source/Core/Core/Core.vcxproj.filters +++ b/Source/Core/Core/Core.vcxproj.filters @@ -683,7 +683,7 @@ PowerPC\Jit64Common - + PowerPC\SignatureDB @@ -1475,7 +1475,7 @@ PowerPC\Jit64Common - + PowerPC\SignatureDB diff --git a/Source/Core/Core/DolphinAnalytics.cpp b/Source/Core/Core/DolphinAnalytics.cpp new file mode 100644 index 0000000000..81dbc16643 --- /dev/null +++ b/Source/Core/Core/DolphinAnalytics.cpp @@ -0,0 +1,415 @@ +#include "Core/DolphinAnalytics.h" + +#include +#include +#include +#include +#include + +#include +#include + +#if defined(_WIN32) +#include +#elif defined(__APPLE__) +#include +#elif defined(ANDROID) +#include +#include "Common/AndroidAnalytics.h" +#endif + +#include "Common/Analytics.h" +#include "Common/CPUDetect.h" +#include "Common/CommonTypes.h" +#include "Common/Config/Config.h" +#include "Common/Random.h" +#include "Common/Timer.h" +#include "Common/Version.h" +#include "Core/Config/MainSettings.h" +#include "Core/ConfigManager.h" +#include "Core/HW/GCPad.h" +#include "Core/Movie.h" +#include "Core/NetPlayProto.h" +#include "InputCommon/GCAdapter.h" +#include "InputCommon/InputConfig.h" +#include "VideoCommon/VideoBackendBase.h" +#include "VideoCommon/VideoConfig.h" + +namespace +{ +constexpr char ANALYTICS_ENDPOINT[] = "https://analytics.dolphin-emu.org/report"; +} // namespace + +#if defined(ANDROID) +static std::function s_get_val_func; +void DolphinAnalytics::AndroidSetGetValFunc(std::function func) +{ + s_get_val_func = std::move(func); +} +#endif + +DolphinAnalytics::DolphinAnalytics() +{ + ReloadConfig(); + MakeBaseBuilder(); +} + +DolphinAnalytics& DolphinAnalytics::Instance() +{ + static DolphinAnalytics instance; + return instance; +} + +void DolphinAnalytics::ReloadConfig() +{ + std::lock_guard lk{m_reporter_mutex}; + + // Install the HTTP backend if analytics support is enabled. + std::unique_ptr new_backend; + if (Config::Get(Config::MAIN_ANALYTICS_ENABLED)) + { +#if defined(ANDROID) + new_backend = std::make_unique(ANALYTICS_ENDPOINT); +#else + new_backend = std::make_unique(ANALYTICS_ENDPOINT); +#endif + } + m_reporter.SetBackend(std::move(new_backend)); + + // Load the unique ID or generate it if needed. + m_unique_id = Config::Get(Config::MAIN_ANALYTICS_ID); + if (m_unique_id.empty()) + { + GenerateNewIdentity(); + } +} + +void DolphinAnalytics::GenerateNewIdentity() +{ + const u64 id_high = Common::Random::GenerateValue(); + const u64 id_low = Common::Random::GenerateValue(); + m_unique_id = fmt::format("{:016x}{:016x}", id_high, id_low); + + // Save the new id in the configuration. + Config::SetBase(Config::MAIN_ANALYTICS_ID, m_unique_id); + Config::Save(); +} + +std::string DolphinAnalytics::MakeUniqueId(std::string_view data) const +{ + std::array digest; + const auto input = std::string{m_unique_id}.append(data); + mbedtls_sha1_ret(reinterpret_cast(input.c_str()), input.size(), digest.data()); + + // Convert to hex string and truncate to 64 bits. + std::string out; + for (int i = 0; i < 8; ++i) + { + out += fmt::format("{:02x}", digest[i]); + } + return out; +} + +void DolphinAnalytics::ReportDolphinStart(std::string_view ui_type) +{ + Common::AnalyticsReportBuilder builder(m_base_builder); + builder.AddData("type", "dolphin-start"); + builder.AddData("ui-type", ui_type); + builder.AddData("id", MakeUniqueId("dolphin-start")); + Send(builder); +} + +void DolphinAnalytics::ReportGameStart() +{ + MakePerGameBuilder(); + + Common::AnalyticsReportBuilder builder(m_per_game_builder); + builder.AddData("type", "game-start"); + Send(builder); + + // Reset per-game state. + m_reported_quirks.fill(false); + InitializePerformanceSampling(); +} + +// Keep in sync with enum class GameQuirk definition. +constexpr std::array GAME_QUIRKS_NAMES{"icache-matters", + "directly-reads-wiimote-input", + "uses-DVDLowStopLaser", + "uses-DVDLowOffset", + "uses-DVDLowReadDiskBca", + "uses-DVDLowRequestDiscStatus", + "uses-DVDLowRequestRetryNumber", + "uses-DVDLowSerMeasControl", + "uses-different-partition-command", + "uses-di-interrupt-command", + "mismatched-gpu-texgens-between-xf-and-bp", + "mismatched-gpu-colors-between-xf-and-bp", + "uses-uncommon-wd-mode", + "uses-wd-unimplemented-ioctl"}; +static_assert(GAME_QUIRKS_NAMES.size() == static_cast(GameQuirk::COUNT), + "Game quirks names and enum definition are out of sync."); + +void DolphinAnalytics::ReportGameQuirk(GameQuirk quirk) +{ + u32 quirk_idx = static_cast(quirk); + + // Only report once per run. + if (m_reported_quirks[quirk_idx]) + return; + m_reported_quirks[quirk_idx] = true; + + Common::AnalyticsReportBuilder builder(m_per_game_builder); + builder.AddData("type", "quirk"); + builder.AddData("quirk", GAME_QUIRKS_NAMES[quirk_idx]); + Send(builder); +} + +void DolphinAnalytics::ReportPerformanceInfo(PerformanceSample&& sample) +{ + if (ShouldStartPerformanceSampling()) + { + m_sampling_performance_info = true; + } + + if (m_sampling_performance_info) + { + m_performance_samples.emplace_back(std::move(sample)); + } + + if (m_performance_samples.size() >= NUM_PERFORMANCE_SAMPLES_PER_REPORT) + { + std::vector speed_times_1000(m_performance_samples.size()); + std::vector num_prims(m_performance_samples.size()); + std::vector num_draw_calls(m_performance_samples.size()); + for (size_t i = 0; i < m_performance_samples.size(); ++i) + { + speed_times_1000[i] = static_cast(m_performance_samples[i].speed_ratio * 1000); + num_prims[i] = m_performance_samples[i].num_prims; + num_draw_calls[i] = m_performance_samples[i].num_draw_calls; + } + + // The per game builder should already exist -- there is no way we can be reporting performance + // info without a game start event having been generated. + Common::AnalyticsReportBuilder builder(m_per_game_builder); + builder.AddData("type", "performance"); + builder.AddData("speed", speed_times_1000); + builder.AddData("prims", num_prims); + builder.AddData("draw-calls", num_draw_calls); + + Send(builder); + + // Clear up and stop sampling until next time ShouldStartPerformanceSampling() says so. + m_performance_samples.clear(); + m_sampling_performance_info = false; + } +} + +void DolphinAnalytics::InitializePerformanceSampling() +{ + m_performance_samples.clear(); + m_sampling_performance_info = false; + + u64 wait_us = + PERFORMANCE_SAMPLING_INITIAL_WAIT_TIME_SECS * 1000000 + + Common::Random::GenerateValue() % (PERFORMANCE_SAMPLING_WAIT_TIME_JITTER_SECS * 1000000); + m_sampling_next_start_us = Common::Timer::GetTimeUs() + wait_us; +} + +bool DolphinAnalytics::ShouldStartPerformanceSampling() +{ + if (Common::Timer::GetTimeUs() < m_sampling_next_start_us) + return false; + + u64 wait_us = + PERFORMANCE_SAMPLING_INTERVAL_SECS * 1000000 + + Common::Random::GenerateValue() % (PERFORMANCE_SAMPLING_WAIT_TIME_JITTER_SECS * 1000000); + m_sampling_next_start_us = Common::Timer::GetTimeUs() + wait_us; + return true; +} + +void DolphinAnalytics::MakeBaseBuilder() +{ + Common::AnalyticsReportBuilder builder; + + // Version information. + builder.AddData("version-desc", Common::scm_desc_str); + builder.AddData("version-hash", Common::scm_rev_git_str); + builder.AddData("version-branch", Common::scm_branch_str); + builder.AddData("version-dist", Common::scm_distributor_str); + + // Auto-Update information. + builder.AddData("update-track", SConfig::GetInstance().m_auto_update_track); + + // CPU information. + builder.AddData("cpu-summary", cpu_info.Summarize()); + +// OS information. +#if defined(_WIN32) + builder.AddData("os-type", "windows"); + + // Windows 8 removes support for GetVersionEx and such. Stupid. + DWORD(WINAPI * RtlGetVersion)(LPOSVERSIONINFOEXW); + *(FARPROC*)&RtlGetVersion = GetProcAddress(GetModuleHandle(TEXT("ntdll")), "RtlGetVersion"); + + OSVERSIONINFOEXW winver; + winver.dwOSVersionInfoSize = sizeof(winver); + if (RtlGetVersion != nullptr) + { + RtlGetVersion(&winver); + builder.AddData("win-ver-major", static_cast(winver.dwMajorVersion)); + builder.AddData("win-ver-minor", static_cast(winver.dwMinorVersion)); + builder.AddData("win-ver-build", static_cast(winver.dwBuildNumber)); + builder.AddData("win-ver-spmajor", static_cast(winver.wServicePackMajor)); + builder.AddData("win-ver-spminor", static_cast(winver.wServicePackMinor)); + } +#elif defined(ANDROID) + builder.AddData("os-type", "android"); + builder.AddData("android-manufacturer", s_get_val_func("DEVICE_MANUFACTURER")); + builder.AddData("android-model", s_get_val_func("DEVICE_MODEL")); + builder.AddData("android-version", s_get_val_func("DEVICE_OS")); +#elif defined(__APPLE__) + builder.AddData("os-type", "osx"); + + // id processInfo = [NSProcessInfo processInfo] + id processInfo = reinterpret_cast(objc_msgSend)( + objc_getClass("NSProcessInfo"), sel_getUid("processInfo")); + if (processInfo) + { + struct OSVersion // NSOperatingSystemVersion + { + s64 major_version; // NSInteger majorVersion + s64 minor_version; // NSInteger minorVersion + s64 patch_version; // NSInteger patchVersion + }; + + // NSOperatingSystemVersion version = [processInfo operatingSystemVersion] + OSVersion version = reinterpret_cast(objc_msgSend_stret)( + processInfo, sel_getUid("operatingSystemVersion")); + + builder.AddData("osx-ver-major", version.major_version); + builder.AddData("osx-ver-minor", version.minor_version); + builder.AddData("osx-ver-bugfix", version.patch_version); + } +#elif defined(__linux__) + builder.AddData("os-type", "linux"); +#elif defined(__FreeBSD__) + builder.AddData("os-type", "freebsd"); +#elif defined(__OpenBSD__) + builder.AddData("os-type", "openbsd"); +#elif defined(__NetBSD__) + builder.AddData("os-type", "netbsd"); +#elif defined(__HAIKU__) + builder.AddData("os-type", "haiku"); +#else + builder.AddData("os-type", "unknown"); +#endif + + m_base_builder = builder; +} + +static const char* GetShaderCompilationMode(const VideoConfig& video_config) +{ + switch (video_config.iShaderCompilationMode) + { + case ShaderCompilationMode::AsynchronousUberShaders: + return "async-ubershaders"; + case ShaderCompilationMode::AsynchronousSkipRendering: + return "async-skip-rendering"; + case ShaderCompilationMode::SynchronousUberShaders: + return "sync-ubershaders"; + case ShaderCompilationMode::Synchronous: + default: + return "sync"; + } +} + +void DolphinAnalytics::MakePerGameBuilder() +{ + Common::AnalyticsReportBuilder builder(m_base_builder); + + // Gameid. + builder.AddData("gameid", SConfig::GetInstance().GetGameID()); + + // Unique id bound to the gameid. + builder.AddData("id", MakeUniqueId(SConfig::GetInstance().GetGameID())); + + // Configuration. + builder.AddData("cfg-dsp-hle", SConfig::GetInstance().bDSPHLE); + builder.AddData("cfg-dsp-jit", SConfig::GetInstance().m_DSPEnableJIT); + builder.AddData("cfg-dsp-thread", SConfig::GetInstance().bDSPThread); + builder.AddData("cfg-cpu-thread", SConfig::GetInstance().bCPUThread); + builder.AddData("cfg-fastmem", SConfig::GetInstance().bFastmem); + builder.AddData("cfg-syncgpu", SConfig::GetInstance().bSyncGPU); + builder.AddData("cfg-audio-backend", SConfig::GetInstance().sBackend); + builder.AddData("cfg-oc-enable", SConfig::GetInstance().m_OCEnable); + builder.AddData("cfg-oc-factor", SConfig::GetInstance().m_OCFactor); + builder.AddData("cfg-render-to-main", Config::Get(Config::MAIN_RENDER_TO_MAIN)); + if (g_video_backend) + { + builder.AddData("cfg-video-backend", g_video_backend->GetName()); + } + + // Video configuration. + builder.AddData("cfg-gfx-multisamples", g_Config.iMultisamples); + builder.AddData("cfg-gfx-ssaa", g_Config.bSSAA); + builder.AddData("cfg-gfx-anisotropy", g_Config.iMaxAnisotropy); + builder.AddData("cfg-gfx-vsync", g_Config.bVSync); + builder.AddData("cfg-gfx-aspect-ratio", static_cast(g_Config.aspect_mode)); + builder.AddData("cfg-gfx-efb-access", g_Config.bEFBAccessEnable); + builder.AddData("cfg-gfx-efb-copy-format-changes", g_Config.bEFBEmulateFormatChanges); + builder.AddData("cfg-gfx-efb-copy-ram", !g_Config.bSkipEFBCopyToRam); + builder.AddData("cfg-gfx-xfb-copy-ram", !g_Config.bSkipXFBCopyToRam); + builder.AddData("cfg-gfx-defer-efb-copies", g_Config.bDeferEFBCopies); + builder.AddData("cfg-gfx-immediate-xfb", !g_Config.bImmediateXFB); + builder.AddData("cfg-gfx-efb-copy-scaled", g_Config.bCopyEFBScaled); + builder.AddData("cfg-gfx-internal-resolution", g_Config.iEFBScale); + builder.AddData("cfg-gfx-tc-samples", g_Config.iSafeTextureCache_ColorSamples); + builder.AddData("cfg-gfx-stereo-mode", static_cast(g_Config.stereo_mode)); + builder.AddData("cfg-gfx-per-pixel-lighting", g_Config.bEnablePixelLighting); + builder.AddData("cfg-gfx-shader-compilation-mode", GetShaderCompilationMode(g_Config)); + builder.AddData("cfg-gfx-wait-for-shaders", g_Config.bWaitForShadersBeforeStarting); + builder.AddData("cfg-gfx-fast-depth", g_Config.bFastDepthCalc); + builder.AddData("cfg-gfx-vertex-rounding", g_Config.UseVertexRounding()); + + // GPU features. + if (g_Config.iAdapter < static_cast(g_Config.backend_info.Adapters.size())) + { + builder.AddData("gpu-adapter", g_Config.backend_info.Adapters[g_Config.iAdapter]); + } + else if (!g_Config.backend_info.AdapterName.empty()) + { + builder.AddData("gpu-adapter", g_Config.backend_info.AdapterName); + } + builder.AddData("gpu-has-exclusive-fullscreen", + g_Config.backend_info.bSupportsExclusiveFullscreen); + builder.AddData("gpu-has-dual-source-blend", g_Config.backend_info.bSupportsDualSourceBlend); + builder.AddData("gpu-has-primitive-restart", g_Config.backend_info.bSupportsPrimitiveRestart); + builder.AddData("gpu-has-oversized-viewports", g_Config.backend_info.bSupportsOversizedViewports); + builder.AddData("gpu-has-geometry-shaders", g_Config.backend_info.bSupportsGeometryShaders); + builder.AddData("gpu-has-3d-vision", g_Config.backend_info.bSupports3DVision); + builder.AddData("gpu-has-early-z", g_Config.backend_info.bSupportsEarlyZ); + builder.AddData("gpu-has-binding-layout", g_Config.backend_info.bSupportsBindingLayout); + builder.AddData("gpu-has-bbox", g_Config.backend_info.bSupportsBBox); + builder.AddData("gpu-has-fragment-stores-and-atomics", + g_Config.backend_info.bSupportsFragmentStoresAndAtomics); + builder.AddData("gpu-has-gs-instancing", g_Config.backend_info.bSupportsGSInstancing); + builder.AddData("gpu-has-post-processing", g_Config.backend_info.bSupportsPostProcessing); + builder.AddData("gpu-has-palette-conversion", g_Config.backend_info.bSupportsPaletteConversion); + builder.AddData("gpu-has-clip-control", g_Config.backend_info.bSupportsClipControl); + builder.AddData("gpu-has-ssaa", g_Config.backend_info.bSupportsSSAA); + + // NetPlay / recording. + builder.AddData("netplay", NetPlay::IsNetPlayRunning()); + builder.AddData("movie", Movie::IsMovieActive()); + + // Controller information + // We grab enough to tell what percentage of our users are playing with keyboard/mouse, some kind + // of gamepad + // or the official gamecube adapter. + builder.AddData("gcadapter-detected", GCAdapter::IsDetected(nullptr)); + builder.AddData("has-controller", Pad::GetConfig()->IsControllerControlledByGamepadDevice(0) || + GCAdapter::IsDetected(nullptr)); + + m_per_game_builder = builder; +} diff --git a/Source/Core/Core/DolphinAnalytics.h b/Source/Core/Core/DolphinAnalytics.h new file mode 100644 index 0000000000..6416257b93 --- /dev/null +++ b/Source/Core/Core/DolphinAnalytics.h @@ -0,0 +1,159 @@ +// Copyright 2016 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "Common/Analytics.h" +#include "Common/CommonTypes.h" + +#if defined(ANDROID) +#include +#endif +// Non generic part of the Dolphin Analytics framework. See Common/Analytics.h +// for the main documentation. + +enum class GameQuirk +{ + // Sometimes code run from ICache is different from its mirror in RAM. + ICACHE_MATTERS = 0, + + // The Wii remote hardware makes it possible to bypass normal data reporting and directly + // "read" extension or IR data. This would break our current TAS/NetPlay implementation. + DIRECTLY_READS_WIIMOTE_INPUT, + + // Several Wii DI commands that are rarely/never used and not implemented by Dolphin + USES_DVD_LOW_STOP_LASER, + USES_DVD_LOW_OFFSET, + USES_DVD_LOW_READ_DISK_BCA, // NSMBW known to use this + USES_DVD_LOW_REQUEST_DISC_STATUS, + USES_DVD_LOW_REQUEST_RETRY_NUMBER, + USES_DVD_LOW_SER_MEAS_CONTROL, + + // Dolphin only implements the simple DVDLowOpenPartition, not any of the variants where some + // already-read data is provided + USES_DIFFERENT_PARTITION_COMMAND, + + // IOS has implementations for ioctls 0x85 and 0x89 and a stub for 0x87, but + // DVDLowMaskCoverInterrupt/DVDLowUnmaskCoverInterrupt/DVDLowUnmaskStatusInterrupts + // are all stubbed on the PPC side so they presumably will never be used. + // (DVDLowClearCoverInterrupt is used, though) + USES_DI_INTERRUPT_MASK_COMMAND, + + // Some games configure a mismatched number of texture coordinates or colors between the transform + // and TEV/BP stages of the rendering pipeline. Currently, Dolphin just skips over these objects + // as the hardware renderers are not equipped to handle the case where the registers between + // stages are mismatched. + MISMATCHED_GPU_TEXGENS_BETWEEN_XF_AND_BP, + MISMATCHED_GPU_COLORS_BETWEEN_XF_AND_BP, + + // The WD module can be configured to operate in six different modes. + // In practice, only mode 1 (DS communications) and mode 3 (AOSS access point scanning) + // are used by games and the system menu respectively. + USES_UNCOMMON_WD_MODE, + + USES_WD_UNIMPLEMENTED_IOCTL, + + COUNT, +}; + +class DolphinAnalytics +{ +public: + // Performs lazy-initialization of a singleton and returns the instance. + static DolphinAnalytics& Instance(); + +#if defined(ANDROID) + // Get value from java. + static void AndroidSetGetValFunc(std::function function); +#endif + // Resets and recreates the analytics system in order to reload + // configuration. + void ReloadConfig(); + // Rotates the unique identifier used for this instance of Dolphin and saves + // it into the configuration. + void GenerateNewIdentity(); + + // Reports a Dolphin start event. + void ReportDolphinStart(std::string_view ui_type); + + // Generates a base report for a "Game start" event. Also preseeds the + // per-game base data. + void ReportGameStart(); + + // Generates a report for a special condition being hit by a game. This is automatically throttled + // to once per game run. + void ReportGameQuirk(GameQuirk quirk); + + struct PerformanceSample + { + double speed_ratio; // See SystemTimers::GetEstimatedEmulationPerformance(). + int num_prims; + int num_draw_calls; + }; + // Reports performance information. This method performs its own throttling / aggregation -- + // calling it does not guarantee when a report will actually be sent. + // + // This method is NOT thread-safe. + void ReportPerformanceInfo(PerformanceSample&& sample); + + // Forward Send method calls to the reporter. + template + void Send(T report) + { + std::lock_guard lk{m_reporter_mutex}; + m_reporter.Send(report); + } + +private: + DolphinAnalytics(); + + void MakeBaseBuilder(); + void MakePerGameBuilder(); + + // Returns a unique ID derived on the global unique ID, hashed with some + // report-specific data. This avoid correlation between different types of + // events. + std::string MakeUniqueId(std::string_view data) const; + + // Unique ID. This should never leave the application. Only used derived + // values created by MakeUniqueId. + std::string m_unique_id; + + // Performance sampling configuration constants. + // + // 5min after startup + rand(0, 3min) jitter time, collect performance for 100 frames in a row. + // Repeat collection after 30min + rand(0, 3min). + static constexpr int NUM_PERFORMANCE_SAMPLES_PER_REPORT = 100; + static constexpr int PERFORMANCE_SAMPLING_INITIAL_WAIT_TIME_SECS = 300; + static constexpr int PERFORMANCE_SAMPLING_WAIT_TIME_JITTER_SECS = 180; + static constexpr int PERFORMANCE_SAMPLING_INTERVAL_SECS = 1800; + + // Performance sampling state & internal helpers. + void InitializePerformanceSampling(); // Called on game start / title switch. + bool ShouldStartPerformanceSampling(); + u64 m_sampling_next_start_us; // Next timestamp (in us) at which to trigger sampling. + bool m_sampling_performance_info = false; // Whether we are currently collecting samples. + std::vector m_performance_samples; + + // What quirks have already been reported about the current game. + std::array(GameQuirk::COUNT)> m_reported_quirks; + + // Builder that contains all non variable data that should be sent with all + // reports. + Common::AnalyticsReportBuilder m_base_builder; + + // Builder that contains per game data and is initialized when a game start + // report is sent. + Common::AnalyticsReportBuilder m_per_game_builder; + + std::mutex m_reporter_mutex; + Common::AnalyticsReporter m_reporter; +}; diff --git a/Source/Core/Core/HW/DVD/DVDInterface.cpp b/Source/Core/Core/HW/DVD/DVDInterface.cpp index f1793626d3..b8bed7c592 100644 --- a/Source/Core/Core/HW/DVD/DVDInterface.cpp +++ b/Source/Core/Core/HW/DVD/DVDInterface.cpp @@ -18,10 +18,10 @@ #include "Common/Config/Config.h" #include "Common/Logging/Log.h" -#include "Core/Analytics.h" #include "Core/Config/MainSettings.h" #include "Core/ConfigManager.h" #include "Core/CoreTiming.h" +#include "Core/DolphinAnalytics.h" #include "Core/HW/AudioInterface.h" #include "Core/HW/DVD/DVDMath.h" #include "Core/HW/DVD/DVDThread.h" diff --git a/Source/Core/Core/HW/WiimoteEmu/EmuSubroutines.cpp b/Source/Core/Core/HW/WiimoteEmu/EmuSubroutines.cpp index 00bfd2b0d9..bf71f7e6f6 100644 --- a/Source/Core/Core/HW/WiimoteEmu/EmuSubroutines.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/EmuSubroutines.cpp @@ -13,8 +13,8 @@ #include "Common/Logging/Log.h" #include "Common/MsgHandler.h" #include "Common/Swap.h" -#include "Core/Analytics.h" #include "Core/Core.h" +#include "Core/DolphinAnalytics.h" #include "Core/HW/WiimoteCommon/WiimoteHid.h" #include "Core/HW/WiimoteEmu/WiimoteEmu.h" #include "Core/HW/WiimoteReal/WiimoteReal.h" diff --git a/Source/Core/Core/IOS/DI/DI.cpp b/Source/Core/Core/IOS/DI/DI.cpp index 591364e2a9..44a02f0a40 100644 --- a/Source/Core/Core/IOS/DI/DI.cpp +++ b/Source/Core/Core/IOS/DI/DI.cpp @@ -12,8 +12,8 @@ #include "Common/CommonTypes.h" #include "Common/Logging/Log.h" #include "Common/MsgHandler.h" -#include "Core/Analytics.h" #include "Core/CoreTiming.h" +#include "Core/DolphinAnalytics.h" #include "Core/HW/DVD/DVDInterface.h" #include "Core/HW/DVD/DVDThread.h" #include "Core/HW/MMIO.h" diff --git a/Source/Core/Core/IOS/Network/WD/Command.cpp b/Source/Core/Core/IOS/Network/WD/Command.cpp index 0f6eb0b49d..57aec2e939 100644 --- a/Source/Core/Core/IOS/Network/WD/Command.cpp +++ b/Source/Core/Core/IOS/Network/WD/Command.cpp @@ -12,7 +12,7 @@ #include "Common/Logging/Log.h" #include "Common/Network.h" #include "Common/Swap.h" -#include "Core/Analytics.h" +#include "Core/DolphinAnalytics.h" #include "Core/HW/Memmap.h" #include "Core/IOS/Network/MACUtils.h" diff --git a/Source/Core/Core/PowerPC/PPCCache.cpp b/Source/Core/Core/PowerPC/PPCCache.cpp index ad7735c9d1..dd57394028 100644 --- a/Source/Core/Core/PowerPC/PPCCache.cpp +++ b/Source/Core/Core/PowerPC/PPCCache.cpp @@ -8,7 +8,7 @@ #include "Common/ChunkFile.h" #include "Common/Swap.h" -#include "Core/Analytics.h" +#include "Core/DolphinAnalytics.h" #include "Core/HW/Memmap.h" #include "Core/PowerPC/JitInterface.h" #include "Core/PowerPC/PowerPC.h" diff --git a/Source/Core/DolphinNoGUI/MainNoGUI.cpp b/Source/Core/DolphinNoGUI/MainNoGUI.cpp index 0bf4df23b8..5ab18a38eb 100644 --- a/Source/Core/DolphinNoGUI/MainNoGUI.cpp +++ b/Source/Core/DolphinNoGUI/MainNoGUI.cpp @@ -17,10 +17,10 @@ #endif #include "Common/StringUtil.h" -#include "Core/Analytics.h" #include "Core/Boot/Boot.h" #include "Core/BootManager.h" #include "Core/Core.h" +#include "Core/DolphinAnalytics.h" #include "Core/Host.h" #include "UICommon/CommandLineParse.h" diff --git a/Source/Core/DolphinQt/Main.cpp b/Source/Core/DolphinQt/Main.cpp index 945912dea7..98aaa480d5 100644 --- a/Source/Core/DolphinQt/Main.cpp +++ b/Source/Core/DolphinQt/Main.cpp @@ -21,10 +21,10 @@ #include "Common/MsgHandler.h" #include "Common/ScopeGuard.h" -#include "Core/Analytics.h" #include "Core/Boot/Boot.h" #include "Core/Config/MainSettings.h" #include "Core/Core.h" +#include "Core/DolphinAnalytics.h" #include "DolphinQt/Host.h" #include "DolphinQt/MainWindow.h" diff --git a/Source/Core/DolphinQt/Settings/GeneralPane.cpp b/Source/Core/DolphinQt/Settings/GeneralPane.cpp index 62ca50469f..705bdee7ed 100644 --- a/Source/Core/DolphinQt/Settings/GeneralPane.cpp +++ b/Source/Core/DolphinQt/Settings/GeneralPane.cpp @@ -16,11 +16,11 @@ #include #include -#include "Core/Analytics.h" #include "Core/Config/MainSettings.h" #include "Core/Config/UISettings.h" #include "Core/ConfigManager.h" #include "Core/Core.h" +#include "Core/DolphinAnalytics.h" #include "Core/PowerPC/PowerPC.h" #include "DolphinQt/QtUtils/ModalMessageBox.h" diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index f281ff5a87..fbba9fc12f 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -39,11 +39,11 @@ #include "Common/Thread.h" #include "Common/Timer.h" -#include "Core/Analytics.h" #include "Core/Config/NetplaySettings.h" #include "Core/Config/SYSCONFSettings.h" #include "Core/ConfigManager.h" #include "Core/Core.h" +#include "Core/DolphinAnalytics.h" #include "Core/FifoPlayer/FifoRecorder.h" #include "Core/FreeLookConfig.h" #include "Core/HW/SystemTimers.h" diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp index ae694868aa..59d351018f 100644 --- a/Source/Core/VideoCommon/VertexManagerBase.cpp +++ b/Source/Core/VideoCommon/VertexManagerBase.cpp @@ -14,8 +14,8 @@ #include "Common/Logging/Log.h" #include "Common/MathUtil.h" -#include "Core/Analytics.h" #include "Core/ConfigManager.h" +#include "Core/DolphinAnalytics.h" #include "VideoCommon/BPMemory.h" #include "VideoCommon/BoundingBox.h" -- cgit v1.2.3