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