A RandR provider ID is needed to identify the corresponding GPU.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/winex11.drv/display.c | 13 ++++++++++++-
dlls/winex11.drv/x11drv.h | 2 ++
dlls/winex11.drv/xrandr.c | 2 ++
3 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c
index 1dedf32a52f..0a8d809cc71 100644
--- a/dlls/winex11.drv/display.c
+++ b/dlls/winex11.drv/display.c
@@ -43,11 +43,12 @@ DEFINE_DEVPROPKEY(DEVPROPKEY_GPU_LUID, 0x60b193cb, 0x5276, 0x4d0f, 0x96, 0xfc, 0
DEFINE_DEVPROPKEY(DEVPROPKEY_MONITOR_GPU_LUID, 0xca085853, 0x16ce, 0x48aa, 0xb1, 0x14, 0xde, 0x9c, 0x72, 0x33, 0x42, 0x23, 1);
DEFINE_DEVPROPKEY(DEVPROPKEY_MONITOR_OUTPUT_ID, 0xca085853, 0x16ce, 0x48aa, 0xb1, 0x14, 0xde, 0x9c, 0x72, 0x33, 0x42, 0x23, 2);
-/* Wine specific monitor properties */
+/* Wine specific properties */
DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_STATEFLAGS, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 2);
DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_RCMONITOR, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 3);
DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_RCWORK, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 4);
DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_ADAPTERNAME, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 5);
+DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_GPU_RANDR_PROVIDER_ID, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5c, 2);
static const WCHAR driver_date_dataW[] = {'D','r','i','v','e','r','D','a','t','e','D','a','t','a',0};
static const WCHAR driver_descW[] = {'D','r','i','v','e','r','D','e','s','c',0};
@@ -357,6 +358,16 @@ static BOOL X11DRV_InitGpu(HDEVINFO devinfo, const struct x11drv_gpu *gpu, INT g
(const BYTE *)&present, sizeof(present), 0))
goto done;
+ /* Write WINE_DEVPROPKEY_GPU_RANDR_PROVIDER_ID property */
+ if (gpu->randr_provider_id)
+ {
+ TRACE("RandR provider ID: 0x%s.\n", wine_dbgstr_longlong(gpu->randr_provider_id));
+ if (!SetupDiSetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_GPU_RANDR_PROVIDER_ID,
+ DEVPROP_TYPE_UINT64, (const BYTE *)&gpu->randr_provider_id,
+ sizeof(gpu->randr_provider_id), 0))
+ goto done;
+ }
+
/* Write DEVPROPKEY_GPU_LUID property */
if (!SetupDiGetDevicePropertyW(devinfo, &device_data, &DEVPROPKEY_GPU_LUID, &property_type,
(BYTE *)&luid, sizeof(luid), NULL, 0))
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index a9eaed20cab..d9f8b250f51 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -690,6 +690,8 @@ struct x11drv_gpu
UINT device_id;
UINT subsys_id;
UINT revision_id;
+ /* Optional RandR provider ID. If it's not supported, set it to zero */
+ UINT64 randr_provider_id;
};
/* Represent an adapter in EnumDisplayDevices context */
diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c
index 76e76806c55..ce7efc9deb4 100644
--- a/dlls/winex11.drv/xrandr.c
+++ b/dlls/winex11.drv/xrandr.c
@@ -711,6 +711,7 @@ static BOOL xrandr14_get_gpus( struct x11drv_gpu **new_gpus, int *count )
{
WARN("XRandR implementation doesn't report any providers, faking one.\n");
lstrcpyW( gpus[0].name, wine_adapterW );
+ gpus[0].randr_provider_id = 1;
*new_gpus = gpus;
*count = 1;
ret = TRUE;
@@ -742,6 +743,7 @@ static BOOL xrandr14_get_gpus( struct x11drv_gpu **new_gpus, int *count )
}
gpus[i].id = provider_resources->providers[i];
+ gpus[i].randr_provider_id = provider_resources->providers[i];
MultiByteToWideChar( CP_UTF8, 0, provider_info->name, -1, gpus[i].name, ARRAY_SIZE(gpus[i].name) );
/* PCI IDs are all zero because there is currently no portable way to get it via XRandR. Some AMD drivers report
* their PCI address in the name but many others don't */
--
2.25.1