334 lines
16 KiB
C
334 lines
16 KiB
C
/*
|
|
* Copyright 2015 Patrick Rudolph <siro@das-labor.org>
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
|
* license, and/or sell copies of the Software, and to permit persons to whom
|
|
* the Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice (including the next
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
* Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
|
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
* USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "adapter9.h"
|
|
|
|
#define DBG_CHANNEL DBG_ADAPTER
|
|
|
|
/* prototypes */
|
|
void
|
|
d3d_match_vendor_id( D3DADAPTER_IDENTIFIER9* drvid,
|
|
unsigned fallback_ven,
|
|
unsigned fallback_dev,
|
|
const char* fallback_name );
|
|
void d3d_fill_driver_version(D3DADAPTER_IDENTIFIER9* drvid);
|
|
void d3d_fill_cardname(D3DADAPTER_IDENTIFIER9* drvid);
|
|
|
|
enum d3d_vendor_id
|
|
{
|
|
HW_VENDOR_SOFTWARE = 0x0000,
|
|
HW_VENDOR_AMD = 0x1002,
|
|
HW_VENDOR_NVIDIA = 0x10de,
|
|
HW_VENDOR_VMWARE = 0x15ad,
|
|
HW_VENDOR_INTEL = 0x8086,
|
|
};
|
|
|
|
struct card_lookup_table {
|
|
const char *mesaname;
|
|
const char *d3d9name;
|
|
}
|
|
cards_amd[] = {
|
|
{"HAWAII", "AMD Radeon R9 290"},
|
|
{"KAVERI", "AMD Radeon(TM) R7 Graphics"},
|
|
{"KABINI", "AMD Radeon HD 8400 / R3 Series"},
|
|
{"BONAIRE", "AMD Radeon HD 8770"},
|
|
{"OLAND", "AMD Radeon HD 8670"},
|
|
{"HAINAN", "AMD Radeon HD 8600M Series"},
|
|
{"TAHITI", "AMD Radeon HD 7900 Series"},
|
|
{"PITCAIRN", "AMD Radeon HD 7800 Series"},
|
|
{"CAPE VERDE", "AMD Radeon HD 7700 Series"},
|
|
{"ARUBA", "AMD Radeon HD 7660D"},
|
|
{"CAYMAN", "AMD Radeon HD 6900 Series"},
|
|
{"BARTS", "AMD Radeon HD 6800 Series"},
|
|
{"TURKS", "AMD Radeon HD 6600 Series"},
|
|
{"SUMO2", "AMD Radeon HD 6410D"},
|
|
{"SUMO", "AMD Radeon HD 6550D"},
|
|
{"CAICOS", "AMD Radeon HD 6400 Series"},
|
|
{"PALM", "AMD Radeon HD 6300 series Graphics"},
|
|
{"HEMLOCK", "ATI Radeon HD 5900 Series"},
|
|
{"CYPRESS", "ATI Radeon HD 5800 Series"},
|
|
{"JUNIPER", "ATI Radeon HD 5700 Series"},
|
|
{"REDWOOD", "ATI Radeon HD 5600 Series"},
|
|
{"CEDAR", "ATI Radeon HD 5500 Series"},
|
|
{"R700", "ATI Radeon HD 4800 Series"},
|
|
{"RV790", "ATI Radeon HD 4800 Series"},
|
|
{"RV770", "ATI Radeon HD 4800 Series"},
|
|
{"RV740", "ATI Radeon HD 4700 Series"},
|
|
{"RV730", "ATI Radeon HD 4600 Series"},
|
|
{"RV710", "ATI Radeon HD 4350"},
|
|
{"RS880", "ATI Mobility Radeon HD 4200"},
|
|
{"RS780", "ATI Radeon HD 3200 Graphics"},
|
|
{"R680", "ATI Radeon HD 2900 XT"},
|
|
{"R600", "ATI Radeon HD 2900 XT"},
|
|
{"RV670", "ATI Radeon HD 2900 XT"},
|
|
{"RV635", "ATI Mobility Radeon HD 2600"},
|
|
{"RV630", "ATI Mobility Radeon HD 2600"},
|
|
{"RV620", "ATI Mobility Radeon HD 2350"},
|
|
{"RV610", "ATI Mobility Radeon HD 2350"},
|
|
{"R580", "ATI Radeon X1600 Series"},
|
|
{"R520", "ATI Radeon X1600 Series"},
|
|
{"RV570", "ATI Radeon X1600 Series"},
|
|
{"RV560", "ATI Radeon X1600 Series"},
|
|
{"RV535", "ATI Radeon X1600 Series"},
|
|
{"RV530", "ATI Radeon X1600 Series"},
|
|
{"RV516", "ATI Radeon X700 SE"},
|
|
{"RV515", "ATI Radeon X700 SE"},
|
|
{"R481", "ATI Radeon X700 SE"},
|
|
{"R480", "ATI Radeon X700 SE"},
|
|
{"R430", "ATI Radeon X700 SE"},
|
|
{"R423", "ATI Radeon X700 SE"},
|
|
{"R420", "ATI Radeon X700 SE"},
|
|
{"R410", "ATI Radeon X700 SE"},
|
|
{"RV410", "ATI Radeon X700 SE"},
|
|
{"RS740", "ATI RADEON XPRESS 200M Series"},
|
|
{"RS690", "ATI RADEON XPRESS 200M Series"},
|
|
{"RS600", "ATI RADEON XPRESS 200M Series"},
|
|
{"RS485", "ATI RADEON XPRESS 200M Series"},
|
|
{"RS482", "ATI RADEON XPRESS 200M Series"},
|
|
{"RS480", "ATI RADEON XPRESS 200M Series"},
|
|
{"RS400", "ATI RADEON XPRESS 200M Series"},
|
|
{"R360", "ATI Radeon 9500"},
|
|
{"R350", "ATI Radeon 9500"},
|
|
{"R300", "ATI Radeon 9500"},
|
|
{"RV370", "ATI Radeon 9500"},
|
|
{"RV360", "ATI Radeon 9500"},
|
|
{"RV351", "ATI Radeon 9500"},
|
|
{"RV350", "ATI Radeon 9500"},
|
|
},
|
|
cards_nvidia[] =
|
|
{
|
|
{"NV124", "NVIDIA GeForce GTX 970"},
|
|
{"NV117", "NVIDIA GeForce GTX 750"},
|
|
{"NVF1", "NVIDIA GeForce GTX 780 Ti"},
|
|
{"NVF0", "NVIDIA GeForce GTX 780"},
|
|
{"NVE6", "NVIDIA GeForce GTX 770M"},
|
|
{"NVE4", "NVIDIA GeForce GTX 680"},
|
|
{"NVD9", "NVIDIA GeForce GT 520"},
|
|
{"NVCF", "NVIDIA GeForce GTX 550 Ti"},
|
|
{"NVCE", "NVIDIA GeForce GTX 560"},
|
|
{"NVC8", "NVIDIA GeForce GTX 570"},
|
|
{"NVC4", "NVIDIA GeForce GTX 460"},
|
|
{"NVC3", "NVIDIA GeForce GT 440"},
|
|
{"NVC1", "NVIDIA GeForce GT 420"},
|
|
{"NVC0", "NVIDIA GeForce GTX 480"},
|
|
{"NVAF", "NVIDIA GeForce GT 320M"},
|
|
{"NVAC", "NVIDIA GeForce 8200"},
|
|
{"NVAA", "NVIDIA GeForce 8200"},
|
|
{"NVA8", "NVIDIA GeForce 210"},
|
|
{"NVA5", "NVIDIA GeForce GT 220"},
|
|
{"NVA3", "NVIDIA GeForce GT 240"},
|
|
{"NVA0", "NVIDIA GeForce GTX 280"},
|
|
{"NV98", "NVIDIA GeForce 9200"},
|
|
{"NV96", "NVIDIA GeForce 9400 GT"},
|
|
{"NV94", "NVIDIA GeForce 9600 GT"},
|
|
{"NV92", "NVIDIA GeForce 9800 GT"},
|
|
{"NV86", "NVIDIA GeForce 8500 GT"},
|
|
{"NV84", "NVIDIA GeForce 8600 GT"},
|
|
{"NV50", "NVIDIA GeForce 8800 GTX"},
|
|
{"NV68", "NVIDIA GeForce 6200"},
|
|
{"NV67", "NVIDIA GeForce 6200"},
|
|
{"NV63", "NVIDIA GeForce 6200"},
|
|
{"NV4E", "NVIDIA GeForce 6200"},
|
|
{"NV4C", "NVIDIA GeForce 6200"},
|
|
{"NV4B", "NVIDIA GeForce 7600 GT"},
|
|
{"NV4A", "NVIDIA GeForce 6200"},
|
|
{"NV49", "NVIDIA GeForce 7800 GT"},
|
|
{"NV47", "NVIDIA GeForce 7800 GT"},
|
|
{"NV46", "NVIDIA GeForce Go 7400",},
|
|
{"NV45", "NVIDIA GeForce 6800"},
|
|
{"NV44", "NVIDIA GeForce 6200"},
|
|
{"NV43", "NVIDIA GeForce 6600 GT"},
|
|
{"NV42", "NVIDIA GeForce 6800"},
|
|
{"NV41", "NVIDIA GeForce 6800"},
|
|
{"NV40", "NVIDIA GeForce 6800"},
|
|
{"NV38", "NVIDIA GeForce FX 5800"},
|
|
{"NV36", "NVIDIA GeForce FX 5800"},
|
|
{"NV35", "NVIDIA GeForce FX 5800"},
|
|
{"NV34", "NVIDIA GeForce FX 5200"},
|
|
{"NV31", "NVIDIA GeForce FX 5600"},
|
|
{"NV30", "NVIDIA GeForce FX 5800"},
|
|
{"nv28", "NVIDIA GeForce4 Ti 4200"},
|
|
{"nv25", "NVIDIA GeForce4 Ti 4200"},
|
|
{"nv20", "NVIDIA GeForce3"},
|
|
{"nv1F", "NVIDIA GeForce4 MX 460"},
|
|
{"nv1A", "NVIDIA GeForce2 GTS/GeForce2 Pro"},
|
|
{"nv18", "NVIDIA GeForce4 MX 460"},
|
|
{"nv17", "NVIDIA GeForce4 MX 460"},
|
|
{"nv16", "NVIDIA GeForce2 GTS/GeForce2 Pro"},
|
|
{"nv15", "NVIDIA GeForce2 GTS/GeForce2 Pro"},
|
|
{"nv11", "NVIDIA GeForce2 MX/MX 400"},
|
|
{"nv10", "NVIDIA GeForce 256"},
|
|
},
|
|
cards_vmware[] =
|
|
{
|
|
{"SVGA3D", "VMware SVGA 3D (Microsoft Corporation - WDDM)"},
|
|
},
|
|
cards_intel[] =
|
|
{
|
|
{"Haswell Mobile", "Intel(R) Haswell Mobile"},
|
|
{"Ivybridge Server", "Intel(R) Ivybridge Server"},
|
|
{"Ivybridge Mobile", "Intel(R) Ivybridge Mobile"},
|
|
{"Ivybridge Desktop", "Intel(R) Ivybridge Desktop"},
|
|
{"Sandybridge Server", "Intel(R) Sandybridge Server"},
|
|
{"Sandybridge Mobile", "Intel(R) Sandybridge Mobile"},
|
|
{"Sandybridge Desktop", "Intel(R) Sandybridge Desktop"},
|
|
{"Ironlake Mobile", "Intel(R) Ironlake Mobile"},
|
|
{"Ironlake Desktop", "Intel(R) Ironlake Desktop"},
|
|
{"B43", "Intel(R) B43"},
|
|
{"G41", "Intel(R) G41"},
|
|
{"G45", "Intel(R) G45/G43"},
|
|
{"Q45", "Intel(R) Q45/Q43"},
|
|
{"Integrated Graphics Device", "Intel(R) Integrated Graphics Device"},
|
|
{"GM45", "Mobile Intel(R) GM45 Express Chipset Family"},
|
|
{"965GME", "Intel(R) 965GME"},
|
|
{"965GM", "Mobile Intel(R) 965 Express Chipset Family"},
|
|
{"946GZ", "Intel(R) 946GZ"},
|
|
{"965G", "Intel(R) 965G"},
|
|
{"965Q", "Intel(R) 965Q"},
|
|
{"Pineview M", "Intel(R) IGD"},
|
|
{"Pineview G", "Intel(R) IGD"},
|
|
{"IGD", "Intel(R) IGD"},
|
|
{"Q33", "Intel(R) Q33"},
|
|
{"G33", "Intel(R) G33"},
|
|
{"Q35", "Intel(R) Q35"},
|
|
{"945GME", "Intel(R) 945GME"},
|
|
{"945GM", "Mobile Intel(R) 945GM Express Chipset Family"},
|
|
{"945G", "Intel(R) 945G"},
|
|
{"915GM", "Mobile Intel(R) 915GM/GMS,910GML Express Chipset Family"},
|
|
{"E7221G", "Intel(R) E7221G"},
|
|
{"915G", "Intel(R) 82915G/GV/910GL Express Chipset Family"},
|
|
{"865G", "Intel(R) 82865G Graphics Controller"},
|
|
{"845G", "Intel(R) 845G"},
|
|
{"855GM", "Intel(R) 82852/82855 GM/GME Graphics Controller"},
|
|
{"830M", "Intel(R) 82830M Graphics Controller"},
|
|
};
|
|
|
|
/* override VendorId, DeviceId and Description for unknown vendors */
|
|
void
|
|
d3d_match_vendor_id( D3DADAPTER_IDENTIFIER9* drvid,
|
|
unsigned fallback_ven,
|
|
unsigned fallback_dev,
|
|
const char* fallback_name )
|
|
{
|
|
if (drvid->VendorId == HW_VENDOR_INTEL ||
|
|
drvid->VendorId == HW_VENDOR_VMWARE ||
|
|
drvid->VendorId == HW_VENDOR_AMD ||
|
|
drvid->VendorId == HW_VENDOR_NVIDIA)
|
|
return;
|
|
|
|
DBG("unknown vendor 0x4%x, emulating 0x4%x\n", drvid->VendorId, fallback_ven);
|
|
drvid->VendorId = fallback_ven;
|
|
drvid->DeviceId = fallback_dev;
|
|
snprintf(drvid->Description, sizeof(drvid->Description), "%s", fallback_name);
|
|
}
|
|
|
|
/* fill in driver name and version */
|
|
void d3d_fill_driver_version(D3DADAPTER_IDENTIFIER9* drvid) {
|
|
switch (drvid->VendorId) {
|
|
case HW_VENDOR_INTEL:
|
|
drvid->DriverVersionLowPart = 0x000A0682;
|
|
drvid->DriverVersionHighPart = 0x0006000F;
|
|
strncpy(drvid->Driver, "igdumd32.dll", sizeof(drvid->Driver));
|
|
break;
|
|
case HW_VENDOR_VMWARE:
|
|
drvid->DriverVersionLowPart = 0x0001046E;
|
|
drvid->DriverVersionHighPart = 0x0006000E;
|
|
strncpy(drvid->Driver, "vm3dum.dll", sizeof(drvid->Driver));
|
|
break;
|
|
case HW_VENDOR_AMD:
|
|
drvid->DriverVersionLowPart = 0x000A0500;
|
|
drvid->DriverVersionHighPart = 0x00060011;
|
|
strncpy(drvid->Driver, "atiumdag.dll", sizeof(drvid->Driver));
|
|
break;
|
|
case HW_VENDOR_NVIDIA:
|
|
drvid->DriverVersionLowPart = 0x000D0FD4;
|
|
drvid->DriverVersionHighPart = 0x00060012;
|
|
strncpy(drvid->Driver, "nvd3dum.dll", sizeof(drvid->Driver));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* try to match the device name and override it with Windows like device names */
|
|
void d3d_fill_cardname(D3DADAPTER_IDENTIFIER9* drvid) {
|
|
unsigned i;
|
|
switch (drvid->VendorId) {
|
|
case HW_VENDOR_INTEL:
|
|
for (i = 0; i < sizeof(cards_intel) / sizeof(cards_intel[0]); i++) {
|
|
if (strstr(drvid->Description, cards_intel[i].mesaname)) {
|
|
snprintf(drvid->Description, sizeof(drvid->Description),
|
|
"%s", cards_intel[i].d3d9name);
|
|
return;
|
|
}
|
|
}
|
|
/* use a fall-back if nothing matches */
|
|
DBG("Unknown card name %s!\n", drvid->DeviceName);
|
|
snprintf(drvid->Description, sizeof(drvid->Description),
|
|
"%s", cards_intel[0].d3d9name);
|
|
break;
|
|
case HW_VENDOR_VMWARE:
|
|
for (i = 0; i < sizeof(cards_vmware) / sizeof(cards_vmware[0]); i++) {
|
|
if (strstr(drvid->Description, cards_vmware[i].mesaname)) {
|
|
snprintf(drvid->Description, sizeof(drvid->Description),
|
|
"%s", cards_vmware[i].d3d9name);
|
|
return;
|
|
}
|
|
}
|
|
/* use a fall-back if nothing matches */
|
|
DBG("Unknown card name %s!\n", drvid->DeviceName);
|
|
snprintf(drvid->Description, sizeof(drvid->Description),
|
|
"%s", cards_vmware[0].d3d9name);
|
|
break;
|
|
case HW_VENDOR_AMD:
|
|
for (i = 0; i < sizeof(cards_amd) / sizeof(cards_amd[0]); i++) {
|
|
if (strstr(drvid->Description, cards_amd[i].mesaname)) {
|
|
snprintf(drvid->Description, sizeof(drvid->Description),
|
|
"%s", cards_amd[i].d3d9name);
|
|
return;
|
|
}
|
|
}
|
|
/* use a fall-back if nothing matches */
|
|
DBG("Unknown card name %s!\n", drvid->DeviceName);
|
|
snprintf(drvid->Description, sizeof(drvid->Description),
|
|
"%s", cards_amd[0].d3d9name);
|
|
break;
|
|
case HW_VENDOR_NVIDIA:
|
|
for (i = 0; i < sizeof(cards_nvidia) / sizeof(cards_nvidia[0]); i++) {
|
|
if (strstr(drvid->Description, cards_nvidia[i].mesaname)) {
|
|
snprintf(drvid->Description, sizeof(drvid->Description),
|
|
"%s", cards_nvidia[i].d3d9name);
|
|
return;
|
|
}
|
|
}
|
|
/* use a fall-back if nothing matches */
|
|
DBG("Unknown card name %s!\n", drvid->DeviceName);
|
|
snprintf(drvid->Description, sizeof(drvid->Description),
|
|
"%s", cards_nvidia[0].d3d9name);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|