As much as possible at least. Some applications expect the GL_RENDERER strings to be shorter than 64 chars, as they copy it to some local buffer. They also seem to crash after GL_VENDOR call, possibly expecting native names too, so lets try to match both.
The GPU name table is taken from wined3d, and it should then be possible to get rid of the names there and always use the descriptions from the registry / GL_RENDERER strings instead. The vendor names differ between OpenGL and the registry on Windows, GL_VENDOR names are taken from https://feedback.wildfiregames.com/report/opengl/feature/GL_VENDOR.
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58831 --- dlls/win32u/sysparams.c | 30 ++++++++++++------------------ dlls/wineandroid.drv/init.c | 2 +- dlls/winewayland.drv/display.c | 2 +- dlls/winex11.drv/xinerama.c | 1 - dlls/winex11.drv/xrandr.c | 1 - 5 files changed, 14 insertions(+), 22 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 0a578e77b78..9b05351b432 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1119,17 +1119,15 @@ static const char* driver_vendor_to_name( UINT16 vendor ) static BOOL write_gpu_to_registry( const struct gpu *gpu, const struct pci_id *pci, ULONGLONG memory_size ) { - const WCHAR *desc; + unsigned int size, name_size = (wcslen( gpu->name ) + 1) * sizeof(WCHAR); char buffer[4096], *tmp; WCHAR bufferW[512]; - unsigned int size; HKEY subkey; LARGE_INTEGER ft; ULONG value; HKEY hkey;
static const BOOL present = TRUE; - static const WCHAR wine_adapterW[] = {'W','i','n','e',' ','A','d','a','p','t','e','r',0}; static const WCHAR driver_date_dataW[] = {'D','r','i','v','e','r','D','a','t','e','D','a','t','a',0}; static const WCHAR adapter_stringW[] = @@ -1195,7 +1193,7 @@ static BOOL write_gpu_to_registry( const struct gpu *gpu, const struct pci_id *p
if ((subkey = reg_create_ascii_key( hkey, devpkey_device_driver_desc, 0, NULL ))) { - set_reg_value( subkey, NULL, 0xffff0000 | DEVPROP_TYPE_STRING, gpu->name, (wcslen( gpu->name ) + 1) * sizeof(WCHAR) ); + set_reg_value( subkey, NULL, 0xffff0000 | DEVPROP_TYPE_STRING, gpu->name, name_size ); NtClose( subkey ); }
@@ -1225,9 +1223,7 @@ static BOOL write_gpu_to_registry( const struct gpu *gpu, const struct pci_id *p NtClose( subkey ); }
- desc = gpu->name; - if (!desc[0]) desc = wine_adapterW; - set_reg_value( hkey, device_descW, REG_SZ, desc, (lstrlenW( desc ) + 1) * sizeof(WCHAR) ); + set_reg_value( hkey, device_descW, REG_SZ, gpu->name, name_size );
if ((subkey = reg_create_ascii_key( hkey, "Device Parameters", 0, NULL ))) { @@ -1263,14 +1259,11 @@ static BOOL write_gpu_to_registry( const struct gpu *gpu, const struct pci_id *p if (!(hkey = reg_create_ascii_key( control_key, buffer, 0, NULL ))) return FALSE;
set_reg_value( hkey, driver_dateW, REG_SZ, bufferW, format_date( bufferW, ft.QuadPart )); - set_reg_value( hkey, driver_date_dataW, REG_BINARY, &ft, sizeof(ft) ); - - size = (lstrlenW( desc ) + 1) * sizeof(WCHAR); - set_reg_value( hkey, driver_descW, REG_SZ, desc, size ); - set_reg_value( hkey, adapter_stringW, REG_SZ, desc, size ); - set_reg_value( hkey, bios_stringW, REG_SZ, desc, size ); - set_reg_value( hkey, chip_typeW, REG_SZ, desc, size ); + set_reg_value( hkey, driver_descW, REG_SZ, gpu->name, name_size ); + set_reg_value( hkey, adapter_stringW, REG_SZ, gpu->name, name_size ); + set_reg_value( hkey, bios_stringW, REG_SZ, gpu->name, name_size ); + set_reg_value( hkey, chip_typeW, REG_SZ, gpu->name, name_size ); set_reg_value( hkey, dac_typeW, REG_SZ, ramdacW, sizeof(ramdacW) );
/* If we failed to retrieve the gpu memory size set a default of 1Gb */ @@ -1298,7 +1291,7 @@ static BOOL write_gpu_to_registry( const struct gpu *gpu, const struct pci_id *p asciiz_to_unicode( bufferW, "DriverVersion" ); set_reg_value( hkey, bufferW, REG_QWORD, &ver, sizeof(ver) ); asciiz_to_unicode( bufferW, "Description" ); - set_reg_value( hkey, bufferW, REG_SZ, desc, (lstrlenW( desc ) + 1) * sizeof(WCHAR) ); + set_reg_value( hkey, bufferW, REG_SZ, gpu->name, name_size ); if (pci->vendor && pci->device) { asciiz_to_unicode( bufferW, "DeviceId" ); @@ -1383,8 +1376,9 @@ static void add_gpu( const char *name, const struct pci_id *pci_id, const GUID *
if (!pci_id->vendor && !pci_id->device && vulkan_gpu) pci_id = &vulkan_gpu->pci_id;
- if ((!name || !strcmp( name, "Wine GPU" )) && vulkan_gpu) name = vulkan_gpu->name; - if (name) RtlUTF8ToUnicodeN( gpu->name, sizeof(gpu->name) - sizeof(WCHAR), &len, name, strlen( name ) ); + if (!name) name = "Wine Adapter"; + if (!strcmp( name, "Wine Adapter" ) && vulkan_gpu) name = vulkan_gpu->name; + RtlUTF8ToUnicodeN( gpu->name, sizeof(gpu->name) - sizeof(WCHAR), &len, name, strlen( name ) );
snprintf( gpu->path, sizeof(gpu->path), "PCI\VEN_%04X&DEV_%04X&SUBSYS_%08X&REV_%02X\%08X", pci_id->vendor, pci_id->device, pci_id->subsystem, pci_id->revision, gpu->index ); @@ -2277,7 +2271,7 @@ static NTSTATUS default_update_display_devices( struct device_manager_ctx *ctx ) DEVMODEW mode = {.dmSize = sizeof(mode)}; struct source *source;
- add_gpu( "Wine GPU", &pci_id, NULL, ctx ); + add_gpu( NULL, &pci_id, NULL, ctx ); add_source( "Default", source_flags, system_dpi, ctx );
assert( !list_empty( &sources ) ); diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index da889beacb6..472de7b8317 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -283,7 +283,7 @@ UINT ANDROID_UpdateDisplayDevices( const struct gdi_device_manager *device_manag UINT dpi = NtUserGetSystemDpiForProcess( NULL ); DEVMODEW current = mode;
- device_manager->add_gpu( "Wine GPU", &pci_id, NULL, param ); + device_manager->add_gpu( NULL, &pci_id, NULL, param ); device_manager->add_source( "Default", source_flags, dpi, param ); device_manager->add_monitor( &gdi_monitor, param );
diff --git a/dlls/winewayland.drv/display.c b/dlls/winewayland.drv/display.c index 851c9638252..b2a94289abb 100644 --- a/dlls/winewayland.drv/display.c +++ b/dlls/winewayland.drv/display.c @@ -193,7 +193,7 @@ static void wayland_add_device_gpu(const struct gdi_device_manager *device_manag
TRACE("\n");
- device_manager->add_gpu("Wine GPU", &pci_id, NULL, param); + device_manager->add_gpu(NULL, &pci_id, NULL, param); }
static void wayland_add_device_source(const struct gdi_device_manager *device_manager, diff --git a/dlls/winex11.drv/xinerama.c b/dlls/winex11.drv/xinerama.c index 5086f3ee766..aea6be0c5a0 100644 --- a/dlls/winex11.drv/xinerama.c +++ b/dlls/winex11.drv/xinerama.c @@ -188,7 +188,6 @@ static BOOL xinerama_get_gpus( struct x11drv_gpu **new_gpus, int *count, BOOL ge if (!gpus) return FALSE;
- gpus[0].name = strdup( "Wine GPU" ); *new_gpus = gpus; *count = 1;
diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index 979cbc8645f..cae63691ecf 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -850,7 +850,6 @@ static BOOL xrandr14_get_gpus( struct x11drv_gpu **new_gpus, int *count, BOOL ge if (!provider_resources->nproviders) { WARN("XRandR implementation doesn't report any providers, faking one.\n"); - gpus[0].name = strdup( "Wine GPU" ); *new_gpus = gpus; *count = 1; ret = TRUE;
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58831 --- dlls/win32u/sysparams.c | 338 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 337 insertions(+), 1 deletion(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 9b05351b432..1e778341d23 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1116,6 +1116,342 @@ static const char* driver_vendor_to_name( UINT16 vendor ) } }
+static const char *gpu_device_name( UINT16 vendor, UINT16 device, const char *default_name ) +{ + switch (MAKELONG(vendor, device)) + { + /* Nvidia cards */ + case MAKELONG(0x10de, 0x0018): return "NVIDIA RIVA 128"; + case MAKELONG(0x10de, 0x0020): return "NVIDIA RIVA TNT"; + case MAKELONG(0x10de, 0x0028): return "NVIDIA RIVA TNT2/TNT2 Pro"; + case MAKELONG(0x10de, 0x0100): return "NVIDIA GeForce 256"; + case MAKELONG(0x10de, 0x0150): return "NVIDIA GeForce2 GTS/GeForce2 Pro"; + case MAKELONG(0x10de, 0x0110): return "NVIDIA GeForce2 MX/MX 400"; + case MAKELONG(0x10de, 0x0200): return "NVIDIA GeForce3"; + case MAKELONG(0x10de, 0x0170): return "NVIDIA GeForce4 MX 460"; + case MAKELONG(0x10de, 0x0253): return "NVIDIA GeForce4 Ti 4200"; + case MAKELONG(0x10de, 0x0320): return "NVIDIA GeForce FX 5200"; + case MAKELONG(0x10de, 0x0312): return "NVIDIA GeForce FX 5600"; + case MAKELONG(0x10de, 0x0302): return "NVIDIA GeForce FX 5800"; + case MAKELONG(0x10de, 0x014f): return "NVIDIA GeForce 6200"; + case MAKELONG(0x10de, 0x0140): return "NVIDIA GeForce 6600 GT"; + case MAKELONG(0x10de, 0x0041): return "NVIDIA GeForce 6800"; + case MAKELONG(0x10de, 0x01d7): return "NVIDIA GeForce Go 7300"; + case MAKELONG(0x10de, 0x01d8): return "NVIDIA GeForce Go 7400"; + case MAKELONG(0x10de, 0x0391): return "NVIDIA GeForce 7600 GT"; + case MAKELONG(0x10de, 0x0092): return "NVIDIA GeForce 7800 GT"; + case MAKELONG(0x10de, 0x0849): return "NVIDIA GeForce 8200"; + case MAKELONG(0x10de, 0x084b): return "NVIDIA GeForce 8200"; + case MAKELONG(0x10de, 0x0423): return "NVIDIA GeForce 8300 GS"; + case MAKELONG(0x10de, 0x0404): return "NVIDIA GeForce 8400 GS"; + case MAKELONG(0x10de, 0x0421): return "NVIDIA GeForce 8500 GT"; + case MAKELONG(0x10de, 0x0402): return "NVIDIA GeForce 8600 GT"; + case MAKELONG(0x10de, 0x0407): return "NVIDIA GeForce 8600M GT"; + case MAKELONG(0x10de, 0x0193): return "NVIDIA GeForce 8800 GTS"; + case MAKELONG(0x10de, 0x0191): return "NVIDIA GeForce 8800 GTX"; + case MAKELONG(0x10de, 0x086d): return "NVIDIA GeForce 9200"; + case MAKELONG(0x10de, 0x086c): return "NVIDIA GeForce 9300"; + case MAKELONG(0x10de, 0x0863): return "NVIDIA GeForce 9400M"; + case MAKELONG(0x10de, 0x042c): return "NVIDIA GeForce 9400 GT"; + case MAKELONG(0x10de, 0x0640): return "NVIDIA GeForce 9500 GT"; + case MAKELONG(0x10de, 0x0622): return "NVIDIA GeForce 9600 GT"; + case MAKELONG(0x10de, 0x064a): return "NVIDIA GeForce 9700M GT"; + case MAKELONG(0x10de, 0x0614): return "NVIDIA GeForce 9800 GT"; + case MAKELONG(0x10de, 0x0a23): return "NVIDIA GeForce 210"; + case MAKELONG(0x10de, 0x0a20): return "NVIDIA GeForce GT 220"; + case MAKELONG(0x10de, 0x0ca3): return "NVIDIA GeForce GT 240"; + case MAKELONG(0x10de, 0x0615): return "NVIDIA GeForce GTS 250"; + case MAKELONG(0x10de, 0x05e2): return "NVIDIA GeForce GTX 260"; + case MAKELONG(0x10de, 0x05e6): return "NVIDIA GeForce GTX 275"; + case MAKELONG(0x10de, 0x05e1): return "NVIDIA GeForce GTX 280"; + case MAKELONG(0x10de, 0x0a7a): return "NVIDIA GeForce 315M"; + case MAKELONG(0x10de, 0x08a3): return "NVIDIA GeForce 320M"; + case MAKELONG(0x10de, 0x0a2d): return "NVIDIA GeForce GT 320M"; + case MAKELONG(0x10de, 0x0a35): return "NVIDIA GeForce GT 325M"; + case MAKELONG(0x10de, 0x0ca0): return "NVIDIA GeForce GT 330"; + case MAKELONG(0x10de, 0x0cb0): return "NVIDIA GeForce GTS 350M"; + case MAKELONG(0x10de, 0x1055): return "NVIDIA GeForce 410M"; + case MAKELONG(0x10de, 0x0de2): return "NVIDIA GeForce GT 420"; + case MAKELONG(0x10de, 0x0df0): return "NVIDIA GeForce GT 425M"; + case MAKELONG(0x10de, 0x0de1): return "NVIDIA GeForce GT 430"; + case MAKELONG(0x10de, 0x0de0): return "NVIDIA GeForce GT 440"; + case MAKELONG(0x10de, 0x0dc4): return "NVIDIA GeForce GTS 450"; + case MAKELONG(0x10de, 0x0e22): return "NVIDIA GeForce GTX 460"; + case MAKELONG(0x10de, 0x0dd1): return "NVIDIA GeForce GTX 460M"; + case MAKELONG(0x10de, 0x06c4): return "NVIDIA GeForce GTX 465"; + case MAKELONG(0x10de, 0x06cd): return "NVIDIA GeForce GTX 470"; + case MAKELONG(0x10de, 0x06c0): return "NVIDIA GeForce GTX 480"; + case MAKELONG(0x10de, 0x1040): return "NVIDIA GeForce GT 520"; + case MAKELONG(0x10de, 0x0dec): return "NVIDIA GeForce GT 525M"; + case MAKELONG(0x10de, 0x0df4): return "NVIDIA GeForce GT 540M"; + case MAKELONG(0x10de, 0x1244): return "NVIDIA GeForce GTX 550 Ti"; + case MAKELONG(0x10de, 0x04b8): return "NVIDIA GeForce GT 555M"; + case MAKELONG(0x10de, 0x1200): return "NVIDIA GeForce GTX 560 Ti"; + case MAKELONG(0x10de, 0x1251): return "NVIDIA GeForce GTX 560M"; + case MAKELONG(0x10de, 0x1201): return "NVIDIA GeForce GTX 560"; + case MAKELONG(0x10de, 0x1081): return "NVIDIA GeForce GTX 570"; + case MAKELONG(0x10de, 0x1080): return "NVIDIA GeForce GTX 580"; + case MAKELONG(0x10de, 0x104a): return "NVIDIA GeForce GT 610"; + case MAKELONG(0x10de, 0x0f00): return "NVIDIA GeForce GT 630"; + case MAKELONG(0x10de, 0x0de9): return "NVIDIA GeForce GT 630M"; + case MAKELONG(0x10de, 0x0fc1): return "NVIDIA GeForce GT 640"; + case MAKELONG(0x10de, 0x0fd2): return "NVIDIA GeForce GT 640M"; + case MAKELONG(0x10de, 0x0fd1): return "NVIDIA GeForce GT 650M"; + case MAKELONG(0x10de, 0x0fc6): return "NVIDIA GeForce GTX 650"; + case MAKELONG(0x10de, 0x11c6): return "NVIDIA GeForce GTX 650 Ti"; + case MAKELONG(0x10de, 0x11c0): return "NVIDIA GeForce GTX 660"; + case MAKELONG(0x10de, 0x0fd4): return "NVIDIA GeForce GTX 660M"; + case MAKELONG(0x10de, 0x1183): return "NVIDIA GeForce GTX 660 Ti"; + case MAKELONG(0x10de, 0x1189): return "NVIDIA GeForce GTX 670"; + case MAKELONG(0x10de, 0x11a1): return "NVIDIA GeForce GTX 670MX"; + case MAKELONG(0x10de, 0x11a7): return "NVIDIA GeForce GTX 675MX"; + case MAKELONG(0x10de, 0x11a2): return "NVIDIA GeForce GTX 675MX"; + case MAKELONG(0x10de, 0x1180): return "NVIDIA GeForce GTX 680"; + case MAKELONG(0x10de, 0x1188): return "NVIDIA GeForce GTX 690"; + case MAKELONG(0x10de, 0x128b): return "NVIDIA GeForce GT 720"; + case MAKELONG(0x10de, 0x1287): return "NVIDIA GeForce GT 730"; + case MAKELONG(0x10de, 0x0fe1): return "NVIDIA GeForce GT 730M"; + case MAKELONG(0x10de, 0x1292): return "NVIDIA GeForce GT 740M"; + case MAKELONG(0x10de, 0x0fe9): return "NVIDIA GeForce GT 750M"; + case MAKELONG(0x10de, 0x0fcd): return "NVIDIA GeForce GT 755M"; + case MAKELONG(0x10de, 0x1381): return "NVIDIA GeForce GTX 750"; + case MAKELONG(0x10de, 0x1380): return "NVIDIA GeForce GTX 750 Ti"; + case MAKELONG(0x10de, 0x1187): return "NVIDIA GeForce GTX 760"; + case MAKELONG(0x10de, 0x1193): return "NVIDIA GeForce GTX 760 Ti"; + case MAKELONG(0x10de, 0x11e2): return "NVIDIA GeForce GTX 765M"; + case MAKELONG(0x10de, 0x11e0): return "NVIDIA GeForce GTX 770M"; + case MAKELONG(0x10de, 0x1184): return "NVIDIA GeForce GTX 770"; + case MAKELONG(0x10de, 0x119d): return "NVIDIA GeForce GTX 775M"; + case MAKELONG(0x10de, 0x1004): return "NVIDIA GeForce GTX 780"; + case MAKELONG(0x10de, 0x119e): return "NVIDIA GeForce GTX 780M"; + case MAKELONG(0x10de, 0x100a): return "NVIDIA GeForce GTX 780 Ti"; + case MAKELONG(0x10de, 0x1005): return "NVIDIA GeForce GTX TITAN"; + case MAKELONG(0x10de, 0x100c): return "NVIDIA GeForce GTX TITAN Black"; + case MAKELONG(0x10de, 0x17c2): return "NVIDIA GeForce GTX TITAN X"; + case MAKELONG(0x10de, 0x1001): return "NVIDIA GeForce GTX TITAN Z"; + case MAKELONG(0x10de, 0x0fed): return "NVIDIA GeForce 820M"; + case MAKELONG(0x10de, 0x1340): return "NVIDIA GeForce 830M"; + case MAKELONG(0x10de, 0x1341): return "NVIDIA GeForce 840M"; + case MAKELONG(0x10de, 0x1344): return "NVIDIA GeForce 845M"; + case MAKELONG(0x10de, 0x1391): return "NVIDIA GeForce GTX 850M"; + case MAKELONG(0x10de, 0x1392): return "NVIDIA GeForce GTX 860M"; + case MAKELONG(0x10de, 0x119a): return "NVIDIA GeForce GTX 860M"; + case MAKELONG(0x10de, 0x1199): return "NVIDIA GeForce GTX 870M"; + case MAKELONG(0x10de, 0x1198): return "NVIDIA GeForce GTX 880M"; + case MAKELONG(0x10de, 0x1347): return "NVIDIA GeForce 940M"; + case MAKELONG(0x10de, 0x1402): return "NVIDIA GeForce GTX 950"; + case MAKELONG(0x10de, 0x139a): return "NVIDIA GeForce GTX 950M"; + case MAKELONG(0x10de, 0x1401): return "NVIDIA GeForce GTX 960"; + case MAKELONG(0x10de, 0x139b): return "NVIDIA GeForce GTX 960M"; + case MAKELONG(0x10de, 0x13c2): return "NVIDIA GeForce GTX 970"; + case MAKELONG(0x10de, 0x13d8): return "NVIDIA GeForce GTX 970M"; + case MAKELONG(0x10de, 0x13c0): return "NVIDIA GeForce GTX 980"; + case MAKELONG(0x10de, 0x17c8): return "NVIDIA GeForce GTX 980 Ti"; + case MAKELONG(0x10de, 0x1d01): return "NVIDIA GeForce GT 1030"; + case MAKELONG(0x10de, 0x1c81): return "NVIDIA GeForce GTX 1050"; + case MAKELONG(0x10de, 0x1c82): return "NVIDIA GeForce GTX 1050 Ti"; + case MAKELONG(0x10de, 0x1c02): return "NVIDIA GeForce GTX 1060 3GB"; + case MAKELONG(0x10de, 0x1c03): return "NVIDIA GeForce GTX 1060"; + case MAKELONG(0x10de, 0x1c20): return "NVIDIA GeForce GTX 1060M"; + case MAKELONG(0x10de, 0x1b81): return "NVIDIA GeForce GTX 1070"; + case MAKELONG(0x10de, 0x1be1): return "NVIDIA GeForce GTX 1070M"; + case MAKELONG(0x10de, 0x1b80): return "NVIDIA GeForce GTX 1080"; + case MAKELONG(0x10de, 0x1be0): return "NVIDIA GeForce GTX 1080M"; + case MAKELONG(0x10de, 0x1b06): return "NVIDIA GeForce GTX 1080 Ti"; + case MAKELONG(0x10de, 0x1b00): return "NVIDIA TITAN X (Pascal)"; + case MAKELONG(0x10de, 0x1d81): return "NVIDIA TITAN V"; + case MAKELONG(0x10de, 0x1f82): return "NVIDIA GeForce GTX 1650"; + case MAKELONG(0x10de, 0x2187): return "NVIDIA GeForce GTX 1650 SUPER"; + case MAKELONG(0x10de, 0x21c4): return "NVIDIA GeForce GTX 1660 SUPER"; + case MAKELONG(0x10de, 0x2182): return "NVIDIA GeForce GTX 1660 Ti"; + case MAKELONG(0x10de, 0x1f08): return "NVIDIA GeForce RTX 2060"; + case MAKELONG(0x10de, 0x1f07): return "NVIDIA GeForce RTX 2070"; + case MAKELONG(0x10de, 0x1e87): return "NVIDIA GeForce RTX 2080"; + case MAKELONG(0x10de, 0x1e07): return "NVIDIA GeForce RTX 2080 Ti"; + case MAKELONG(0x10de, 0x2507): return "NVIDIA GeForce RTX 3050"; + case MAKELONG(0x10de, 0x2544): return "NVIDIA GeForce RTX 3060"; + case MAKELONG(0x10de, 0x2504): return "NVIDIA GeForce RTX 3060 (Low Hash Rate)"; + case MAKELONG(0x10de, 0x2414): return "NVIDIA GeForce RTX 3060 Ti (GA103)"; + case MAKELONG(0x10de, 0x2486): return "NVIDIA GeForce RTX 3060 Ti (GA104)"; + case MAKELONG(0x10de, 0x2489): return "NVIDIA GeForce RTX 3060 Ti (GA104, Low Hash Rate)"; + case MAKELONG(0x10de, 0x2484): return "NVIDIA GeForce RTX 3070"; + case MAKELONG(0x10de, 0x2488): return "NVIDIA GeForce RTX 3070 (Low Hash Rate)"; + case MAKELONG(0x10de, 0x249d): return "NVIDIA GeForce RTX 3070 (mobile)"; + case MAKELONG(0x10de, 0x2482): return "NVIDIA GeForce RTX 3070 Ti"; + case MAKELONG(0x10de, 0x2206): return "NVIDIA GeForce RTX 3080 10GB"; + case MAKELONG(0x10de, 0x2216): return "NVIDIA GeForce RTX 3080 10GB (Low Hash Rate)"; + case MAKELONG(0x10de, 0x220a): return "NVIDIA GeForce RTX 3080 12GB"; + case MAKELONG(0x10de, 0x2208): return "NVIDIA GeForce RTX 3080 Ti"; + case MAKELONG(0x10de, 0x2204): return "NVIDIA GeForce RTX 3090"; + case MAKELONG(0x10de, 0x2203): return "NVIDIA GeForce RTX 3090 Ti"; + case MAKELONG(0x10de, 0x1eb8): return "NVIDIA Tesla T4"; + case MAKELONG(0x10de, 0x2236): return "NVIDIA Ampere A10"; + case MAKELONG(0x10de, 0x2882): return "NVIDIA GeForce RTX 4060"; + case MAKELONG(0x10de, 0x28a0): return "NVIDIA GeForce RTX 4060M"; + case MAKELONG(0x10de, 0x2803): return "NVIDIA GeForce RTX 4060 Ti 8GB"; + case MAKELONG(0x10de, 0x2805): return "NVIDIA GeForce RTX 4060 Ti 16GB"; + case MAKELONG(0x10de, 0x2786): return "NVIDIA GeForce RTX 4070"; + case MAKELONG(0x10de, 0x2783): return "NVIDIA GeForce RTX 4070 SUPER"; + case MAKELONG(0x10de, 0x2782): return "NVIDIA GeForce RTX 4070 Ti"; + case MAKELONG(0x10de, 0x2705): return "NVIDIA GeForce RTX 4070 Ti SUPER"; + case MAKELONG(0x10de, 0x2704): return "NVIDIA GeForce RTX 4080"; + case MAKELONG(0x10de, 0x2702): return "NVIDIA GeForce RTX 4080 SUPER"; + case MAKELONG(0x10de, 0x2684): return "NVIDIA GeForce RTX 4090"; + + /* AMD cards */ + case MAKELONG(0x1002, 0x5246): return "ATI Rage Fury"; + case MAKELONG(0x1002, 0x5144): return "ATI RADEON 7200 SERIES"; + case MAKELONG(0x1002, 0x514c): return "ATI RADEON 8500 SERIES"; + case MAKELONG(0x1002, 0x4144): return "ATI Radeon 9500"; + case MAKELONG(0x1002, 0x5955): return "ATI RADEON XPRESS 200M Series"; + case MAKELONG(0x1002, 0x5e4c): return "ATI Radeon X700 SE"; + case MAKELONG(0x1002, 0x71c2): return "ATI Radeon X1600 Series"; + case MAKELONG(0x1002, 0x94c7): return "ATI Mobility Radeon HD 2350"; + case MAKELONG(0x1002, 0x9581): return "ATI Mobility Radeon HD 2600"; + case MAKELONG(0x1002, 0x9400): return "ATI Radeon HD 2900 XT"; + case MAKELONG(0x1002, 0x9620): return "ATI Radeon HD 3200 Graphics"; + case MAKELONG(0x1002, 0x9515): return "ATI Radeon HD 3850 AGP"; + case MAKELONG(0x1002, 0x9712): return "ATI Mobility Radeon HD 4200"; + case MAKELONG(0x1002, 0x954f): return "ATI Radeon HD 4350"; + case MAKELONG(0x1002, 0x9495): return "ATI Radeon HD 4600 Series"; + case MAKELONG(0x1002, 0x944e): return "ATI Radeon HD 4700 Series"; + case MAKELONG(0x1002, 0x944c): return "ATI Radeon HD 4800 Series"; + case MAKELONG(0x1002, 0x68f9): return "ATI Radeon HD 5400 Series"; + case MAKELONG(0x1002, 0x68d8): return "ATI Radeon HD 5600 Series"; + case MAKELONG(0x1002, 0x68be): return "ATI Radeon HD 5700 Series"; + case MAKELONG(0x1002, 0x6898): return "ATI Radeon HD 5800 Series"; + case MAKELONG(0x1002, 0x689c): return "ATI Radeon HD 5900 Series"; + case MAKELONG(0x1002, 0x9803): return "AMD Radeon HD 6300 series Graphics"; + case MAKELONG(0x1002, 0x6770): return "AMD Radeon HD 6400 Series"; + case MAKELONG(0x1002, 0x9644): return "AMD Radeon HD 6410D"; + case MAKELONG(0x1002, 0x9648): return "AMD Radeon HD 6480G"; + case MAKELONG(0x1002, 0x6760): return "AMD Radeon HD 6490M"; + case MAKELONG(0x1002, 0x9640): return "AMD Radeon HD 6550D"; + case MAKELONG(0x1002, 0x6758): return "AMD Radeon HD 6600 Series"; + case MAKELONG(0x1002, 0x6741): return "AMD Radeon HD 6600M Series"; + case MAKELONG(0x1002, 0x68ba): return "AMD Radeon HD 6700 Series"; + case MAKELONG(0x1002, 0x6739): return "AMD Radeon HD 6800 Series"; + case MAKELONG(0x1002, 0x6719): return "AMD Radeon HD 6900 Series"; + case MAKELONG(0x1002, 0x9901): return "AMD Radeon HD 7660D"; + case MAKELONG(0x1002, 0x683d): return "AMD Radeon HD 7700 Series"; + case MAKELONG(0x1002, 0x6819): return "AMD Radeon HD 7800 Series"; + case MAKELONG(0x1002, 0x6818): return "AMD Radeon HD 7870 Series"; + case MAKELONG(0x1002, 0x679a): return "AMD Radeon HD 7900 Series"; + case MAKELONG(0x1002, 0x6660): return "AMD Radeon HD 8600M Series"; + case MAKELONG(0x1002, 0x6610): return "AMD Radeon HD 8670"; + case MAKELONG(0x1002, 0x665c): return "AMD Radeon HD 8770"; + case MAKELONG(0x1002, 0x9830): return "AMD Radeon HD 8400 / R3 Series"; + case MAKELONG(0x1002, 0x130f): return "AMD Radeon(TM) R7 Graphics"; + case MAKELONG(0x1002, 0x6939): return "AMD Radeon R9 285"; + case MAKELONG(0x1002, 0x67b1): return "AMD Radeon R9 290"; + case MAKELONG(0x1002, 0x67b0): return "AMD Radeon R9 290X"; + case MAKELONG(0x1002, 0x7300): return "AMD Radeon (TM) R9 Fury Series"; + case MAKELONG(0x1002, 0x6821): return "AMD Radeon R9 M370X"; + case MAKELONG(0x1002, 0x6647): return "AMD Radeon R9 M380"; + case MAKELONG(0x1002, 0x6920): return "AMD Radeon R9 M395X"; + case MAKELONG(0x1002, 0x67ef): return "Radeon(TM) RX 460 Graphics"; + case MAKELONG(0x1002, 0x67df): return "Radeon (TM) RX 480 Graphics"; + case MAKELONG(0x1002, 0x73df): return "AMD Radeon RX 6700 XT"; + case MAKELONG(0x1002, 0x687f): return "Radeon RX Vega"; + case MAKELONG(0x1002, 0x69af): return "Radeon Pro Vega 20"; + case MAKELONG(0x1002, 0x15dd): return "AMD Radeon(TM) Vega 10 Mobile Graphics"; + case MAKELONG(0x1002, 0x66af): return "Radeon RX Vega 20"; + case MAKELONG(0x1002, 0x731f): return "Radeon RX 5700 / 5700 XT"; + case MAKELONG(0x1002, 0x7340): return "Radeon RX 5500M"; + case MAKELONG(0x1002, 0x73bf): return "Radeon RX 6800/6800 XT / 6900 XT"; + case MAKELONG(0x1002, 0x7590): return "AMD Radeon RX 9060 XT"; + case MAKELONG(0x1002, 0x73a1): return "Radeon Pro V620"; + case MAKELONG(0x1002, 0x73ae): return "Radeon Pro V620 VF"; + case MAKELONG(0x1002, 0x163f): return "AMD VANGOGH"; + case MAKELONG(0x1002, 0x164e): return "AMD Radeon(TM) Graphics"; + + /* Intel cards */ + case MAKELONG(0x8086, 0x3577): return "Intel(R) 82830M Graphics Controller"; + case MAKELONG(0x8086, 0x3582): return "Intel(R) 82852/82855 GM/GME Graphics Controller"; + case MAKELONG(0x8086, 0x2562): return "Intel(R) 845G"; + case MAKELONG(0x8086, 0x2572): return "Intel(R) 82865G Graphics Controller"; + case MAKELONG(0x8086, 0x2582): return "Intel(R) 82915G/GV/910GL Express Chipset Family"; + case MAKELONG(0x8086, 0x258a): return "Intel(R) E7221G"; + case MAKELONG(0x8086, 0x2592): return "Mobile Intel(R) 915GM/GMS,910GML Express Chipset Family"; + case MAKELONG(0x8086, 0x2772): return "Intel(R) 945G"; + case MAKELONG(0x8086, 0x27a2): return "Mobile Intel(R) 945GM Express Chipset Family"; + case MAKELONG(0x8086, 0x27ae): return "Intel(R) 945GME"; + case MAKELONG(0x8086, 0x29b2): return "Intel(R) Q35"; + case MAKELONG(0x8086, 0x29c2): return "Intel(R) G33"; + case MAKELONG(0x8086, 0x29d2): return "Intel(R) Q33"; + case MAKELONG(0x8086, 0xa001): return "Intel(R) IGD"; + case MAKELONG(0x8086, 0xa011): return "Intel(R) IGD"; + case MAKELONG(0x8086, 0x2992): return "Intel(R) 965Q"; + case MAKELONG(0x8086, 0x2982): return "Intel(R) 965G"; + case MAKELONG(0x8086, 0x2972): return "Intel(R) 946GZ"; + case MAKELONG(0x8086, 0x2a02): return "Mobile Intel(R) 965 Express Chipset Family"; + case MAKELONG(0x8086, 0x2a12): return "Intel(R) 965GME"; + case MAKELONG(0x8086, 0x2a42): return "Mobile Intel(R) GM45 Express Chipset Family"; + case MAKELONG(0x8086, 0x2e02): return "Intel(R) Integrated Graphics Device"; + case MAKELONG(0x8086, 0x2e22): return "Intel(R) G45/G43"; + case MAKELONG(0x8086, 0x2e12): return "Intel(R) Q45/Q43"; + case MAKELONG(0x8086, 0x2e32): return "Intel(R) G41"; + case MAKELONG(0x8086, 0x2e92): return "Intel(R) B43"; + case MAKELONG(0x8086, 0x0042): return "Intel(R) HD Graphics"; + case MAKELONG(0x8086, 0x0046): return "Intel(R) HD Graphics"; + case MAKELONG(0x8086, 0x0122): return "Intel(R) HD Graphics 3000"; + case MAKELONG(0x8086, 0x0126): return "Intel(R) HD Graphics 3000"; + case MAKELONG(0x8086, 0x010a): return "Intel(R) HD Graphics Family"; + case MAKELONG(0x8086, 0x0162): return "Intel(R) HD Graphics 4000"; + case MAKELONG(0x8086, 0x0166): return "Intel(R) HD Graphics 4000"; + case MAKELONG(0x8086, 0x015a): return "Intel(R) HD Graphics Family"; + case MAKELONG(0x8086, 0x0412): return "Intel(R) HD Graphics 4600"; + case MAKELONG(0x8086, 0x0416): return "Intel(R) HD Graphics 4600"; + case MAKELONG(0x8086, 0x0a26): return "Intel(R) HD Graphics 5000"; + case MAKELONG(0x8086, 0x0422): return "Intel(R) HD Graphics 5000"; + case MAKELONG(0x8086, 0x0a22): return "Intel(R) Iris(TM) Graphics 5100"; + case MAKELONG(0x8086, 0x0a2a): return "Intel(R) Iris(TM) Graphics 5100"; + case MAKELONG(0x8086, 0x0a2b): return "Intel(R) Iris(TM) Graphics 5100"; + case MAKELONG(0x8086, 0x0a2e): return "Intel(R) Iris(TM) Graphics 5100"; + case MAKELONG(0x8086, 0x0d22): return "Intel(R) Iris(TM) Pro Graphics 5200"; + case MAKELONG(0x8086, 0x0d26): return "Intel(R) Iris(TM) Pro Graphics 5200"; + case MAKELONG(0x8086, 0x0d2a): return "Intel(R) Iris(TM) Pro Graphics 5200"; + case MAKELONG(0x8086, 0x0d2b): return "Intel(R) Iris(TM) Pro Graphics 5200"; + case MAKELONG(0x8086, 0x0d2e): return "Intel(R) Iris(TM) Pro Graphics 5200"; + case MAKELONG(0x8086, 0x0c22): return "Intel(R) Iris(TM) Pro Graphics 5200"; + case MAKELONG(0x8086, 0x161e): return "Intel(R) HD Graphics 5300"; + case MAKELONG(0x8086, 0x1616): return "Intel(R) HD Graphics 5500"; + case MAKELONG(0x8086, 0x1612): return "Intel(R) HD Graphics 5600"; + case MAKELONG(0x8086, 0x1626): return "Intel(R) HD Graphics 6000"; + case MAKELONG(0x8086, 0x162b): return "Intel(R) Iris(TM) Graphics 6100"; + case MAKELONG(0x8086, 0x1622): return "Intel(R) Iris(TM) Pro Graphics 6200"; + case MAKELONG(0x8086, 0x162a): return "Intel(R) Iris(TM) Pro Graphics P6300"; + case MAKELONG(0x8086, 0x1902): return "Intel(R) HD Graphics 510"; + case MAKELONG(0x8086, 0x1906): return "Intel(R) HD Graphics 510"; + case MAKELONG(0x8086, 0x190b): return "Intel(R) HD Graphics 510"; + case MAKELONG(0x8086, 0x191e): return "Intel(R) HD Graphics 515"; + case MAKELONG(0x8086, 0x1916): return "Intel(R) HD Graphics 520"; + case MAKELONG(0x8086, 0x1921): return "Intel(R) HD Graphics 520"; + case MAKELONG(0x8086, 0x1912): return "Intel(R) HD Graphics 530"; + case MAKELONG(0x8086, 0x191b): return "Intel(R) HD Graphics 530"; + case MAKELONG(0x8086, 0x191d): return "Intel(R) HD Graphics P530"; + case MAKELONG(0x8086, 0x1926): return "Intel(R) Iris(TM) Graphics 540"; + case MAKELONG(0x8086, 0x1927): return "Intel(R) Iris(TM) Graphics 550"; + case MAKELONG(0x8086, 0x192b): return "Intel(R) Iris(TM) Graphics 555"; + case MAKELONG(0x8086, 0x192d): return "Intel(R) Iris(TM) Graphics P555"; + case MAKELONG(0x8086, 0x1932): return "Intel(R) Iris(TM) Pro Graphics 580"; + case MAKELONG(0x8086, 0x193b): return "Intel(R) Iris(TM) Pro Graphics 580"; + case MAKELONG(0x8086, 0x193a): return "Intel(R) Iris(TM) Pro Graphics P580"; + case MAKELONG(0x8086, 0x193d): return "Intel(R) Iris(TM) Pro Graphics P580"; + case MAKELONG(0x8086, 0x87c0): return "Intel(R) UHD Graphics 617"; + case MAKELONG(0x8086, 0x3ea0): return "Intel(R) UHD Graphics 620"; + case MAKELONG(0x8086, 0x591e): return "Intel(R) HD Graphics 615"; + case MAKELONG(0x8086, 0x5916): return "Intel(R) HD Graphics 620"; + case MAKELONG(0x8086, 0x5912): return "Intel(R) HD Graphics 630"; + case MAKELONG(0x8086, 0x591b): return "Intel(R) HD Graphics 630"; + case MAKELONG(0x8086, 0x3e9b): return "Intel(R) UHD Graphics 630"; + case MAKELONG(0x8086, 0x3e91): return "Intel(R) UHD Graphics 630"; + } + + if (!default_name) return "Wine Adapter"; + return default_name; +}; + static BOOL write_gpu_to_registry( const struct gpu *gpu, const struct pci_id *pci, ULONGLONG memory_size ) { @@ -1376,7 +1712,7 @@ static void add_gpu( const char *name, const struct pci_id *pci_id, const GUID *
if (!pci_id->vendor && !pci_id->device && vulkan_gpu) pci_id = &vulkan_gpu->pci_id;
- if (!name) name = "Wine Adapter"; + name = gpu_device_name( pci_id->vendor, pci_id->device, name ); if (!strcmp( name, "Wine Adapter" ) && vulkan_gpu) name = vulkan_gpu->name; RtlUTF8ToUnicodeN( gpu->name, sizeof(gpu->name) - sizeof(WCHAR), &len, name, strlen( name ) );
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58831 --- dlls/opengl32/unix_wgl.c | 5 +++++ dlls/win32u/opengl.c | 17 ++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index f47d9dfef73..2f7cb3c1bb0 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -886,6 +886,11 @@ const GLubyte *wrap_glGetString( TEB *teb, GLenum name )
if ((ret = funcs->p_glGetString( name ))) { + if (name == GL_VENDOR) + { + const char *vendor = funcs->p_wglQueryCurrentRendererStringWINE( WGL_RENDERER_VENDOR_ID_WINE ); + return vendor ? (const GLubyte *)vendor : ret; + } if (name == GL_EXTENSIONS) { struct context *ctx = get_current_context( teb, NULL, NULL ); diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 45935395e6e..4afc417fb5d 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -1044,6 +1044,17 @@ static UINT read_drm_device_prop( const char *name, const char *prop ) return value; }
+static const char *opengl_vendor_to_name( UINT16 vendor, const char *default_name ) +{ + switch (vendor) + { + case 0x8086: return "Intel"; + case 0x1002: return "ATI Technologies Inc."; + case 0x10de: return "NVIDIA Corporation"; + default: return default_name; + } +} + static void init_device_info( struct egl_platform *egl, const struct opengl_funcs *funcs ) { static const UINT versions[] = {46, 45, 44, 43, 42, 41, 40, 33, 32, 31, 30, 21, 20, 15, 14, 13, 12, 11, 10, 0}; @@ -1107,9 +1118,9 @@ static void init_device_info( struct egl_platform *egl, const struct opengl_func funcs->p_eglMakeCurrent( egl->display, EGL_NO_SURFACE, EGL_NO_SURFACE, context );
egl->device_name = (const char *)funcs->p_glGetString( GL_RENDERER ); - egl->vendor_name = (const char *)funcs->p_glGetString( GL_VENDOR ); - TRACE( " - device_name: %s\n", egl->device_name ); - TRACE( " - vendor_name: %s\n", egl->vendor_name ); + egl->vendor_name = opengl_vendor_to_name( egl->vendor_id, (const char *)funcs->p_glGetString( GL_VENDOR ) ); + TRACE( " - device_name: %s\n", debugstr_a( egl->device_name ) ); + TRACE( " - vendor_name: %s\n", debugstr_a( egl->vendor_name ) );
if ((str = (const char *)funcs->p_glGetString( GL_VERSION )) && (str = strrchr( str, ' ' )) && (count = sscanf( str, "%u.%u.%u", &values[0], &values[1], &values[2] )) >= 2)
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58831 --- dlls/opengl32/unix_wgl.c | 5 +++++ dlls/win32u/opengl.c | 2 +- dlls/win32u/sysparams.c | 2 +- dlls/win32u/win32u_private.h | 1 + 4 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 2f7cb3c1bb0..085df429202 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -891,6 +891,11 @@ const GLubyte *wrap_glGetString( TEB *teb, GLenum name ) const char *vendor = funcs->p_wglQueryCurrentRendererStringWINE( WGL_RENDERER_VENDOR_ID_WINE ); return vendor ? (const GLubyte *)vendor : ret; } + if (name == GL_RENDERER) + { + const char *renderer = funcs->p_wglQueryCurrentRendererStringWINE( WGL_RENDERER_DEVICE_ID_WINE ); + return renderer ? (const GLubyte *)renderer : ret; + } if (name == GL_EXTENSIONS) { struct context *ctx = get_current_context( teb, NULL, NULL ); diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 4afc417fb5d..60c80784115 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -1117,7 +1117,7 @@ static void init_device_info( struct egl_platform *egl, const struct opengl_func { funcs->p_eglMakeCurrent( egl->display, EGL_NO_SURFACE, EGL_NO_SURFACE, context );
- egl->device_name = (const char *)funcs->p_glGetString( GL_RENDERER ); + egl->device_name = gpu_device_name( egl->vendor_id, egl->device_id, (const char *)funcs->p_glGetString( GL_RENDERER ) ); egl->vendor_name = opengl_vendor_to_name( egl->vendor_id, (const char *)funcs->p_glGetString( GL_VENDOR ) ); TRACE( " - device_name: %s\n", debugstr_a( egl->device_name ) ); TRACE( " - vendor_name: %s\n", debugstr_a( egl->vendor_name ) ); diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 1e778341d23..5b46c77c3bf 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1116,7 +1116,7 @@ static const char* driver_vendor_to_name( UINT16 vendor ) } }
-static const char *gpu_device_name( UINT16 vendor, UINT16 device, const char *default_name ) +const char *gpu_device_name( UINT16 vendor, UINT16 device, const char *default_name ) { switch (MAKELONG(vendor, device)) { diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 7bbbef49ebc..288fde75f48 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -168,6 +168,7 @@ extern UINT get_thread_dpi(void); extern UINT set_thread_dpi_awareness_context( UINT context ); extern UINT get_thread_dpi_awareness_context(void); extern RECT get_virtual_screen_rect( UINT dpi, MONITOR_DPI_TYPE type ); +extern const char *gpu_device_name( UINT16 vendor, UINT16 device, const char *name ); extern BOOL is_exiting_thread( DWORD tid ); extern POINT map_dpi_point( POINT pt, UINT dpi_from, UINT dpi_to ); extern RECT map_dpi_rect( RECT rect, UINT dpi_from, UINT dpi_to );
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58831 --- dlls/win32u/sysparams.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 5b46c77c3bf..62bf3feb3be 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1359,6 +1359,7 @@ const char *gpu_device_name( UINT16 vendor, UINT16 device, const char *default_n case MAKELONG(0x1002, 0x731f): return "Radeon RX 5700 / 5700 XT"; case MAKELONG(0x1002, 0x7340): return "Radeon RX 5500M"; case MAKELONG(0x1002, 0x73bf): return "Radeon RX 6800/6800 XT / 6900 XT"; + case MAKELONG(0x1002, 0x7480): return "AMD Radeon RX 7600 XT"; case MAKELONG(0x1002, 0x7590): return "AMD Radeon RX 9060 XT"; case MAKELONG(0x1002, 0x73a1): return "Radeon Pro V620"; case MAKELONG(0x1002, 0x73ae): return "Radeon Pro V620 VF";