1 /* 2 * Copyright 2015 Patrick Rudolph <siro (at) das-labor.org> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * on the rights to use, copy, modify, merge, publish, distribute, sub 8 * license, and/or sell copies of the Software, and to permit persons to whom 9 * the Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 22 23 #include <string.h> 24 #include "adapter9.h" 25 26 #define DBG_CHANNEL DBG_ADAPTER 27 28 /* prototypes */ 29 void 30 d3d_match_vendor_id( D3DADAPTER_IDENTIFIER9* drvid, 31 unsigned fallback_ven, 32 unsigned fallback_dev, 33 const char* fallback_name ); 34 void d3d_fill_driver_version(D3DADAPTER_IDENTIFIER9* drvid); 35 void d3d_fill_cardname(D3DADAPTER_IDENTIFIER9* drvid); 36 37 enum d3d_vendor_id 38 { 39 HW_VENDOR_SOFTWARE = 0x0000, 40 HW_VENDOR_AMD = 0x1002, 41 HW_VENDOR_NVIDIA = 0x10de, 42 HW_VENDOR_VMWARE = 0x15ad, 43 HW_VENDOR_INTEL = 0x8086, 44 }; 45 46 struct card_lookup_table { 47 const char *mesaname; 48 const char *d3d9name; 49 } 50 cards_amd[] = { 51 {"HAWAII", "AMD Radeon R9 290"}, 52 {"KAVERI", "AMD Radeon(TM) R7 Graphics"}, 53 {"KABINI", "AMD Radeon HD 8400 / R3 Series"}, 54 {"BONAIRE", "AMD Radeon HD 8770"}, 55 {"OLAND", "AMD Radeon HD 8670"}, 56 {"HAINAN", "AMD Radeon HD 8600M Series"}, 57 {"TAHITI", "AMD Radeon HD 7900 Series"}, 58 {"PITCAIRN", "AMD Radeon HD 7800 Series"}, 59 {"CAPE VERDE", "AMD Radeon HD 7700 Series"}, 60 {"ARUBA", "AMD Radeon HD 7660D"}, 61 {"CAYMAN", "AMD Radeon HD 6900 Series"}, 62 {"BARTS", "AMD Radeon HD 6800 Series"}, 63 {"TURKS", "AMD Radeon HD 6600 Series"}, 64 {"SUMO2", "AMD Radeon HD 6410D"}, 65 {"SUMO", "AMD Radeon HD 6550D"}, 66 {"CAICOS", "AMD Radeon HD 6400 Series"}, 67 {"PALM", "AMD Radeon HD 6300 series Graphics"}, 68 {"HEMLOCK", "ATI Radeon HD 5900 Series"}, 69 {"CYPRESS", "ATI Radeon HD 5800 Series"}, 70 {"JUNIPER", "ATI Radeon HD 5700 Series"}, 71 {"REDWOOD", "ATI Radeon HD 5600 Series"}, 72 {"CEDAR", "ATI Radeon HD 5500 Series"}, 73 {"R700", "ATI Radeon HD 4800 Series"}, 74 {"RV790", "ATI Radeon HD 4800 Series"}, 75 {"RV770", "ATI Radeon HD 4800 Series"}, 76 {"RV740", "ATI Radeon HD 4700 Series"}, 77 {"RV730", "ATI Radeon HD 4600 Series"}, 78 {"RV710", "ATI Radeon HD 4350"}, 79 {"RS880", "ATI Mobility Radeon HD 4200"}, 80 {"RS780", "ATI Radeon HD 3200 Graphics"}, 81 {"R680", "ATI Radeon HD 2900 XT"}, 82 {"R600", "ATI Radeon HD 2900 XT"}, 83 {"RV670", "ATI Radeon HD 2900 XT"}, 84 {"RV635", "ATI Mobility Radeon HD 2600"}, 85 {"RV630", "ATI Mobility Radeon HD 2600"}, 86 {"RV620", "ATI Mobility Radeon HD 2350"}, 87 {"RV610", "ATI Mobility Radeon HD 2350"}, 88 {"R580", "ATI Radeon X1600 Series"}, 89 {"R520", "ATI Radeon X1600 Series"}, 90 {"RV570", "ATI Radeon X1600 Series"}, 91 {"RV560", "ATI Radeon X1600 Series"}, 92 {"RV535", "ATI Radeon X1600 Series"}, 93 {"RV530", "ATI Radeon X1600 Series"}, 94 {"RV516", "ATI Radeon X700 SE"}, 95 {"RV515", "ATI Radeon X700 SE"}, 96 {"R481", "ATI Radeon X700 SE"}, 97 {"R480", "ATI Radeon X700 SE"}, 98 {"R430", "ATI Radeon X700 SE"}, 99 {"R423", "ATI Radeon X700 SE"}, 100 {"R420", "ATI Radeon X700 SE"}, 101 {"R410", "ATI Radeon X700 SE"}, 102 {"RV410", "ATI Radeon X700 SE"}, 103 {"RS740", "ATI RADEON XPRESS 200M Series"}, 104 {"RS690", "ATI RADEON XPRESS 200M Series"}, 105 {"RS600", "ATI RADEON XPRESS 200M Series"}, 106 {"RS485", "ATI RADEON XPRESS 200M Series"}, 107 {"RS482", "ATI RADEON XPRESS 200M Series"}, 108 {"RS480", "ATI RADEON XPRESS 200M Series"}, 109 {"RS400", "ATI RADEON XPRESS 200M Series"}, 110 {"R360", "ATI Radeon 9500"}, 111 {"R350", "ATI Radeon 9500"}, 112 {"R300", "ATI Radeon 9500"}, 113 {"RV370", "ATI Radeon 9500"}, 114 {"RV360", "ATI Radeon 9500"}, 115 {"RV351", "ATI Radeon 9500"}, 116 {"RV350", "ATI Radeon 9500"}, 117 }, 118 cards_nvidia[] = 119 { 120 {"NV124", "NVIDIA GeForce GTX 970"}, 121 {"NV117", "NVIDIA GeForce GTX 750"}, 122 {"NVF1", "NVIDIA GeForce GTX 780 Ti"}, 123 {"NVF0", "NVIDIA GeForce GTX 780"}, 124 {"NVE6", "NVIDIA GeForce GTX 770M"}, 125 {"NVE4", "NVIDIA GeForce GTX 680"}, 126 {"NVD9", "NVIDIA GeForce GT 520"}, 127 {"NVCF", "NVIDIA GeForce GTX 550 Ti"}, 128 {"NVCE", "NVIDIA GeForce GTX 560"}, 129 {"NVC8", "NVIDIA GeForce GTX 570"}, 130 {"NVC4", "NVIDIA GeForce GTX 460"}, 131 {"NVC3", "NVIDIA GeForce GT 440"}, 132 {"NVC1", "NVIDIA GeForce GT 420"}, 133 {"NVC0", "NVIDIA GeForce GTX 480"}, 134 {"NVAF", "NVIDIA GeForce GT 320M"}, 135 {"NVAC", "NVIDIA GeForce 8200"}, 136 {"NVAA", "NVIDIA GeForce 8200"}, 137 {"NVA8", "NVIDIA GeForce 210"}, 138 {"NVA5", "NVIDIA GeForce GT 220"}, 139 {"NVA3", "NVIDIA GeForce GT 240"}, 140 {"NVA0", "NVIDIA GeForce GTX 280"}, 141 {"NV98", "NVIDIA GeForce 9200"}, 142 {"NV96", "NVIDIA GeForce 9400 GT"}, 143 {"NV94", "NVIDIA GeForce 9600 GT"}, 144 {"NV92", "NVIDIA GeForce 9800 GT"}, 145 {"NV86", "NVIDIA GeForce 8500 GT"}, 146 {"NV84", "NVIDIA GeForce 8600 GT"}, 147 {"NV50", "NVIDIA GeForce 8800 GTX"}, 148 {"NV68", "NVIDIA GeForce 6200"}, 149 {"NV67", "NVIDIA GeForce 6200"}, 150 {"NV63", "NVIDIA GeForce 6200"}, 151 {"NV4E", "NVIDIA GeForce 6200"}, 152 {"NV4C", "NVIDIA GeForce 6200"}, 153 {"NV4B", "NVIDIA GeForce 7600 GT"}, 154 {"NV4A", "NVIDIA GeForce 6200"}, 155 {"NV49", "NVIDIA GeForce 7800 GT"}, 156 {"NV47", "NVIDIA GeForce 7800 GT"}, 157 {"NV46", "NVIDIA GeForce Go 7400",}, 158 {"NV45", "NVIDIA GeForce 6800"}, 159 {"NV44", "NVIDIA GeForce 6200"}, 160 {"NV43", "NVIDIA GeForce 6600 GT"}, 161 {"NV42", "NVIDIA GeForce 6800"}, 162 {"NV41", "NVIDIA GeForce 6800"}, 163 {"NV40", "NVIDIA GeForce 6800"}, 164 {"NV38", "NVIDIA GeForce FX 5800"}, 165 {"NV36", "NVIDIA GeForce FX 5800"}, 166 {"NV35", "NVIDIA GeForce FX 5800"}, 167 {"NV34", "NVIDIA GeForce FX 5200"}, 168 {"NV31", "NVIDIA GeForce FX 5600"}, 169 {"NV30", "NVIDIA GeForce FX 5800"}, 170 {"nv28", "NVIDIA GeForce4 Ti 4200"}, 171 {"nv25", "NVIDIA GeForce4 Ti 4200"}, 172 {"nv20", "NVIDIA GeForce3"}, 173 {"nv1F", "NVIDIA GeForce4 MX 460"}, 174 {"nv1A", "NVIDIA GeForce2 GTS/GeForce2 Pro"}, 175 {"nv18", "NVIDIA GeForce4 MX 460"}, 176 {"nv17", "NVIDIA GeForce4 MX 460"}, 177 {"nv16", "NVIDIA GeForce2 GTS/GeForce2 Pro"}, 178 {"nv15", "NVIDIA GeForce2 GTS/GeForce2 Pro"}, 179 {"nv11", "NVIDIA GeForce2 MX/MX 400"}, 180 {"nv10", "NVIDIA GeForce 256"}, 181 }, 182 cards_vmware[] = 183 { 184 {"SVGA3D", "VMware SVGA 3D (Microsoft Corporation - WDDM)"}, 185 }, 186 cards_intel[] = 187 { 188 {"Haswell Mobile", "Intel(R) Haswell Mobile"}, 189 {"Ivybridge Server", "Intel(R) Ivybridge Server"}, 190 {"Ivybridge Mobile", "Intel(R) Ivybridge Mobile"}, 191 {"Ivybridge Desktop", "Intel(R) Ivybridge Desktop"}, 192 {"Sandybridge Server", "Intel(R) Sandybridge Server"}, 193 {"Sandybridge Mobile", "Intel(R) Sandybridge Mobile"}, 194 {"Sandybridge Desktop", "Intel(R) Sandybridge Desktop"}, 195 {"Ironlake Mobile", "Intel(R) Ironlake Mobile"}, 196 {"Ironlake Desktop", "Intel(R) Ironlake Desktop"}, 197 {"B43", "Intel(R) B43"}, 198 {"G41", "Intel(R) G41"}, 199 {"G45", "Intel(R) G45/G43"}, 200 {"Q45", "Intel(R) Q45/Q43"}, 201 {"Integrated Graphics Device", "Intel(R) Integrated Graphics Device"}, 202 {"GM45", "Mobile Intel(R) GM45 Express Chipset Family"}, 203 {"965GME", "Intel(R) 965GME"}, 204 {"965GM", "Mobile Intel(R) 965 Express Chipset Family"}, 205 {"946GZ", "Intel(R) 946GZ"}, 206 {"965G", "Intel(R) 965G"}, 207 {"965Q", "Intel(R) 965Q"}, 208 {"Pineview M", "Intel(R) IGD"}, 209 {"Pineview G", "Intel(R) IGD"}, 210 {"IGD", "Intel(R) IGD"}, 211 {"Q33", "Intel(R) Q33"}, 212 {"G33", "Intel(R) G33"}, 213 {"Q35", "Intel(R) Q35"}, 214 {"945GME", "Intel(R) 945GME"}, 215 {"945GM", "Mobile Intel(R) 945GM Express Chipset Family"}, 216 {"945G", "Intel(R) 945G"}, 217 {"915GM", "Mobile Intel(R) 915GM/GMS,910GML Express Chipset Family"}, 218 {"E7221G", "Intel(R) E7221G"}, 219 {"915G", "Intel(R) 82915G/GV/910GL Express Chipset Family"}, 220 {"865G", "Intel(R) 82865G Graphics Controller"}, 221 {"845G", "Intel(R) 845G"}, 222 {"855GM", "Intel(R) 82852/82855 GM/GME Graphics Controller"}, 223 {"830M", "Intel(R) 82830M Graphics Controller"}, 224 }; 225 226 /* override VendorId, DeviceId and Description for unknown vendors */ 227 void 228 d3d_match_vendor_id( D3DADAPTER_IDENTIFIER9* drvid, 229 unsigned fallback_ven, 230 unsigned fallback_dev, 231 const char* fallback_name ) 232 { 233 if (drvid->VendorId == HW_VENDOR_INTEL || 234 drvid->VendorId == HW_VENDOR_VMWARE || 235 drvid->VendorId == HW_VENDOR_AMD || 236 drvid->VendorId == HW_VENDOR_NVIDIA) 237 return; 238 239 DBG("unknown vendor 0x4%x, emulating 0x4%x\n", drvid->VendorId, fallback_ven); 240 drvid->VendorId = fallback_ven; 241 drvid->DeviceId = fallback_dev; 242 strncpy(drvid->Description, fallback_name, sizeof(drvid->Description)); 243 } 244 245 /* fill in driver name and version */ 246 void d3d_fill_driver_version(D3DADAPTER_IDENTIFIER9* drvid) { 247 switch (drvid->VendorId) { 248 case HW_VENDOR_INTEL: 249 drvid->DriverVersionLowPart = 0x000A0682; 250 drvid->DriverVersionHighPart = 0x0006000F; 251 strncpy(drvid->Driver, "igdumd32.dll", sizeof(drvid->Driver)); 252 break; 253 case HW_VENDOR_VMWARE: 254 drvid->DriverVersionLowPart = 0x0001046E; 255 drvid->DriverVersionHighPart = 0x0006000E; 256 strncpy(drvid->Driver, "vm3dum.dll", sizeof(drvid->Driver)); 257 break; 258 case HW_VENDOR_AMD: 259 drvid->DriverVersionLowPart = 0x000A0500; 260 drvid->DriverVersionHighPart = 0x00060011; 261 strncpy(drvid->Driver, "atiumdag.dll", sizeof(drvid->Driver)); 262 break; 263 case HW_VENDOR_NVIDIA: 264 drvid->DriverVersionLowPart = 0x000D0FD4; 265 drvid->DriverVersionHighPart = 0x00060012; 266 strncpy(drvid->Driver, "nvd3dum.dll", sizeof(drvid->Driver)); 267 break; 268 default: 269 break; 270 } 271 } 272 273 /* try to match the device name and override it with Windows like device names */ 274 void d3d_fill_cardname(D3DADAPTER_IDENTIFIER9* drvid) { 275 unsigned i; 276 switch (drvid->VendorId) { 277 case HW_VENDOR_INTEL: 278 for (i = 0; i < sizeof(cards_intel) / sizeof(cards_intel[0]); i++) { 279 if (strstr(drvid->Description, cards_intel[i].mesaname)) { 280 strncpy(drvid->Description, cards_intel[i].d3d9name, sizeof(drvid->Description)); 281 return; 282 } 283 } 284 /* use a fall-back if nothing matches */ 285 DBG("Unknown card name %s!\n", drvid->DeviceName); 286 strncpy(drvid->Description, cards_intel[0].d3d9name, sizeof(drvid->Description)); 287 break; 288 case HW_VENDOR_VMWARE: 289 for (i = 0; i < sizeof(cards_vmware) / sizeof(cards_vmware[0]); i++) { 290 if (strstr(drvid->Description, cards_vmware[i].mesaname)) { 291 strncpy(drvid->Description, cards_vmware[i].d3d9name, sizeof(drvid->Description)); 292 return; 293 } 294 } 295 /* use a fall-back if nothing matches */ 296 DBG("Unknown card name %s!\n", drvid->DeviceName); 297 strncpy(drvid->Description, cards_vmware[0].d3d9name, sizeof(drvid->Description)); 298 break; 299 case HW_VENDOR_AMD: 300 for (i = 0; i < sizeof(cards_amd) / sizeof(cards_amd[0]); i++) { 301 if (strstr(drvid->Description, cards_amd[i].mesaname)) { 302 strncpy(drvid->Description, cards_amd[i].d3d9name, sizeof(drvid->Description)); 303 return; 304 } 305 } 306 /* use a fall-back if nothing matches */ 307 DBG("Unknown card name %s!\n", drvid->DeviceName); 308 strncpy(drvid->Description, cards_amd[0].d3d9name, sizeof(drvid->Description)); 309 break; 310 case HW_VENDOR_NVIDIA: 311 for (i = 0; i < sizeof(cards_nvidia) / sizeof(cards_nvidia[0]); i++) { 312 if (strstr(drvid->Description, cards_nvidia[i].mesaname)) { 313 strncpy(drvid->Description, cards_nvidia[i].d3d9name, sizeof(drvid->Description)); 314 return; 315 } 316 } 317 /* use a fall-back if nothing matches */ 318 DBG("Unknown card name %s!\n", drvid->DeviceName); 319 strncpy(drvid->Description, cards_nvidia[0].d3d9name, sizeof(drvid->Description)); 320 break; 321 default: 322 break; 323 } 324 } 325