telemetry.cpp 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright 2017 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <algorithm>
  5. #include <cstring>
  6. #include "common/assert.h"
  7. #include "common/scm_rev.h"
  8. #include "common/telemetry.h"
  9. #ifdef ARCHITECTURE_x86_64
  10. #include "common/x64/cpu_detect.h"
  11. #endif
  12. namespace Common::Telemetry {
  13. void FieldCollection::Accept(VisitorInterface& visitor) const {
  14. for (const auto& field : fields) {
  15. field.second->Accept(visitor);
  16. }
  17. }
  18. void FieldCollection::AddField(std::unique_ptr<FieldInterface> field) {
  19. fields[field->GetName()] = std::move(field);
  20. }
  21. template <class T>
  22. void Field<T>::Accept(VisitorInterface& visitor) const {
  23. visitor.Visit(*this);
  24. }
  25. template class Field<bool>;
  26. template class Field<double>;
  27. template class Field<float>;
  28. template class Field<u8>;
  29. template class Field<u16>;
  30. template class Field<u32>;
  31. template class Field<u64>;
  32. template class Field<s8>;
  33. template class Field<s16>;
  34. template class Field<s32>;
  35. template class Field<s64>;
  36. template class Field<std::string>;
  37. template class Field<const char*>;
  38. template class Field<std::chrono::microseconds>;
  39. void AppendBuildInfo(FieldCollection& fc) {
  40. const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr};
  41. fc.AddField(FieldType::App, "Git_IsDirty", is_git_dirty);
  42. fc.AddField(FieldType::App, "Git_Branch", Common::g_scm_branch);
  43. fc.AddField(FieldType::App, "Git_Revision", Common::g_scm_rev);
  44. fc.AddField(FieldType::App, "BuildDate", Common::g_build_date);
  45. fc.AddField(FieldType::App, "BuildName", Common::g_build_name);
  46. }
  47. void AppendCPUInfo(FieldCollection& fc) {
  48. #ifdef ARCHITECTURE_x86_64
  49. fc.AddField(FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string);
  50. fc.AddField(FieldType::UserSystem, "CPU_BrandString", Common::GetCPUCaps().brand_string);
  51. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AES", Common::GetCPUCaps().aes);
  52. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX", Common::GetCPUCaps().avx);
  53. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX2", Common::GetCPUCaps().avx2);
  54. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX512", Common::GetCPUCaps().avx512);
  55. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI1", Common::GetCPUCaps().bmi1);
  56. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI2", Common::GetCPUCaps().bmi2);
  57. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA", Common::GetCPUCaps().fma);
  58. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA4", Common::GetCPUCaps().fma4);
  59. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE", Common::GetCPUCaps().sse);
  60. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE2", Common::GetCPUCaps().sse2);
  61. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE3", Common::GetCPUCaps().sse3);
  62. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSSE3", Common::GetCPUCaps().ssse3);
  63. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE41", Common::GetCPUCaps().sse4_1);
  64. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE42", Common::GetCPUCaps().sse4_2);
  65. #else
  66. fc.AddField(FieldType::UserSystem, "CPU_Model", "Other");
  67. #endif
  68. }
  69. void AppendOSInfo(FieldCollection& fc) {
  70. #ifdef __APPLE__
  71. fc.AddField(FieldType::UserSystem, "OsPlatform", "Apple");
  72. #elif defined(_WIN32)
  73. fc.AddField(FieldType::UserSystem, "OsPlatform", "Windows");
  74. #elif defined(__linux__) || defined(linux) || defined(__linux)
  75. fc.AddField(FieldType::UserSystem, "OsPlatform", "Linux");
  76. #else
  77. fc.AddField(FieldType::UserSystem, "OsPlatform", "Unknown");
  78. #endif
  79. }
  80. } // namespace Common::Telemetry