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