mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Merge pull request #5501 from FearlessTobi/port-1064-3948
Port yuzu-emu/yuzu#1064 and yuzu-emu/yuzu#3948: Changes to Telemetry and CPU feature detection
This commit is contained in:
		
						commit
						9ff97270cf
					
				
					 17 changed files with 137 additions and 89 deletions
				
			
		|  | @ -3,9 +3,16 @@ | |||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <algorithm> | ||||
| #include <cstring> | ||||
| #include "common/assert.h" | ||||
| #include "common/scm_rev.h" | ||||
| #include "common/telemetry.h" | ||||
| 
 | ||||
| namespace Telemetry { | ||||
| #ifdef ARCHITECTURE_x86_64 | ||||
| #include "common/x64/cpu_detect.h" | ||||
| #endif | ||||
| 
 | ||||
| namespace Common::Telemetry { | ||||
| 
 | ||||
| void FieldCollection::Accept(VisitorInterface& visitor) const { | ||||
|     for (const auto& field : fields) { | ||||
|  | @ -37,4 +44,48 @@ template class Field<std::string>; | |||
| template class Field<const char*>; | ||||
| template class Field<std::chrono::microseconds>; | ||||
| 
 | ||||
| } // namespace Telemetry
 | ||||
| void AppendBuildInfo(FieldCollection& fc) { | ||||
|     const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr}; | ||||
|     fc.AddField(FieldType::App, "Git_IsDirty", is_git_dirty); | ||||
|     fc.AddField(FieldType::App, "Git_Branch", Common::g_scm_branch); | ||||
|     fc.AddField(FieldType::App, "Git_Revision", Common::g_scm_rev); | ||||
|     fc.AddField(FieldType::App, "BuildDate", Common::g_build_date); | ||||
|     fc.AddField(FieldType::App, "BuildName", Common::g_build_name); | ||||
| } | ||||
| 
 | ||||
| void AppendCPUInfo(FieldCollection& fc) { | ||||
| #ifdef ARCHITECTURE_x86_64 | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_BrandString", Common::GetCPUCaps().brand_string); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AES", Common::GetCPUCaps().aes); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX", Common::GetCPUCaps().avx); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX2", Common::GetCPUCaps().avx2); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX512", Common::GetCPUCaps().avx512); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI1", Common::GetCPUCaps().bmi1); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI2", Common::GetCPUCaps().bmi2); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA", Common::GetCPUCaps().fma); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA4", Common::GetCPUCaps().fma4); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE", Common::GetCPUCaps().sse); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE2", Common::GetCPUCaps().sse2); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE3", Common::GetCPUCaps().sse3); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSSE3", Common::GetCPUCaps().ssse3); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE41", Common::GetCPUCaps().sse4_1); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE42", Common::GetCPUCaps().sse4_2); | ||||
| #else | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Model", "Other"); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void AppendOSInfo(FieldCollection& fc) { | ||||
| #ifdef __APPLE__ | ||||
|     fc.AddField(FieldType::UserSystem, "OsPlatform", "Apple"); | ||||
| #elif defined(_WIN32) | ||||
|     fc.AddField(FieldType::UserSystem, "OsPlatform", "Windows"); | ||||
| #elif defined(__linux__) || defined(linux) || defined(__linux) | ||||
|     fc.AddField(FieldType::UserSystem, "OsPlatform", "Linux"); | ||||
| #else | ||||
|     fc.AddField(FieldType::UserSystem, "OsPlatform", "Unknown"); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| } // namespace Common::Telemetry
 | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ | |||
| #include <string> | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
| namespace Telemetry { | ||||
| namespace Common::Telemetry { | ||||
| 
 | ||||
| /// Field type, used for grouping fields together in the final submitted telemetry log
 | ||||
| enum class FieldType : u8 { | ||||
|  | @ -55,8 +55,8 @@ public: | |||
|     Field(FieldType type, std::string name, T value) | ||||
|         : name(std::move(name)), type(type), value(std::move(value)) {} | ||||
| 
 | ||||
|     Field(const Field& other) = default; | ||||
|     Field& operator=(const Field& other) = default; | ||||
|     Field(const Field&) = default; | ||||
|     Field& operator=(const Field&) = default; | ||||
| 
 | ||||
|     Field(Field&&) = default; | ||||
|     Field& operator=(Field&& other) = default; | ||||
|  | @ -184,4 +184,16 @@ struct NullVisitor : public VisitorInterface { | |||
|     } | ||||
| }; | ||||
| 
 | ||||
| } // namespace Telemetry
 | ||||
| /// Appends build-specific information to the given FieldCollection,
 | ||||
| /// such as branch name, revision hash, etc.
 | ||||
| void AppendBuildInfo(FieldCollection& fc); | ||||
| 
 | ||||
| /// Appends CPU-specific information to the given FieldCollection,
 | ||||
| /// such as instruction set extensions, etc.
 | ||||
| void AppendCPUInfo(FieldCollection& fc); | ||||
| 
 | ||||
| /// Appends OS-specific information to the given FieldCollection,
 | ||||
| /// such as platform name, etc.
 | ||||
| void AppendOSInfo(FieldCollection& fc); | ||||
| 
 | ||||
| } // namespace Common::Telemetry
 | ||||
|  |  | |||
|  | @ -110,6 +110,11 @@ static CPUCaps Detect() { | |||
|                 caps.bmi1 = true; | ||||
|             if ((cpu_id[1] >> 8) & 1) | ||||
|                 caps.bmi2 = true; | ||||
|             // Checks for AVX512F, AVX512CD, AVX512VL, AVX512DQ, AVX512BW (Intel Skylake-X/SP)
 | ||||
|             if ((cpu_id[1] >> 16) & 1 && (cpu_id[1] >> 28) & 1 && (cpu_id[1] >> 31) & 1 && | ||||
|                 (cpu_id[1] >> 17) & 1 && (cpu_id[1] >> 30) & 1) { | ||||
|                 caps.avx512 = caps.avx2; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,6 +18,7 @@ struct CPUCaps { | |||
|     bool sse4_2; | ||||
|     bool avx; | ||||
|     bool avx2; | ||||
|     bool avx512; | ||||
|     bool bmi1; | ||||
|     bool bmi2; | ||||
|     bool fma; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue