telemetry.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 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. #ifdef ARCHITECTURE_x86_64
  40. static const char* CpuVendorToStr(Common::CPUVendor vendor) {
  41. switch (vendor) {
  42. case Common::CPUVendor::INTEL:
  43. return "Intel";
  44. case Common::CPUVendor::AMD:
  45. return "Amd";
  46. case Common::CPUVendor::OTHER:
  47. return "Other";
  48. }
  49. UNREACHABLE();
  50. }
  51. #endif
  52. void AppendBuildInfo(FieldCollection& fc) {
  53. const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr};
  54. fc.AddField(FieldType::App, "Git_IsDirty", is_git_dirty);
  55. fc.AddField(FieldType::App, "Git_Branch", Common::g_scm_branch);
  56. fc.AddField(FieldType::App, "Git_Revision", Common::g_scm_rev);
  57. fc.AddField(FieldType::App, "BuildDate", Common::g_build_date);
  58. fc.AddField(FieldType::App, "BuildName", Common::g_build_name);
  59. }
  60. void AppendCPUInfo(FieldCollection& fc) {
  61. #ifdef ARCHITECTURE_x86_64
  62. fc.AddField(FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string);
  63. fc.AddField(FieldType::UserSystem, "CPU_BrandString", Common::GetCPUCaps().brand_string);
  64. fc.AddField(FieldType::UserSystem, "CPU_Vendor", CpuVendorToStr(Common::GetCPUCaps().vendor));
  65. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AES", Common::GetCPUCaps().aes);
  66. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX", Common::GetCPUCaps().avx);
  67. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX2", Common::GetCPUCaps().avx2);
  68. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI1", Common::GetCPUCaps().bmi1);
  69. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI2", Common::GetCPUCaps().bmi2);
  70. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA", Common::GetCPUCaps().fma);
  71. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA4", Common::GetCPUCaps().fma4);
  72. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE", Common::GetCPUCaps().sse);
  73. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE2", Common::GetCPUCaps().sse2);
  74. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE3", Common::GetCPUCaps().sse3);
  75. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSSE3", Common::GetCPUCaps().ssse3);
  76. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE41", Common::GetCPUCaps().sse4_1);
  77. fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE42", Common::GetCPUCaps().sse4_2);
  78. #else
  79. fc.AddField(FieldType::UserSystem, "CPU_Model", "Other");
  80. #endif
  81. }
  82. void AppendOSInfo(FieldCollection& fc) {
  83. #ifdef __APPLE__
  84. fc.AddField(FieldType::UserSystem, "OsPlatform", "Apple");
  85. #elif defined(_WIN32)
  86. fc.AddField(FieldType::UserSystem, "OsPlatform", "Windows");
  87. #elif defined(__linux__) || defined(linux) || defined(__linux)
  88. fc.AddField(FieldType::UserSystem, "OsPlatform", "Linux");
  89. #else
  90. fc.AddField(FieldType::UserSystem, "OsPlatform", "Unknown");
  91. #endif
  92. }
  93. } // namespace Telemetry