/// <summary>Outputs some general GPU information in text format.</summary> public static string CheckGPUAndVersion() { // Create a list of valid versions. The list must be sorted. Version[] testedOK = new Version[] { Version.Parse("13.251.9001.0"), Version.Parse("14.501.1003.0"), Version.Parse("15.200.1062.1004") }; const string recommend = "(Known working with 14.501.1003 or 15.200.1062)"; StringBuilder msg = new StringBuilder(); bool anyAmdGpuFound = false; ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_VideoController"); foreach (ManagementObject mo in searcher.Get()) { string desc = mo.Properties["Name"].Value.ToString(); //////////////////// Lets check if this is an AMD GPU (not 100% accurate) ///////////////////////// if (Regex.Match(desc, @"((AMD|ASUS|ATI)\s+(Radeon|RADEON|Mobility\sRadeon|FireGL|FireStream|Firepro|FirePro|R7|R9|HD)[\s\(\d].*)" + @"|(Radeon\s?(\(TM\))?\s?(HD|R5|R7|R9)[\s\(\d].*)" + @"|(ASUS\sEAH6450.*)").Success) { anyAmdGpuFound = true; //////////////////// Lets check the Driver version ///////////////////////// string driverVer = mo.Properties["DriverVersion"].Value.ToString(); Version driver = System.Version.Parse(driverVer); if (testedOK.Contains(driver)) msg.AppendFormat("INFO: AMD Driver version, {0}, has been verified as working.\r\n", driverVer); else if ((from t in testedOK where t.Major == driver.Major && t.Minor == driver.Minor select t).Any()) msg.AppendFormat("INFO: AMD driver version, {0}, is near a known working version{1}\r\n", driverVer, recommend); else if (driver < testedOK[0]) msg.AppendFormat("WARN: AMD driver version, {0}, might be too low (warning below {1}){2}\r\n", driverVer, testedOK[0], recommend); else if (driver > testedOK.Last()) msg.AppendFormat("WARN: AMD driver version, {0}, might be too new (warning above {1}){2}\r\n", driverVer, testedOK.Last(), recommend); else msg.AppendFormat("WARN: AMD driver version, {0}, has not been tested {2}\r\n", driverVer, testedOK.Last(), recommend); //////////////////// Lets check the GPU dataType using the Video card name ///////////////////////// if (Regex.Match(desc, @"((AMD|ASUS)\s+Radeon\s*(\(TM\))?\s*(HD|R7|R9|)\s*(7[789]\d|818|821|825|824|828|833|837|847|857|867|840|857|867|876|877|886|895|897|899|855|857|859|867|869|873|875|877|879|883|885|887|889|893|895|897|899)0[MDG]?(\s.*)?)" + @"|((AMD|ASUS)\s+(Radeon|R7|R9)\s*?(\(TM\))?\s*?(R[79])?\s+(2[0456789][05]X?)\s.*)" + @"||((AMD|ASUS)\s+Firepro\s*?(\(TM\))?\s*?M(40|41|51|60)00\s.*)").Success) { msg.AppendLine("INFO: Found GPU with GCN - " + desc); } else if (Regex.Match(desc, @"((AMD|ATI)\s+FirePro\s+(2270|2460|A300|3800|V[345789][89]00)\s.*?)" + // No FirePro support GCN @"|(AMD FireStream 93[57]0\s.*?)" + // No FireStream 93xx support GCN @"|((AMD|ATI|VisionTek)\s+(Mobility\s+)?Radeon\s+(HD\s+)?5[0456789]\d0(X2)?[\s/].*?)" + // No 5000 support GCN @"|((AMD|ATI)\s+Radeon\s+(HD\s+)?E?6[2-9]\d0[DGMA]?[\s/].*?)" + // No 6000 support GCN @"|((AMD|ATI)\s+Radeon\s+(HD\s+)?7[03456]\d0[DGM]?[\s/].*?)" + // No 7000-7600 support GCN @"|((AMD\s+)?Radeon\s+(R5\s+)2[123][05]X?[\s/].*?)").Success) // No 200-235 support GCN { msg.AppendLine("ERROR: GPU does not support GCN (" + desc + ")"); } else { msg.AppendLine("WARN: AMD GPU Found: (unknown if GPU supports GCN) " + desc); } } } // end foreach VideoController if (!anyAmdGpuFound) msg.AppendLine("ERROR: No known AMD GPU found. "); return msg.ToString(); }