DriverDetails.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // Copyright 2013 Dolphin Emulator Project
  2. // Licensed under GPLv2+
  3. // Refer to the license.txt file included.
  4. #include <map>
  5. #include "Common/Logging/LogManager.h"
  6. #include "VideoCommon/DriverDetails.h"
  7. namespace DriverDetails
  8. {
  9. struct BugInfo
  10. {
  11. u32 m_os; // Which OS has the issue
  12. Vendor m_vendor; // Which vendor has the error
  13. Driver m_driver; // Which driver has the error
  14. s32 m_family; // Which family of hardware has the issue
  15. Bug m_bug; // Which bug it is
  16. double m_versionstart; // When it started
  17. double m_versionend; // When it ended
  18. bool m_hasbug; // Does it have it?
  19. };
  20. // Local members
  21. #ifdef _WIN32
  22. const u32 m_os = OS_ALL | OS_WINDOWS;
  23. #elif ANDROID
  24. const u32 m_os = OS_ALL | OS_ANDROID;
  25. #elif __APPLE__
  26. const u32 m_os = OS_ALL | OS_OSX;
  27. #elif __linux__
  28. const u32 m_os = OS_ALL | OS_LINUX;
  29. #elif __FreeBSD__
  30. const u32 m_os = OS_ALL | OS_FREEBSD;
  31. #endif
  32. static Vendor m_vendor = VENDOR_UNKNOWN;
  33. static Driver m_driver = DRIVER_UNKNOWN;
  34. static s32 m_family = 0;
  35. static double m_version = 0.0;
  36. // This is a list of all known bugs for each vendor
  37. // We use this to check if the device and driver has a issue
  38. static BugInfo m_known_bugs[] = {
  39. {OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, -1, BUG_NODYNUBOACCESS, 14.0, 94.0, true},
  40. {OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, -1, BUG_BROKENCENTROID, 14.0, 46.0, true},
  41. {OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, -1, BUG_BROKENINFOLOG, -1.0, 46.0, true},
  42. {OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, -1, BUG_ANNIHILATEDUBOS, 41.0, 46.0, true},
  43. {OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, -1, BUG_BROKENSWAP, -1.0, 46.0, true},
  44. {OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, -1, BUG_BROKENBUFFERSTREAM, -1.0, -1.0, true},
  45. {OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, -1, BUG_BROKENTEXTURESIZE, -1.0, 65.0, true},
  46. {OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, -1, BUG_BROKENATTRIBUTELESS, -1.0, 94.0, true},
  47. {OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, -1, BUG_BROKENNEGATEDBOOLEAN,-1.0, -1.0, true},
  48. {OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, -1, BUG_BROKENIVECSHIFTS, -1.0, 46.0, true},
  49. {OS_ALL, VENDOR_ARM, DRIVER_ARM, -1, BUG_BROKENBUFFERSTREAM, -1.0, -1.0, true},
  50. {OS_ALL, VENDOR_MESA, DRIVER_NOUVEAU, -1, BUG_BROKENUBO, 900, 916, true},
  51. {OS_ALL, VENDOR_MESA, DRIVER_R600, -1, BUG_BROKENUBO, 900, 913, true},
  52. {OS_ALL, VENDOR_MESA, DRIVER_I965, -1, BUG_BROKENUBO, 900, 920, true},
  53. {OS_LINUX, VENDOR_ATI, DRIVER_ATI, -1, BUG_BROKENPINNEDMEMORY, -1.0, -1.0, true},
  54. {OS_LINUX, VENDOR_NVIDIA, DRIVER_NVIDIA, -1, BUG_BROKENBUFFERSTORAGE, -1.0, 33138.0, true},
  55. {OS_OSX, VENDOR_INTEL, DRIVER_INTEL, 3000, BUG_PRIMITIVERESTART, -1.0, -1.0, true},
  56. {OS_WINDOWS,VENDOR_NVIDIA, DRIVER_NVIDIA, -1, BUG_BROKENUNSYNCMAPPING, -1.0, -1.0, true},
  57. {OS_LINUX, VENDOR_NVIDIA, DRIVER_NVIDIA, -1, BUG_BROKENUNSYNCMAPPING, -1.0, -1.0, true},
  58. {OS_WINDOWS,VENDOR_INTEL, DRIVER_INTEL, -1, BUG_INTELBROKENBUFFERSTORAGE, 101810.3907, 101810.3960, true},
  59. };
  60. static std::map<Bug, BugInfo> m_bugs;
  61. void Init(Vendor vendor, Driver driver, const double version, const s32 family)
  62. {
  63. m_vendor = vendor;
  64. m_driver = driver;
  65. m_version = version;
  66. m_family = family;
  67. if (driver == DRIVER_UNKNOWN)
  68. switch (vendor)
  69. {
  70. case VENDOR_NVIDIA:
  71. case VENDOR_TEGRA:
  72. m_driver = DRIVER_NVIDIA;
  73. break;
  74. case VENDOR_ATI:
  75. m_driver = DRIVER_ATI;
  76. break;
  77. case VENDOR_INTEL:
  78. m_driver = DRIVER_INTEL;
  79. break;
  80. case VENDOR_IMGTEC:
  81. m_driver = DRIVER_IMGTEC;
  82. break;
  83. case VENDOR_VIVANTE:
  84. m_driver = DRIVER_VIVANTE;
  85. break;
  86. default:
  87. break;
  88. }
  89. for (auto& bug : m_known_bugs)
  90. {
  91. if (( bug.m_os & m_os ) &&
  92. ( bug.m_vendor == m_vendor || bug.m_vendor == VENDOR_ALL ) &&
  93. ( bug.m_driver == m_driver || bug.m_driver == DRIVER_ALL ) &&
  94. ( bug.m_family == m_family || bug.m_family == -1) &&
  95. ( bug.m_versionstart <= m_version || bug.m_versionstart == -1 ) &&
  96. ( bug.m_versionend > m_version || bug.m_versionend == -1 )
  97. )
  98. m_bugs.insert(std::make_pair(bug.m_bug, bug));
  99. }
  100. }
  101. bool HasBug(Bug bug)
  102. {
  103. auto it = m_bugs.find(bug);
  104. if (it == m_bugs.end())
  105. return false;
  106. return it->second.m_hasbug;
  107. }
  108. }