diff --git a/renderdoc/driver/dxgi/dxgi_common.cpp b/renderdoc/driver/dxgi/dxgi_common.cpp index 7cf255487..8487c8214 100644 --- a/renderdoc/driver/dxgi/dxgi_common.cpp +++ b/renderdoc/driver/dxgi/dxgi_common.cpp @@ -1396,6 +1396,18 @@ static std::string GetDeviceProperty(HDEVINFO devs, PSP_DEVINFO_DATA data, const return StringFormat::Wide2UTF8(string); } +static uint32_t HexToInt(char hex) +{ + if(hex >= 'a' && hex <= 'f') + return (hex - 'a') + 0xa; + else if(hex >= 'A' && hex <= 'F') + return (hex - 'A') + 0xa; + else if(hex >= '0' && hex <= '9') + return hex - '0'; + + return 0; +} + std::string GetDriverVersion(DXGI_ADAPTER_DESC &desc) { std::string device = StringFormat::Wide2UTF8(desc.Description); @@ -1412,8 +1424,6 @@ std::string GetDriverVersion(DXGI_ADAPTER_DESC &desc) return device; } - std::string pci_match = StringFormat::Fmt("pci\\ven_%04x&dev_%04x", desc.VendorId, desc.DeviceId); - std::string driverVersion = ""; DWORD idx = 0; @@ -1430,12 +1440,12 @@ std::string GetDriverVersion(DXGI_ADAPTER_DESC &desc) } // if we got a version, and didn't have one yet, set it - if(version.empty()) + if(driverVersion.empty()) driverVersion = version; std::string pciid = GetDeviceProperty(devs, &data, &DEVPKEY_Device_MatchingDeviceId); - if(version.empty()) + if(pciid.empty()) { SetupDiDestroyDeviceInfoList(devs); return device; @@ -1443,8 +1453,28 @@ std::string GetDriverVersion(DXGI_ADAPTER_DESC &desc) pciid = strlower(pciid); + UINT VendorId = 0, DeviceId = 0; + + char *end = &(*pciid.end()); + + const char *ven = strstr(pciid.c_str(), "ven_"); + if(ven && ven + 8 <= end) + { + ven += 4; + VendorId = + HexToInt(ven[0]) << 12 | HexToInt(ven[1]) << 8 | HexToInt(ven[2]) << 4 | HexToInt(ven[3]); + } + + const char *dev = strstr(pciid.c_str(), "dev_"); + if(dev && dev + 8 <= end) + { + dev += 4; + DeviceId = + HexToInt(dev[0]) << 12 | HexToInt(dev[1]) << 8 | HexToInt(dev[2]) << 4 | HexToInt(dev[3]); + } + // if the PCI id matches, take it - if(pciid == pci_match) + if(VendorId == desc.VendorId && DeviceId == desc.DeviceId) driverVersion = version; // move to the next device