I'm not completely sure what the expectations are regarding these registry key paths, but @afrantzis said Wayland reports adapters in an arbitrary order and this would let us find the right adapter config and their current settings based on their unique name instead.
Other drivers simply format the numeric ID themselves, though might not be 0-based index anymore.
-- v2: win32u: Use named sources instead of struct gdi_adapter. win32u: Rename struct adapter to struct source. win32u: Use a symlink for the logically indexed adapter config key. win32u: Split writing adapter to registry to a separate helper.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 62 +++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 24 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 07b9d46d9eb..d1d49d4c1c4 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1257,40 +1257,26 @@ static void add_gpu( const struct gdi_gpu *gpu, void *param ) ctx->gpu_count++; }
-static void add_adapter( const struct gdi_adapter *adapter, void *param ) +static BOOL write_adapter_to_registry( const struct adapter *adapter, HKEY *adapter_key ) { - struct device_manager_ctx *ctx = param; - unsigned int adapter_index, len; + struct gpu *gpu = adapter->gpu; + unsigned int len, adapter_index = gpu->adapter_count; char name[64], buffer[MAX_PATH]; WCHAR bufferW[MAX_PATH]; HKEY hkey;
- TRACE( "\n" ); - - if (ctx->adapter_key) - { - NtClose( ctx->adapter_key ); - ctx->adapter_key = NULL; - } - - adapter_index = ctx->gpu.adapter_count++; - - memset( &ctx->adapter, 0, sizeof(ctx->adapter) ); - ctx->adapter.gpu = &ctx->gpu; - ctx->adapter.id = ctx->adapter_count++; - - snprintf( buffer, ARRAY_SIZE(buffer), "%s\Video\%s\%04x", control_keyA, ctx->gpu.guid, adapter_index ); + sprintf( buffer, "%s\Video\%s\%04x", control_keyA, gpu->guid, adapter_index ); len = asciiz_to_unicode( bufferW, buffer ) - sizeof(WCHAR);
hkey = reg_create_ascii_key( NULL, buffer, REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK, NULL ); if (!hkey) hkey = reg_create_ascii_key( NULL, buffer, REG_OPTION_VOLATILE | REG_OPTION_OPEN_LINK, NULL );
- sprintf( name, "\Device\Video%u", ctx->adapter.id ); + sprintf( name, "\Device\Video%u", adapter->id ); set_reg_ascii_value( video_key, name, buffer );
if (hkey) { - sprintf( buffer, "%s\Class\%s\%04X", control_keyA, guid_devclass_displayA, ctx->gpu.index ); + sprintf( buffer, "%s\Class\%s\%04X", control_keyA, guid_devclass_displayA, gpu->index ); len = asciiz_to_unicode( bufferW, buffer ) - sizeof(WCHAR); set_reg_value( hkey, symbolic_link_valueW, REG_LINK, bufferW, len ); NtClose( hkey ); @@ -1298,12 +1284,40 @@ static void add_adapter( const struct gdi_adapter *adapter, void *param ) else ERR( "failed to create link key\n" );
/* Following information is Wine specific, it doesn't really exist on Windows. */ - snprintf( buffer, ARRAY_SIZE(buffer), "System\CurrentControlSet\Control\Video\%s\%04x", ctx->gpu.guid, adapter_index ); - ctx->adapter_key = reg_create_ascii_key( config_key, buffer, REG_OPTION_VOLATILE, NULL ); + sprintf( buffer, "System\CurrentControlSet\Control\Video\%s\%04x", gpu->guid, adapter_index ); + *adapter_key = reg_create_ascii_key( config_key, buffer, REG_OPTION_VOLATILE, NULL );
- set_reg_ascii_value( ctx->adapter_key, "GPUID", ctx->gpu.path ); - set_reg_value( ctx->adapter_key, state_flagsW, REG_DWORD, &adapter->state_flags, + set_reg_ascii_value( *adapter_key, "GPUID", gpu->path ); + set_reg_value( *adapter_key, state_flagsW, REG_DWORD, &adapter->state_flags, sizeof(adapter->state_flags) ); + + return TRUE; +} + +static void add_adapter( const struct gdi_adapter *adapter, void *param ) +{ + struct device_manager_ctx *ctx = param; + + TRACE( "\n" ); + + if (ctx->adapter_key) + { + NtClose( ctx->adapter_key ); + ctx->adapter_key = NULL; + } + + memset( &ctx->adapter, 0, sizeof(ctx->adapter) ); + ctx->adapter.gpu = &ctx->gpu; + ctx->adapter.id = ctx->adapter_count; + ctx->adapter.state_flags = adapter->state_flags; + + if (!write_adapter_to_registry( &ctx->adapter, &ctx->adapter_key )) + WARN( "Failed to write adapter to registry\n" ); + else + { + ctx->gpu.adapter_count++; + ctx->adapter_count++; + } }
static BOOL write_monitor_to_registry( struct monitor *monitor, const BYTE *edid, UINT edid_len )
From: Rémi Bernon rbernon@codeweavers.com
Linking it to what will be a physically identified adapter config key. --- dlls/win32u/sysparams.c | 44 ++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 20 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index d1d49d4c1c4..485f1209257 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -109,10 +109,10 @@ struct adapter { LONG refcount; struct list entry; + char path[MAX_PATH]; unsigned int id; struct gpu *gpu; UINT state_flags; - WCHAR config_key[MAX_PATH]; UINT monitor_count; UINT mode_count; DEVMODEW *modes; @@ -447,7 +447,7 @@ static BOOL adapter_get_registry_settings( const struct adapter *adapter, DEVMOD
mutex = get_display_device_init_mutex();
- if (!(hkey = reg_open_key( config_key, adapter->config_key, lstrlenW( adapter->config_key ) * sizeof(WCHAR) ))) ret = FALSE; + if (!(hkey = reg_open_ascii_key( config_key, adapter->path ))) ret = FALSE; else { ret = read_adapter_mode( hkey, ENUM_REGISTRY_SETTINGS, mode ); @@ -466,7 +466,7 @@ static BOOL adapter_set_registry_settings( const struct adapter *adapter, const
mutex = get_display_device_init_mutex();
- if (!(hkey = reg_open_key( config_key, adapter->config_key, lstrlenW( adapter->config_key ) * sizeof(WCHAR) ))) ret = FALSE; + if (!(hkey = reg_open_ascii_key( config_key, adapter->path ))) ret = FALSE; else { ret = write_adapter_mode( hkey, ENUM_REGISTRY_SETTINGS, mode ); @@ -499,7 +499,7 @@ static BOOL adapter_get_current_settings( const struct adapter *adapter, DEVMODE
mutex = get_display_device_init_mutex();
- if (!(hkey = reg_open_key( config_key, adapter->config_key, lstrlenW( adapter->config_key ) * sizeof(WCHAR) ))) ret = FALSE; + if (!(hkey = reg_open_ascii_key( config_key, adapter->path ))) ret = FALSE; else { ret = read_adapter_mode( hkey, ENUM_CURRENT_SETTINGS, mode ); @@ -518,7 +518,7 @@ static BOOL adapter_set_current_settings( const struct adapter *adapter, const D
mutex = get_display_device_init_mutex();
- if (!(hkey = reg_open_key( config_key, adapter->config_key, lstrlenW( adapter->config_key ) * sizeof(WCHAR) ))) ret = FALSE; + if (!(hkey = reg_open_ascii_key( config_key, adapter->path ))) ret = FALSE; else { ret = write_adapter_mode( hkey, ENUM_CURRENT_SETTINGS, mode ); @@ -618,17 +618,13 @@ static BOOL read_display_adapter_settings( unsigned int index, struct adapter *i /* Find adapter */ sprintf( buffer, "\Device\Video%d", index ); size = query_reg_ascii_value( video_key, buffer, value, sizeof(buffer) ); - if (!size || value->Type != REG_SZ || - value->DataLength <= sizeof("\Registry\Machine\") * sizeof(WCHAR)) - return FALSE; + if (!size || value->Type != REG_SZ) return FALSE;
/* DeviceKey */ - size = sizeof("\Registry\Machine\") - 1; - memcpy( info->config_key, value_str + size, value->DataLength - size ); - - if (!(hkey = reg_open_key( config_key, info->config_key, - lstrlenW( info->config_key ) * sizeof(WCHAR) ))) - return FALSE; + size = sizeof("\Registry\Machine"); + if (value->DataLength / sizeof(WCHAR) <= size) return FALSE; + for (i = 0; i < value->DataLength / sizeof(WCHAR) - size; i++) info->path[i] = value_str[size + i]; + if (!(hkey = reg_open_ascii_key( config_key, info->path ))) return FALSE;
/* StateFlags */ if (query_reg_ascii_value( hkey, "StateFlags", value, sizeof(buffer) ) && value->Type == REG_DWORD) @@ -1284,13 +1280,19 @@ static BOOL write_adapter_to_registry( const struct adapter *adapter, HKEY *adap else ERR( "failed to create link key\n" );
/* Following information is Wine specific, it doesn't really exist on Windows. */ - sprintf( buffer, "System\CurrentControlSet\Control\Video\%s\%04x", gpu->guid, adapter_index ); - *adapter_key = reg_create_ascii_key( config_key, buffer, REG_OPTION_VOLATILE, NULL ); - + *adapter_key = reg_create_ascii_key( NULL, adapter->path, REG_OPTION_VOLATILE, NULL ); set_reg_ascii_value( *adapter_key, "GPUID", gpu->path ); set_reg_value( *adapter_key, state_flagsW, REG_DWORD, &adapter->state_flags, sizeof(adapter->state_flags) );
+ sprintf( buffer, "System\CurrentControlSet\Control\Video\%s\%04x", gpu->guid, adapter_index ); + hkey = reg_create_ascii_key( config_key, buffer, REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK, NULL ); + if (!hkey) hkey = reg_create_ascii_key( config_key, buffer, REG_OPTION_VOLATILE | REG_OPTION_OPEN_LINK, NULL ); + + len = asciiz_to_unicode( bufferW, adapter->path ) - sizeof(WCHAR); + set_reg_value( hkey, symbolic_link_valueW, REG_LINK, bufferW, len ); + NtClose( hkey ); + return TRUE; }
@@ -1311,6 +1313,10 @@ static void add_adapter( const struct gdi_adapter *adapter, void *param ) ctx->adapter.id = ctx->adapter_count; ctx->adapter.state_flags = adapter->state_flags;
+ /* Wine specific config key where adapter settings will be held, symlinked with the logically indexed config key */ + sprintf( ctx->adapter.path, "%s\%s\Video\%s\Adapters\%04x", config_keyA, + control_keyA + strlen( "\Registry\Machine" ), ctx->gpu.guid, ctx->gpu.adapter_count ); + if (!write_adapter_to_registry( &ctx->adapter, &ctx->adapter_key )) WARN( "Failed to write adapter to registry\n" ); else @@ -1697,9 +1703,7 @@ static BOOL update_display_cache_from_registry(void) }
list_add_tail( &adapters, &adapter->entry ); - - size = lstrlenW( adapter->config_key ) * sizeof(WCHAR); - if (!(hkey = reg_open_key( config_key, adapter->config_key, size ))) continue; + if (!(hkey = reg_open_ascii_key( config_key, adapter->path ))) continue;
for (monitor_id = 0;; monitor_id++) {
From: Rémi Bernon rbernon@codeweavers.com
To match the D3DKMT terminology and avoid confusion between the GPUs, which are called adapter there. --- dlls/win32u/sysparams.c | 466 ++++++++++++++++++++-------------------- 1 file changed, 232 insertions(+), 234 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 485f1209257..a6841c45c65 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -102,10 +102,10 @@ struct gpu LUID luid; UINT index; GUID vulkan_uuid; - UINT adapter_count; + UINT source_count; };
-struct adapter +struct source { LONG refcount; struct list entry; @@ -137,7 +137,7 @@ struct monitor { struct list entry; char path[MAX_PATH]; - struct adapter *adapter; + struct source *source; HANDLE handle; unsigned int id; unsigned int output_id; @@ -148,7 +148,7 @@ struct monitor };
static struct list gpus = LIST_INIT(gpus); -static struct list adapters = LIST_INIT(adapters); +static struct list sources = LIST_INIT(sources); static struct list monitors = LIST_INIT(monitors); static INT64 last_query_display_time; static pthread_mutex_t display_lock = PTHREAD_MUTEX_INITIALIZER; @@ -348,19 +348,19 @@ static void gpu_release( struct gpu *gpu ) free( gpu ); }
-static struct adapter *adapter_acquire( struct adapter *adapter ) +static struct source *source_acquire( struct source *source ) { - InterlockedIncrement( &adapter->refcount ); - return adapter; + InterlockedIncrement( &source->refcount ); + return source; }
-static void adapter_release( struct adapter *adapter ) +static void source_release( struct source *source ) { - if (!InterlockedDecrement( &adapter->refcount )) + if (!InterlockedDecrement( &source->refcount )) { - gpu_release( adapter->gpu ); - free( adapter->modes ); - free( adapter ); + gpu_release( source->gpu ); + free( source->modes ); + free( source ); } }
@@ -416,30 +416,30 @@ static void get_monitor_info_from_edid( struct edid_monitor_info *info, const un } }
-static BOOL write_adapter_mode( HKEY adapter_key, UINT index, const DEVMODEW *mode ) +static BOOL write_source_mode( HKEY hkey, UINT index, const DEVMODEW *mode ) { WCHAR bufferW[MAX_PATH] = {0}; char buffer[MAX_PATH];
sprintf( buffer, "Modes\%08X", index ); asciiz_to_unicode( bufferW, buffer ); - return set_reg_value( adapter_key, bufferW, REG_BINARY, &mode->dmFields, sizeof(*mode) - offsetof(DEVMODEW, dmFields) ); + return set_reg_value( hkey, bufferW, REG_BINARY, &mode->dmFields, sizeof(*mode) - offsetof(DEVMODEW, dmFields) ); }
-static BOOL read_adapter_mode( HKEY adapter_key, UINT index, DEVMODEW *mode ) +static BOOL read_source_mode( HKEY hkey, UINT index, DEVMODEW *mode ) { char value_buf[offsetof(KEY_VALUE_PARTIAL_INFORMATION, Data[sizeof(*mode)])]; KEY_VALUE_PARTIAL_INFORMATION *value = (void *)value_buf; char buffer[MAX_PATH];
sprintf( buffer, "Modes\%08X", index ); - if (!query_reg_ascii_value( adapter_key, buffer, value, sizeof(value_buf) )) return FALSE; + if (!query_reg_ascii_value( hkey, buffer, value, sizeof(value_buf) )) return FALSE;
memcpy( &mode->dmFields, value->Data, sizeof(*mode) - offsetof(DEVMODEW, dmFields) ); return TRUE; }
-static BOOL adapter_get_registry_settings( const struct adapter *adapter, DEVMODEW *mode ) +static BOOL source_get_registry_settings( const struct source *source, DEVMODEW *mode ) { BOOL ret = FALSE; HANDLE mutex; @@ -447,10 +447,10 @@ static BOOL adapter_get_registry_settings( const struct adapter *adapter, DEVMOD
mutex = get_display_device_init_mutex();
- if (!(hkey = reg_open_ascii_key( config_key, adapter->path ))) ret = FALSE; + if (!(hkey = reg_open_ascii_key( config_key, source->path ))) ret = FALSE; else { - ret = read_adapter_mode( hkey, ENUM_REGISTRY_SETTINGS, mode ); + ret = read_source_mode( hkey, ENUM_REGISTRY_SETTINGS, mode ); NtClose( hkey ); }
@@ -458,7 +458,7 @@ static BOOL adapter_get_registry_settings( const struct adapter *adapter, DEVMOD return ret; }
-static BOOL adapter_set_registry_settings( const struct adapter *adapter, const DEVMODEW *mode ) +static BOOL source_set_registry_settings( const struct source *source, const DEVMODEW *mode ) { HANDLE mutex; HKEY hkey; @@ -466,10 +466,10 @@ static BOOL adapter_set_registry_settings( const struct adapter *adapter, const
mutex = get_display_device_init_mutex();
- if (!(hkey = reg_open_ascii_key( config_key, adapter->path ))) ret = FALSE; + if (!(hkey = reg_open_ascii_key( config_key, source->path ))) ret = FALSE; else { - ret = write_adapter_mode( hkey, ENUM_REGISTRY_SETTINGS, mode ); + ret = write_source_mode( hkey, ENUM_REGISTRY_SETTINGS, mode ); NtClose( hkey ); }
@@ -477,16 +477,16 @@ static BOOL adapter_set_registry_settings( const struct adapter *adapter, const return ret; }
-static BOOL adapter_get_current_settings( const struct adapter *adapter, DEVMODEW *mode ) +static BOOL source_get_current_settings( const struct source *source, DEVMODEW *mode ) { - BOOL is_primary = !!(adapter->state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE); + BOOL is_primary = !!(source->state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE); WCHAR device_nameW[CCHDEVICENAME]; char device_name[CCHDEVICENAME]; HANDLE mutex; HKEY hkey; BOOL ret;
- sprintf( device_name, "\\.\DISPLAY%d", adapter->id + 1 ); + sprintf( device_name, "\\.\DISPLAY%d", source->id + 1 ); asciiz_to_unicode( device_nameW, device_name );
/* use the default implementation in virtual desktop mode */ @@ -499,10 +499,10 @@ static BOOL adapter_get_current_settings( const struct adapter *adapter, DEVMODE
mutex = get_display_device_init_mutex();
- if (!(hkey = reg_open_ascii_key( config_key, adapter->path ))) ret = FALSE; + if (!(hkey = reg_open_ascii_key( config_key, source->path ))) ret = FALSE; else { - ret = read_adapter_mode( hkey, ENUM_CURRENT_SETTINGS, mode ); + ret = read_source_mode( hkey, ENUM_CURRENT_SETTINGS, mode ); NtClose( hkey ); }
@@ -510,7 +510,7 @@ static BOOL adapter_get_current_settings( const struct adapter *adapter, DEVMODE return ret; }
-static BOOL adapter_set_current_settings( const struct adapter *adapter, const DEVMODEW *mode ) +static BOOL source_set_current_settings( const struct source *source, const DEVMODEW *mode ) { HANDLE mutex; HKEY hkey; @@ -518,10 +518,10 @@ static BOOL adapter_set_current_settings( const struct adapter *adapter, const D
mutex = get_display_device_init_mutex();
- if (!(hkey = reg_open_ascii_key( config_key, adapter->path ))) ret = FALSE; + if (!(hkey = reg_open_ascii_key( config_key, source->path ))) ret = FALSE; else { - ret = write_adapter_mode( hkey, ENUM_CURRENT_SETTINGS, mode ); + ret = write_source_mode( hkey, ENUM_CURRENT_SETTINGS, mode ); NtClose( hkey ); }
@@ -603,7 +603,7 @@ static unsigned int query_reg_subkey_value( HKEY hkey, const char *name, KEY_VAL return size; }
-static BOOL read_display_adapter_settings( unsigned int index, struct adapter *info, char *gpu_path ) +static BOOL reade_source_from_registry( unsigned int index, struct source *source, char *gpu_path ) { char buffer[4096]; KEY_VALUE_PARTIAL_INFORMATION *value = (void *)buffer; @@ -615,7 +615,7 @@ static BOOL read_display_adapter_settings( unsigned int index, struct adapter *i if (!enum_key && !(enum_key = reg_open_ascii_key( NULL, enum_keyA ))) return FALSE;
- /* Find adapter */ + /* Find source */ sprintf( buffer, "\Device\Video%d", index ); size = query_reg_ascii_value( video_key, buffer, value, sizeof(buffer) ); if (!size || value->Type != REG_SZ) return FALSE; @@ -623,35 +623,35 @@ static BOOL read_display_adapter_settings( unsigned int index, struct adapter *i /* DeviceKey */ size = sizeof("\Registry\Machine"); if (value->DataLength / sizeof(WCHAR) <= size) return FALSE; - for (i = 0; i < value->DataLength / sizeof(WCHAR) - size; i++) info->path[i] = value_str[size + i]; - if (!(hkey = reg_open_ascii_key( config_key, info->path ))) return FALSE; + for (i = 0; i < value->DataLength / sizeof(WCHAR) - size; i++) source->path[i] = value_str[size + i]; + if (!(hkey = reg_open_ascii_key( config_key, source->path ))) return FALSE;
/* StateFlags */ if (query_reg_ascii_value( hkey, "StateFlags", value, sizeof(buffer) ) && value->Type == REG_DWORD) - info->state_flags = *(const DWORD *)value->Data; + source->state_flags = *(const DWORD *)value->Data;
/* ModeCount */ if (query_reg_ascii_value( hkey, "ModeCount", value, sizeof(buffer) ) && value->Type == REG_DWORD) - info->mode_count = *(const DWORD *)value->Data; + source->mode_count = *(const DWORD *)value->Data;
/* Modes, allocate an extra mode for easier iteration */ - if ((info->modes = calloc( info->mode_count + 1, sizeof(DEVMODEW) ))) + if ((source->modes = calloc( source->mode_count + 1, sizeof(DEVMODEW) ))) { - for (i = 0, mode = info->modes; i < info->mode_count; i++) + for (i = 0, mode = source->modes; i < source->mode_count; i++) { mode->dmSize = offsetof(DEVMODEW, dmICMMethod); - if (!read_adapter_mode( hkey, i, mode )) break; + if (!read_source_mode( hkey, i, mode )) break; mode = NEXT_DEVMODEW(mode); } - info->mode_count = i; + source->mode_count = i;
- qsort(info->modes, info->mode_count, sizeof(*info->modes) + info->modes->dmDriverExtra, mode_compare); + qsort(source->modes, source->mode_count, sizeof(*source->modes) + source->modes->dmDriverExtra, mode_compare); }
/* DeviceID */ size = query_reg_ascii_value( hkey, "GPUID", value, sizeof(buffer) ); NtClose( hkey ); - if (!size || value->Type != REG_SZ || !info->mode_count || !info->modes) return FALSE; + if (!size || value->Type != REG_SZ || !source->mode_count || !source->modes) return FALSE;
for (i = 0; i < value->DataLength / sizeof(WCHAR); i++) gpu_path[i] = value_str[i]; return TRUE; @@ -708,7 +708,7 @@ static BOOL read_monitor_from_registry( struct monitor *monitor ) return TRUE; }
-static BOOL read_adapter_monitor_path( HKEY hkey, UINT index, char *path ) +static BOOL read_source_monitor_path( HKEY hkey, UINT index, char *path ) { char buffer[4096]; KEY_VALUE_PARTIAL_INFORMATION *value = (void *)buffer; @@ -766,7 +766,7 @@ static void prepare_devices(void) set_reg_ascii_value( hkey, "Class", "Monitor" ); NtClose( hkey );
- /* delete adapters */ + /* delete sources */ reg_empty_key( video_key, NULL );
/* clean GPUs */ @@ -914,12 +914,12 @@ static unsigned int format_date( WCHAR *bufferW, LONGLONG time ) struct device_manager_ctx { UINT gpu_count; - UINT adapter_count; + UINT source_count; UINT monitor_count; HANDLE mutex; struct gpu gpu; - struct adapter adapter; - HKEY adapter_key; + struct source source; + HKEY source_key; /* for the virtual desktop settings */ BOOL is_primary; UINT primary_bpp; @@ -1253,21 +1253,21 @@ static void add_gpu( const struct gdi_gpu *gpu, void *param ) ctx->gpu_count++; }
-static BOOL write_adapter_to_registry( const struct adapter *adapter, HKEY *adapter_key ) +static BOOL write_source_to_registry( const struct source *source, HKEY *source_key ) { - struct gpu *gpu = adapter->gpu; - unsigned int len, adapter_index = gpu->adapter_count; + struct gpu *gpu = source->gpu; + unsigned int len, source_index = gpu->source_count; char name[64], buffer[MAX_PATH]; WCHAR bufferW[MAX_PATH]; HKEY hkey;
- sprintf( buffer, "%s\Video\%s\%04x", control_keyA, gpu->guid, adapter_index ); + sprintf( buffer, "%s\Video\%s\%04x", control_keyA, gpu->guid, source_index ); len = asciiz_to_unicode( bufferW, buffer ) - sizeof(WCHAR);
hkey = reg_create_ascii_key( NULL, buffer, REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK, NULL ); if (!hkey) hkey = reg_create_ascii_key( NULL, buffer, REG_OPTION_VOLATILE | REG_OPTION_OPEN_LINK, NULL );
- sprintf( name, "\Device\Video%u", adapter->id ); + sprintf( name, "\Device\Video%u", source->id ); set_reg_ascii_value( video_key, name, buffer );
if (hkey) @@ -1280,16 +1280,16 @@ static BOOL write_adapter_to_registry( const struct adapter *adapter, HKEY *adap else ERR( "failed to create link key\n" );
/* Following information is Wine specific, it doesn't really exist on Windows. */ - *adapter_key = reg_create_ascii_key( NULL, adapter->path, REG_OPTION_VOLATILE, NULL ); - set_reg_ascii_value( *adapter_key, "GPUID", gpu->path ); - set_reg_value( *adapter_key, state_flagsW, REG_DWORD, &adapter->state_flags, - sizeof(adapter->state_flags) ); + *source_key = reg_create_ascii_key( NULL, source->path, REG_OPTION_VOLATILE, NULL ); + set_reg_ascii_value( *source_key, "GPUID", gpu->path ); + set_reg_value( *source_key, state_flagsW, REG_DWORD, &source->state_flags, + sizeof(source->state_flags) );
- sprintf( buffer, "System\CurrentControlSet\Control\Video\%s\%04x", gpu->guid, adapter_index ); + sprintf( buffer, "System\CurrentControlSet\Control\Video\%s\%04x", gpu->guid, source_index ); hkey = reg_create_ascii_key( config_key, buffer, REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK, NULL ); if (!hkey) hkey = reg_create_ascii_key( config_key, buffer, REG_OPTION_VOLATILE | REG_OPTION_OPEN_LINK, NULL );
- len = asciiz_to_unicode( bufferW, adapter->path ) - sizeof(WCHAR); + len = asciiz_to_unicode( bufferW, source->path ) - sizeof(WCHAR); set_reg_value( hkey, symbolic_link_valueW, REG_LINK, bufferW, len ); NtClose( hkey );
@@ -1302,27 +1302,27 @@ static void add_adapter( const struct gdi_adapter *adapter, void *param )
TRACE( "\n" );
- if (ctx->adapter_key) + if (ctx->source_key) { - NtClose( ctx->adapter_key ); - ctx->adapter_key = NULL; + NtClose( ctx->source_key ); + ctx->source_key = NULL; }
- memset( &ctx->adapter, 0, sizeof(ctx->adapter) ); - ctx->adapter.gpu = &ctx->gpu; - ctx->adapter.id = ctx->adapter_count; - ctx->adapter.state_flags = adapter->state_flags; + memset( &ctx->source, 0, sizeof(ctx->source) ); + ctx->source.gpu = &ctx->gpu; + ctx->source.id = ctx->source_count; + ctx->source.state_flags = adapter->state_flags;
- /* Wine specific config key where adapter settings will be held, symlinked with the logically indexed config key */ - sprintf( ctx->adapter.path, "%s\%s\Video\%s\Adapters\%04x", config_keyA, - control_keyA + strlen( "\Registry\Machine" ), ctx->gpu.guid, ctx->gpu.adapter_count ); + /* Wine specific config key where source settings will be held, symlinked with the logically indexed config key */ + sprintf( ctx->source.path, "%s\%s\Video\%s\Sources\%04x", config_keyA, + control_keyA + strlen( "\Registry\Machine" ), ctx->gpu.guid, ctx->gpu.source_count );
- if (!write_adapter_to_registry( &ctx->adapter, &ctx->adapter_key )) - WARN( "Failed to write adapter to registry\n" ); + if (!write_source_to_registry( &ctx->source, &ctx->source_key )) + WARN( "Failed to write source to registry\n" ); else { - ctx->gpu.adapter_count++; - ctx->adapter_count++; + ctx->gpu.source_count++; + ctx->source_count++; } }
@@ -1381,7 +1381,7 @@ static BOOL write_monitor_to_registry( struct monitor *monitor, const BYTE *edid if ((subkey = reg_create_ascii_key( hkey, devpropkey_monitor_gpu_luidA, 0, NULL ))) { set_reg_value( subkey, NULL, 0xffff0000 | DEVPROP_TYPE_INT64, - &monitor->adapter->gpu->luid, sizeof(monitor->adapter->gpu->luid) ); + &monitor->source->gpu->luid, sizeof(monitor->source->gpu->luid) ); NtClose( subkey ); }
@@ -1412,8 +1412,8 @@ static void add_monitor( const struct gdi_monitor *gdi_monitor, void *param ) char buffer[MAX_PATH]; char monitor_id_string[16];
- monitor.adapter = &ctx->adapter; - monitor.id = ctx->adapter.monitor_count; + monitor.source = &ctx->source; + monitor.id = ctx->source.monitor_count; monitor.output_id = ctx->monitor_count; monitor.rc_monitor = gdi_monitor->rc_monitor; monitor.rc_work = gdi_monitor->rc_work; @@ -1427,14 +1427,14 @@ static void add_monitor( const struct gdi_monitor *gdi_monitor, void *param ) strcpy( monitor_id_string, "Default_Monitor" );
sprintf( buffer, "MonitorID%u", monitor.id ); - sprintf( monitor.path, "DISPLAY\%s\%04X&%04X", monitor_id_string, ctx->adapter.id, monitor.id ); - set_reg_ascii_value( ctx->adapter_key, buffer, monitor.path ); + sprintf( monitor.path, "DISPLAY\%s\%04X&%04X", monitor_id_string, ctx->source.id, monitor.id ); + set_reg_ascii_value( ctx->source_key, buffer, monitor.path );
if (!write_monitor_to_registry( &monitor, gdi_monitor->edid, gdi_monitor->edid_len )) WARN( "Failed to write monitor to registry\n" ); else { - ctx->adapter.monitor_count++; + ctx->source.monitor_count++; ctx->monitor_count++; } } @@ -1444,7 +1444,7 @@ static void add_mode( const DEVMODEW *mode, BOOL current, void *param ) struct device_manager_ctx *ctx = param; DEVMODEW nopos_mode;
- if (!ctx->gpu.adapter_count) + if (!ctx->gpu.source_count) { static const struct gdi_adapter default_adapter = { @@ -1459,15 +1459,15 @@ static void add_mode( const DEVMODEW *mode, BOOL current, void *param ) nopos_mode.dmPosition.y = 0; nopos_mode.dmFields &= ~DM_POSITION;
- if (write_adapter_mode( ctx->adapter_key, ctx->adapter.mode_count, &nopos_mode )) + if (write_source_mode( ctx->source_key, ctx->source.mode_count, &nopos_mode )) { - ctx->adapter.mode_count++; - set_reg_value( ctx->adapter_key, mode_countW, REG_DWORD, &ctx->adapter.mode_count, sizeof(ctx->adapter.mode_count) ); + ctx->source.mode_count++; + set_reg_value( ctx->source_key, mode_countW, REG_DWORD, &ctx->source.mode_count, sizeof(ctx->source.mode_count) ); if (current) { - if (!read_adapter_mode( ctx->adapter_key, ENUM_REGISTRY_SETTINGS, &nopos_mode )) - write_adapter_mode( ctx->adapter_key, ENUM_REGISTRY_SETTINGS, mode ); - write_adapter_mode( ctx->adapter_key, ENUM_CURRENT_SETTINGS, mode ); + if (!read_source_mode( ctx->source_key, ENUM_REGISTRY_SETTINGS, &nopos_mode )) + write_source_mode( ctx->source_key, ENUM_REGISTRY_SETTINGS, mode ); + write_source_mode( ctx->source_key, ENUM_CURRENT_SETTINGS, mode ); } } } @@ -1484,9 +1484,9 @@ static void reset_display_manager_ctx( struct device_manager_ctx *ctx ) { HANDLE mutex = ctx->mutex;
- if (ctx->adapter_key) + if (ctx->source_key) { - NtClose( ctx->adapter_key ); + NtClose( ctx->source_key ); last_query_display_time = 0; } if (ctx->gpu_count) cleanup_devices(); @@ -1508,7 +1508,7 @@ static void release_display_manager_ctx( struct device_manager_ctx *ctx )
static void clear_display_devices(void) { - struct adapter *adapter; + struct source *source; struct monitor *monitor; struct gpu *gpu;
@@ -1521,16 +1521,16 @@ static void clear_display_devices(void) while (!list_empty( &monitors )) { monitor = LIST_ENTRY( list_head( &monitors ), struct monitor, entry ); - adapter_release( monitor->adapter ); + source_release( monitor->source ); list_remove( &monitor->entry ); free( monitor ); }
- while (!list_empty( &adapters )) + while (!list_empty( &sources )) { - adapter = LIST_ENTRY( list_head( &adapters ), struct adapter, entry ); - list_remove( &adapter->entry ); - adapter_release( adapter ); + source = LIST_ENTRY( list_head( &sources ), struct source, entry ); + list_remove( &source->entry ); + source_release( source ); }
while (!list_empty( &gpus )) @@ -1543,19 +1543,19 @@ static void clear_display_devices(void)
static BOOL is_monitor_active( struct monitor *monitor ) { - struct adapter *adapter; + struct source *source; /* services do not have any adapters, only a virtual monitor */ - if (!(adapter = monitor->adapter)) return TRUE; - if (!(adapter->state_flags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) return FALSE; + if (!(source = monitor->source)) return TRUE; + if (!(source->state_flags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) return FALSE; return !IsRectEmpty( &monitor->rc_monitor ); }
static BOOL is_monitor_primary( struct monitor *monitor ) { - struct adapter *adapter; + struct source *source; /* services do not have any adapters, only a virtual monitor */ - if (!(adapter = monitor->adapter)) return TRUE; - return !!(adapter->state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE); + if (!(source = monitor->source)) return TRUE; + return !!(source->state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE); }
static void enum_device_keys( const char *root, const WCHAR *classW, UINT class_size, void (*callback)(const char *) ) @@ -1645,9 +1645,9 @@ static struct monitor *find_monitor_from_path( const char *path ) static BOOL update_display_cache_from_registry(void) { char path[MAX_PATH]; - DWORD adapter_id, monitor_id, monitor_count = 0, size; + DWORD source_id, monitor_id, monitor_count = 0, size; KEY_BASIC_INFORMATION key; - struct adapter *adapter; + struct source *source; struct monitor *monitor; HANDLE mutex = NULL; NTSTATUS status; @@ -1688,40 +1688,40 @@ static BOOL update_display_cache_from_registry(void) WARN( "Failed to read monitor from registry\n" ); }
- for (adapter_id = 0;; adapter_id++) + for (source_id = 0;; source_id++) { - if (!(adapter = calloc( 1, sizeof(*adapter) ))) break; - adapter->refcount = 1; - adapter->id = adapter_id; + if (!(source = calloc( 1, sizeof(*source) ))) break; + source->refcount = 1; + source->id = source_id;
- if (!read_display_adapter_settings( adapter_id, adapter, path ) || - !(adapter->gpu = find_gpu_from_path( path ))) + if (!reade_source_from_registry( source_id, source, path ) || + !(source->gpu = find_gpu_from_path( path ))) { - free( adapter->modes ); - free( adapter ); + free( source->modes ); + free( source ); break; }
- list_add_tail( &adapters, &adapter->entry ); - if (!(hkey = reg_open_ascii_key( config_key, adapter->path ))) continue; + list_add_tail( &sources, &source->entry ); + if (!(hkey = reg_open_ascii_key( config_key, source->path ))) continue;
for (monitor_id = 0;; monitor_id++) { struct monitor *monitor;
- if (!read_adapter_monitor_path( hkey, monitor_id, path )) break; + if (!read_source_monitor_path( hkey, monitor_id, path )) break; if (!(monitor = find_monitor_from_path( path ))) continue;
monitor->id = monitor_id; - monitor->adapter = adapter_acquire( adapter ); + monitor->source = source_acquire( source ); monitor->handle = UlongToHandle( ++monitor_count ); - if (adapter->monitor_count++) monitor->is_clone = TRUE; + if (source->monitor_count++) monitor->is_clone = TRUE; }
NtClose( hkey ); }
- if ((ret = !list_empty( &adapters ) && !list_empty( &monitors ))) + if ((ret = !list_empty( &sources ) && !list_empty( &monitors ))) last_query_display_time = key.LastWriteTime.QuadPart; pthread_mutex_unlock( &display_lock ); release_display_device_init_mutex( mutex ); @@ -1771,7 +1771,7 @@ static BOOL default_update_display_devices( const struct gdi_device_manager *man manager->add_gpu( &gpu, ctx ); manager->add_adapter( &adapter, ctx );
- if (!read_adapter_mode( ctx->adapter_key, ENUM_CURRENT_SETTINGS, &mode )) + if (!read_source_mode( ctx->source_key, ENUM_CURRENT_SETTINGS, &mode )) { mode = modes[2]; mode.dmFields |= DM_POSITION; @@ -1935,7 +1935,7 @@ static BOOL desktop_update_display_devices( BOOL force, struct device_manager_ct
add_gpu( &gpu, ctx ); add_adapter( &adapter, ctx ); - if (!read_adapter_mode( ctx->adapter_key, ENUM_CURRENT_SETTINGS, ¤t )) + if (!read_source_mode( ctx->source_key, ENUM_CURRENT_SETTINGS, ¤t )) { current = mode; current.dmFields |= DM_POSITION; @@ -2329,7 +2329,7 @@ RECT get_display_rect( const WCHAR *display )
LIST_FOR_EACH_ENTRY( monitor, &monitors, struct monitor, entry ) { - if (!monitor->adapter || monitor->adapter->id + 1 != index) continue; + if (!monitor->source || monitor->source->id + 1 != index) continue; rect = monitor->rc_monitor; break; } @@ -2532,7 +2532,7 @@ LONG WINAPI NtUserQueryDisplayConfig( UINT32 flags, UINT32 *paths_count, DISPLAY UINT32 *modes_count, DISPLAYCONFIG_MODE_INFO *modes, DISPLAYCONFIG_TOPOLOGY_ID *topology_id ) { - ULONG adapter_index; + ULONG source_index; LONG ret; UINT32 output_id, source_mode_index, path_index = 0, mode_index = 0; const LUID *gpu_luid; @@ -2574,17 +2574,15 @@ LONG WINAPI NtUserQueryDisplayConfig( UINT32 flags, UINT32 *paths_count, DISPLAY LIST_FOR_EACH_ENTRY( monitor, &monitors, struct monitor, entry ) { if (!is_monitor_active( monitor )) continue; + if (!monitor->source) continue;
- if (!monitor->adapter) - continue; - - adapter_index = monitor->adapter->id; - gpu_luid = &monitor->adapter->gpu->luid; + source_index = monitor->source->id; + gpu_luid = &monitor->source->gpu->luid; output_id = monitor->output_id;
memset( &devmode, 0, sizeof(devmode) ); devmode.dmSize = sizeof(devmode); - if (!adapter_get_current_settings( monitor->adapter, &devmode )) + if (!source_get_current_settings( monitor->source, &devmode )) { goto done; } @@ -2609,13 +2607,13 @@ LONG WINAPI NtUserQueryDisplayConfig( UINT32 flags, UINT32 *paths_count, DISPLAY /* Multiple targets can be driven by the same source, ensure a mode * hasn't already been added for this source. */ - if (!source_mode_exists( modes, mode_index, adapter_index, &source_mode_index )) + if (!source_mode_exists( modes, mode_index, source_index, &source_mode_index )) { - set_mode_source_info( &modes[mode_index], gpu_luid, adapter_index, &devmode ); + set_mode_source_info( &modes[mode_index], gpu_luid, source_index, &devmode ); source_mode_index = mode_index; mode_index++; } - set_path_source_info( &paths[path_index].sourceInfo, gpu_luid, adapter_index, source_mode_index ); + set_path_source_info( &paths[path_index].sourceInfo, gpu_luid, source_index, source_mode_index ); path_index++; }
@@ -2629,75 +2627,75 @@ done: }
/* display_lock mutex must be held */ -static struct monitor *find_monitor_by_index( struct adapter *adapter, UINT index ) +static struct monitor *find_monitor_by_index( struct source *source, UINT index ) { struct monitor *monitor;
LIST_FOR_EACH_ENTRY(monitor, &monitors, struct monitor, entry) - if (monitor->adapter == adapter && index == monitor->id) + if (monitor->source == source && index == monitor->id) return monitor;
- WARN( "Failed to find adapter %u monitor with id %u.\n", adapter->id, index ); + WARN( "Failed to find source %u monitor with id %u.\n", source->id, index ); return NULL; }
/* display_lock mutex must be held */ -static struct adapter *find_adapter_by_index( UINT index ) +static struct source *find_source_by_index( UINT index ) { - struct adapter *adapter; + struct source *source;
- LIST_FOR_EACH_ENTRY(adapter, &adapters, struct adapter, entry) - if (index == adapter->id) return adapter; + LIST_FOR_EACH_ENTRY(source, &sources, struct source, entry) + if (index == source->id) return source;
- WARN( "Failed to find adapter with id %u.\n", index ); + WARN( "Failed to find source with id %u.\n", index ); return NULL; }
/* display_lock mutex must be held */ -static struct adapter *find_primary_adapter(void) +static struct source *find_primary_source(void) { - struct adapter *adapter; + struct source *source;
- LIST_FOR_EACH_ENTRY(adapter, &adapters, struct adapter, entry) - if (adapter->state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE) - return adapter; + LIST_FOR_EACH_ENTRY(source, &sources, struct source, entry) + if (source->state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE) + return source;
- WARN( "Failed to find primary adapter.\n" ); + WARN( "Failed to find primary source.\n" ); return NULL; }
/* display_lock mutex must be held */ -static struct adapter *find_adapter_by_name( UNICODE_STRING *name ) +static struct source *find_source_by_name( UNICODE_STRING *name ) { - struct adapter *adapter; + struct source *source; UINT index;
if (!(index = get_display_index( name ))) return NULL;
- LIST_FOR_EACH_ENTRY(adapter, &adapters, struct adapter, entry) - if (adapter->id + 1 == index) - return adapter; + LIST_FOR_EACH_ENTRY(source, &sources, struct source, entry) + if (source->id + 1 == index) + return source;
- WARN( "Failed to find adapter with name %s.\n", debugstr_us(name) ); + WARN( "Failed to find source with name %s.\n", debugstr_us(name) ); return NULL; }
-/* Find and acquire the adapter matching name, or primary adapter if name is NULL. - * If not NULL, the returned adapter needs to be released with adapter_release. +/* Find and acquire the source matching name, or primary source if name is NULL. + * If not NULL, the returned source needs to be released with source_release. */ -static struct adapter *find_adapter( UNICODE_STRING *name ) +static struct source *find_source( UNICODE_STRING *name ) { - struct adapter *adapter; + struct source *source;
if (!lock_display_devices()) return NULL;
- if (name && name->Length) adapter = find_adapter_by_name( name ); - else adapter = find_primary_adapter(); + if (name && name->Length) source = find_source_by_name( name ); + else source = find_primary_source();
- if (adapter) adapter = adapter_acquire( adapter ); + if (source) source = source_acquire( source );
unlock_display_devices(); - return adapter; + return source; }
static void monitor_get_interface_name( struct monitor *monitor, WCHAR *interface_name ) @@ -2706,12 +2704,12 @@ static void monitor_get_interface_name( struct monitor *monitor, WCHAR *interfac const char *id;
*interface_name = 0; - if (!monitor->adapter) return; + if (!monitor->source) return;
if (!(monitor->edid_info.flags & MONITOR_INFO_HAS_MONITOR_ID)) id = "Default_Monitor"; else id = monitor->edid_info.monitor_id_string;
- sprintf( buffer, "\\?\DISPLAY\%s\%04X&%04X#%s", id, monitor->adapter->id, + sprintf( buffer, "\\?\DISPLAY\%s\%04X&%04X#%s", id, monitor->source->id, monitor->id, guid_devinterface_monitorA ); for (tmp = buffer + 4; *tmp; tmp++) if (*tmp == '\') *tmp = '#';
@@ -2725,7 +2723,7 @@ NTSTATUS WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index, DISPLAY_DEVICEW *info, DWORD flags ) { struct monitor *monitor = NULL; - struct adapter *adapter = NULL; + struct source *source = NULL; BOOL found = FALSE;
TRACE( "%s %u %p %#x\n", debugstr_us( device ), (int)index, info, (int)flags ); @@ -2736,11 +2734,11 @@ NTSTATUS WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index,
if (!device || !device->Length) { - if ((adapter = find_adapter_by_index( index ))) found = TRUE; + if ((source = find_source_by_index( index ))) found = TRUE; } - else if ((adapter = find_adapter_by_name( device ))) + else if ((source = find_source_by_name( device ))) { - if ((monitor = find_monitor_by_index( adapter, index ))) found = TRUE; + if ((monitor = find_monitor_by_index( source, index ))) found = TRUE; }
if (found) @@ -2749,18 +2747,18 @@ NTSTATUS WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index,
if (info->cb >= offsetof(DISPLAY_DEVICEW, DeviceName) + sizeof(info->DeviceName)) { - if (monitor) sprintf( buffer, "\\.\DISPLAY%d\Monitor%d", adapter->id + 1, monitor->id ); - else sprintf( buffer, "\\.\DISPLAY%d", adapter->id + 1 ); + if (monitor) sprintf( buffer, "\\.\DISPLAY%d\Monitor%d", source->id + 1, monitor->id ); + else sprintf( buffer, "\\.\DISPLAY%d", source->id + 1 ); asciiz_to_unicode( info->DeviceName, buffer ); } if (info->cb >= offsetof(DISPLAY_DEVICEW, DeviceString) + sizeof(info->DeviceString)) { if (monitor) asciiz_to_unicode( info->DeviceString, "Generic Non-PnP Monitor" ); - else lstrcpynW( info->DeviceString, adapter->gpu->name, ARRAY_SIZE(info->DeviceString) ); + else lstrcpynW( info->DeviceString, source->gpu->name, ARRAY_SIZE(info->DeviceString) ); } if (info->cb >= offsetof(DISPLAY_DEVICEW, StateFlags) + sizeof(info->StateFlags)) { - if (!monitor) info->StateFlags = adapter->state_flags; + if (!monitor) info->StateFlags = source->state_flags; else { info->StateFlags = DISPLAY_DEVICE_ATTACHED; @@ -2784,7 +2782,7 @@ NTSTATUS WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index, } else { - strcpy( buffer, adapter->gpu->path ); + strcpy( buffer, source->gpu->path ); if ((tmp = strrchr( buffer, '\' ))) *tmp = 0; } asciiz_to_unicode( info->DeviceID, buffer ); @@ -2793,7 +2791,7 @@ NTSTATUS WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index, if (info->cb >= offsetof(DISPLAY_DEVICEW, DeviceKey) + sizeof(info->DeviceKey)) { if (monitor) sprintf( buffer, "%s\Class\%s\%04X", control_keyA, guid_devclass_monitorA, monitor->output_id ); - else sprintf( buffer, "%s\Video\%s\%04x", control_keyA, adapter->gpu->guid, adapter->id ); + else sprintf( buffer, "%s\Video\%s\%04x", control_keyA, source->gpu->guid, source->id ); asciiz_to_unicode( info->DeviceKey, buffer ); } } @@ -2913,9 +2911,9 @@ static const DEVMODEW *find_display_mode( const DEVMODEW *modes, DEVMODEW *devmo return NULL; }
-static BOOL adapter_get_full_mode( const struct adapter *adapter, const DEVMODEW *devmode, DEVMODEW *full_mode ) +static BOOL source_get_full_mode( const struct source *source, const DEVMODEW *devmode, DEVMODEW *full_mode ) { - const DEVMODEW *adapter_mode; + const DEVMODEW *source_mode;
if (devmode) { @@ -2933,7 +2931,7 @@ static BOOL adapter_get_full_mode( const struct adapter *adapter, const DEVMODEW if (devmode) memcpy( full_mode, devmode, devmode->dmSize ); else { - if (!adapter_get_registry_settings( adapter, full_mode )) return FALSE; + if (!source_get_registry_settings( source, full_mode )) return FALSE; TRACE( "Return to original display mode\n" ); }
@@ -2947,7 +2945,7 @@ static BOOL adapter_get_full_mode( const struct adapter *adapter, const DEVMODEW { DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)};
- if (!adapter_get_current_settings( adapter, ¤t_mode )) return FALSE; + if (!source_get_current_settings( source, ¤t_mode )) return FALSE; if (!full_mode->dmPelsWidth) full_mode->dmPelsWidth = current_mode.dmPelsWidth; if (!full_mode->dmPelsHeight) full_mode->dmPelsHeight = current_mode.dmPelsHeight; if (!(full_mode->dmFields & DM_POSITION)) @@ -2957,38 +2955,38 @@ static BOOL adapter_get_full_mode( const struct adapter *adapter, const DEVMODEW } }
- if ((adapter_mode = find_display_mode( adapter->modes, full_mode )) && adapter_mode != full_mode) + if ((source_mode = find_display_mode( source->modes, full_mode )) && source_mode != full_mode) { POINTL position = full_mode->dmPosition; - *full_mode = *adapter_mode; + *full_mode = *source_mode; full_mode->dmFields |= DM_POSITION; full_mode->dmPosition = position; }
- return adapter_mode != NULL; + return source_mode != NULL; }
-static DEVMODEW *get_display_settings( struct adapter *target, const DEVMODEW *devmode ) +static DEVMODEW *get_display_settings( struct source *target, const DEVMODEW *devmode ) { DEVMODEW *mode, *displays; - struct adapter *adapter; + struct source *source; BOOL ret;
/* allocate an extra mode for easier iteration */ - if (!(displays = calloc( list_count( &adapters ) + 1, sizeof(DEVMODEW) ))) return NULL; + if (!(displays = calloc( list_count( &sources ) + 1, sizeof(DEVMODEW) ))) return NULL; mode = displays;
- LIST_FOR_EACH_ENTRY( adapter, &adapters, struct adapter, entry ) + LIST_FOR_EACH_ENTRY( source, &sources, struct source, entry ) { char buffer[CCHDEVICENAME];
mode->dmSize = sizeof(DEVMODEW); - if (devmode && adapter->id == target->id) + if (devmode && source->id == target->id) memcpy( &mode->dmFields, &devmode->dmFields, devmode->dmSize - offsetof(DEVMODEW, dmFields) ); else { - if (!target) ret = adapter_get_registry_settings( adapter, mode ); - else ret = adapter_get_current_settings( adapter, mode ); + if (!target) ret = source_get_registry_settings( source, mode ); + else ret = source_get_current_settings( source, mode ); if (!ret) { free( displays ); @@ -2996,7 +2994,7 @@ static DEVMODEW *get_display_settings( struct adapter *target, const DEVMODEW *d } }
- sprintf( buffer, "\\.\DISPLAY%d", adapter->id + 1 ); + sprintf( buffer, "\\.\DISPLAY%d", source->id + 1 ); asciiz_to_unicode( mode->dmDeviceName, buffer ); mode = NEXT_DEVMODEW(mode); } @@ -3191,11 +3189,11 @@ static BOOL all_detached_settings( const DEVMODEW *displays ) return TRUE; }
-static LONG apply_display_settings( struct adapter *target, const DEVMODEW *devmode, +static LONG apply_display_settings( struct source *target, const DEVMODEW *devmode, HWND hwnd, DWORD flags, void *lparam ) { WCHAR primary_name[CCHDEVICENAME]; - struct adapter *primary, *adapter; + struct source *primary, *source; DEVMODEW *mode, *displays; LONG ret;
@@ -3216,7 +3214,7 @@ static LONG apply_display_settings( struct adapter *target, const DEVMODEW *devm
place_all_displays( displays );
- if (!(primary = find_primary_adapter())) primary_name[0] = 0; + if (!(primary = find_primary_source())) primary_name[0] = 0; else { char device_name[CCHDEVICENAME]; @@ -3232,10 +3230,10 @@ static LONG apply_display_settings( struct adapter *target, const DEVMODEW *devm { /* default implementation: write current display settings to the registry. */ mode = displays; - LIST_FOR_EACH_ENTRY( adapter, &adapters, struct adapter, entry ) + LIST_FOR_EACH_ENTRY( source, &sources, struct source, entry ) { - if (!adapter_set_current_settings( adapter, mode )) - WARN( "Failed to write adapter %u current mode.\n", adapter->id ); + if (!source_set_current_settings( source, mode )) + WARN( "Failed to write source %u current mode.\n", source->id ); mode = NEXT_DEVMODEW(mode); } ret = DISP_CHANGE_SUCCESSFUL; @@ -3248,12 +3246,12 @@ static LONG apply_display_settings( struct adapter *target, const DEVMODEW *devm if (!update_display_cache( TRUE )) WARN( "Failed to update display cache after mode change.\n" );
- if ((adapter = find_adapter( NULL ))) + if ((source = find_source( NULL ))) { DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)};
- if (!adapter_get_current_settings( adapter, ¤t_mode )) WARN( "Failed to get primary adapter current display settings.\n" ); - adapter_release( adapter ); + if (!source_get_current_settings( source, ¤t_mode )) WARN( "Failed to get primary source current display settings.\n" ); + source_release( source );
NtUserClipCursor( NULL ); send_notify_message( NtUserGetDesktopWindow(), WM_DISPLAYCHANGE, current_mode.dmBitsPerPel, @@ -3276,53 +3274,53 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm { DEVMODEW full_mode = {.dmSize = sizeof(DEVMODEW)}; int ret = DISP_CHANGE_SUCCESSFUL; - struct adapter *adapter; + struct source *source;
TRACE( "%s %p %p %#x %p\n", debugstr_us(devname), devmode, hwnd, (int)flags, lparam ); TRACE( "flags=%s\n", _CDS_flags(flags) );
if ((!devname || !devname->Length) && !devmode) return apply_display_settings( NULL, NULL, hwnd, flags, lparam );
- if (!(adapter = find_adapter( devname ))) return DISP_CHANGE_BADPARAM; + if (!(source = find_source( devname ))) return DISP_CHANGE_BADPARAM;
- if (!adapter_get_full_mode( adapter, devmode, &full_mode )) ret = DISP_CHANGE_BADMODE; - else if ((flags & CDS_UPDATEREGISTRY) && !adapter_set_registry_settings( adapter, &full_mode )) ret = DISP_CHANGE_NOTUPDATED; + if (!source_get_full_mode( source, devmode, &full_mode )) ret = DISP_CHANGE_BADMODE; + else if ((flags & CDS_UPDATEREGISTRY) && !source_set_registry_settings( source, &full_mode )) ret = DISP_CHANGE_NOTUPDATED; else if (flags & (CDS_TEST | CDS_NORESET)) ret = DISP_CHANGE_SUCCESSFUL; - else ret = apply_display_settings( adapter, &full_mode, hwnd, flags, lparam ); - adapter_release( adapter ); + else ret = apply_display_settings( source, &full_mode, hwnd, flags, lparam ); + source_release( source );
if (ret) ERR( "Changing %s display settings returned %d.\n", debugstr_us(devname), ret ); return ret; }
-static BOOL adapter_enum_display_settings( const struct adapter *adapter, UINT index, DEVMODEW *devmode, UINT flags ) +static BOOL source_enum_display_settings( const struct source *source, UINT index, DEVMODEW *devmode, UINT flags ) { DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)}; - const DEVMODEW *adapter_mode; + const DEVMODEW *source_mode;
- if (!(flags & EDS_ROTATEDMODE) && !adapter_get_current_settings( adapter, ¤t_mode )) + if (!(flags & EDS_ROTATEDMODE) && !source_get_current_settings( source, ¤t_mode )) { WARN( "Failed to query current display mode for EDS_ROTATEDMODE flag.\n" ); return FALSE; }
- for (adapter_mode = adapter->modes; adapter_mode->dmSize; adapter_mode = NEXT_DEVMODEW(adapter_mode)) + for (source_mode = source->modes; source_mode->dmSize; source_mode = NEXT_DEVMODEW(source_mode)) { - if (!(flags & EDS_ROTATEDMODE) && (adapter_mode->dmFields & DM_DISPLAYORIENTATION) && - adapter_mode->dmDisplayOrientation != current_mode.dmDisplayOrientation) + if (!(flags & EDS_ROTATEDMODE) && (source_mode->dmFields & DM_DISPLAYORIENTATION) && + source_mode->dmDisplayOrientation != current_mode.dmDisplayOrientation) continue; - if (!(flags & EDS_RAWMODE) && (adapter_mode->dmFields & DM_DISPLAYFLAGS) && - (adapter_mode->dmDisplayFlags & WINE_DM_UNSUPPORTED)) + if (!(flags & EDS_RAWMODE) && (source_mode->dmFields & DM_DISPLAYFLAGS) && + (source_mode->dmDisplayFlags & WINE_DM_UNSUPPORTED)) continue; if (!index--) { - memcpy( &devmode->dmFields, &adapter_mode->dmFields, devmode->dmSize - FIELD_OFFSET(DEVMODEW, dmFields) ); + memcpy( &devmode->dmFields, &source_mode->dmFields, devmode->dmSize - FIELD_OFFSET(DEVMODEW, dmFields) ); devmode->dmDisplayFlags &= ~WINE_DM_UNSUPPORTED; return TRUE; } }
- WARN( "device %d, index %#x, flags %#x display mode not found.\n", adapter->id, index, flags ); + WARN( "device %d, index %#x, flags %#x display mode not found.\n", source->id, index, flags ); RtlSetLastWin32Error( ERROR_NO_MORE_FILES ); return FALSE; } @@ -3333,13 +3331,13 @@ static BOOL adapter_enum_display_settings( const struct adapter *adapter, UINT i BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVMODEW *devmode, DWORD flags ) { static const WCHAR wine_display_driverW[] = {'W','i','n','e',' ','D','i','s','p','l','a','y',' ','D','r','i','v','e','r',0}; - struct adapter *adapter; + struct source *source; BOOL ret;
TRACE( "device %s, index %#x, devmode %p, flags %#x\n", debugstr_us(device), (int)index, devmode, (int)flags );
- if (!(adapter = find_adapter( device ))) return FALSE; + if (!(source = find_source( device ))) return FALSE;
lstrcpynW( devmode->dmDeviceName, wine_display_driverW, ARRAY_SIZE(devmode->dmDeviceName) ); devmode->dmSpecVersion = DM_SPECVERSION; @@ -3347,10 +3345,10 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVM devmode->dmSize = offsetof(DEVMODEW, dmICMMethod); devmode->dmDriverExtra = 0;
- if (index == ENUM_REGISTRY_SETTINGS) ret = adapter_get_registry_settings( adapter, devmode ); - else if (index == ENUM_CURRENT_SETTINGS) ret = adapter_get_current_settings( adapter, devmode ); - else ret = adapter_enum_display_settings( adapter, index, devmode, flags ); - adapter_release( adapter ); + if (index == ENUM_REGISTRY_SETTINGS) ret = source_get_registry_settings( source, devmode ); + else if (index == ENUM_CURRENT_SETTINGS) ret = source_get_current_settings( source, devmode ); + else ret = source_enum_display_settings( source, index, devmode, flags ); + source_release( source );
if (!ret) WARN( "Failed to query %s display settings.\n", debugstr_us(device) ); else TRACE( "position %dx%d, resolution %ux%u, frequency %u, depth %u, orientation %#x.\n", @@ -3383,24 +3381,24 @@ INT get_display_depth( UNICODE_STRING *name ) { WCHAR device_nameW[CCHDEVICENAME]; char device_name[CCHDEVICENAME]; - struct adapter *adapter; + struct source *source; BOOL is_primary; INT depth;
if (!lock_display_devices()) return 32;
- if (name && name->Length) adapter = find_adapter_by_name( name ); - else adapter = find_primary_adapter(); + if (name && name->Length) source = find_source_by_name( name ); + else source = find_primary_source();
- if (!adapter) + if (!source) { unlock_display_devices(); return 32; }
- is_primary = !!(adapter->state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE); - sprintf( device_name, "\\.\DISPLAY%d", adapter->id + 1 ); + is_primary = !!(source->state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE); + sprintf( device_name, "\\.\DISPLAY%d", source->id + 1 ); asciiz_to_unicode( device_nameW, device_name );
/* use the default implementation in virtual desktop mode */ @@ -3410,7 +3408,7 @@ INT get_display_depth( UNICODE_STRING *name ) if (depth < 0) { DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)}; - if (!adapter_get_current_settings( adapter, ¤t_mode )) depth = 32; + if (!source_get_current_settings( source, ¤t_mode )) depth = 32; else depth = current_mode.dmBitsPerPel; }
@@ -3533,7 +3531,7 @@ BOOL get_monitor_info( HMONITOR handle, MONITORINFO *info ) if (info->cbSize >= sizeof(MONITORINFOEXW)) { char buffer[CCHDEVICENAME]; - if (monitor->adapter) sprintf( buffer, "\\.\DISPLAY%d", monitor->adapter->id + 1 ); + if (monitor->source) sprintf( buffer, "\\.\DISPLAY%d", monitor->source->id + 1 ); else strcpy( buffer, "WinDisc" ); asciiz_to_unicode( ((MONITORINFOEXW *)info)->szDevice, buffer ); } @@ -6448,7 +6446,7 @@ NTSTATUS WINAPI NtUserDisplayConfigGetDeviceInfo( DISPLAYCONFIG_DEVICE_INFO_HEAD case DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME: { DISPLAYCONFIG_SOURCE_DEVICE_NAME *source_name = (DISPLAYCONFIG_SOURCE_DEVICE_NAME *)packet; - struct adapter *adapter; + struct source *source;
TRACE( "DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME.\n" );
@@ -6457,12 +6455,12 @@ NTSTATUS WINAPI NtUserDisplayConfigGetDeviceInfo( DISPLAYCONFIG_DEVICE_INFO_HEAD
if (!lock_display_devices()) return STATUS_UNSUCCESSFUL;
- LIST_FOR_EACH_ENTRY(adapter, &adapters, struct adapter, entry) + LIST_FOR_EACH_ENTRY(source, &sources, struct source, entry) { - if (source_name->header.id != adapter->id) continue; - if (memcmp( &source_name->header.adapterId, &adapter->gpu->luid, sizeof(adapter->gpu->luid) )) continue; + if (source_name->header.id != source->id) continue; + if (memcmp( &source_name->header.adapterId, &source->gpu->luid, sizeof(source->gpu->luid) )) continue;
- sprintf( buffer, "\\.\DISPLAY%d", adapter->id + 1 ); + sprintf( buffer, "\\.\DISPLAY%d", source->id + 1 ); asciiz_to_unicode( source_name->viewGdiDeviceName, buffer ); ret = STATUS_SUCCESS; break; @@ -6489,8 +6487,8 @@ NTSTATUS WINAPI NtUserDisplayConfigGetDeviceInfo( DISPLAYCONFIG_DEVICE_INFO_HEAD LIST_FOR_EACH_ENTRY(monitor, &monitors, struct monitor, entry) { if (target_name->header.id != monitor->output_id) continue; - if (memcmp( &target_name->header.adapterId, &monitor->adapter->gpu->luid, - sizeof(monitor->adapter->gpu->luid) )) + if (memcmp( &target_name->header.adapterId, &monitor->source->gpu->luid, + sizeof(monitor->source->gpu->luid) )) continue;
target_name->outputTechnology = DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL; @@ -6536,13 +6534,13 @@ NTSTATUS WINAPI NtUserDisplayConfigGetDeviceInfo( DISPLAYCONFIG_DEVICE_INFO_HEAD LIST_FOR_EACH_ENTRY(monitor, &monitors, struct monitor, entry) { if (preferred_mode->header.id != monitor->output_id) continue; - if (memcmp( &preferred_mode->header.adapterId, &monitor->adapter->gpu->luid, - sizeof(monitor->adapter->gpu->luid) )) + if (memcmp( &preferred_mode->header.adapterId, &monitor->source->gpu->luid, + sizeof(monitor->source->gpu->luid) )) continue;
- for (i = 0; i < monitor->adapter->mode_count; ++i) + for (i = 0; i < monitor->source->mode_count; ++i) { - DEVMODEW *mode = &monitor->adapter->modes[i]; + DEVMODEW *mode = &monitor->source->modes[i];
if (!have_edid_mode && monitor->edid_info.flags & MONITOR_INFO_HAS_PREFERRED_MODE && mode->dmPelsWidth == monitor->edid_info.preferred_width @@ -6667,7 +6665,7 @@ NTSTATUS WINAPI NtGdiDdDDIEnumAdapters2( D3DKMT_ENUMADAPTERS2 *desc ) { desc->pAdapters[idx].hAdapter = open_adapter_from_luid.hAdapter; desc->pAdapters[idx].AdapterLuid = gpu->luid; - desc->pAdapters[idx].NumOfSources = gpu->adapter_count; + desc->pAdapters[idx].NumOfSources = gpu->source_count; desc->pAdapters[idx].bPrecisePresentRegionsPreferred = FALSE; idx += 1; continue;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 41 +++++++++++++--------------------- dlls/wineandroid.drv/init.c | 7 ++---- dlls/winemac.drv/display.c | 10 ++++----- dlls/winewayland.drv/display.c | 25 +++++---------------- dlls/winex11.drv/display.c | 7 +++--- dlls/winex11.drv/x11drv.h | 10 +++++++-- dlls/winex11.drv/xinerama.c | 8 +++---- dlls/winex11.drv/xrandr.c | 10 ++++----- include/wine/gdi_driver.h | 8 +------ 9 files changed, 49 insertions(+), 77 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index a6841c45c65..4692b6c51f2 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1296,11 +1296,11 @@ static BOOL write_source_to_registry( const struct source *source, HKEY *source_ return TRUE; }
-static void add_adapter( const struct gdi_adapter *adapter, void *param ) +static void add_source( const char *name, UINT state_flags, void *param ) { struct device_manager_ctx *ctx = param;
- TRACE( "\n" ); + TRACE( "name %s, state_flags %#x\n", name, state_flags );
if (ctx->source_key) { @@ -1311,11 +1311,11 @@ static void add_adapter( const struct gdi_adapter *adapter, void *param ) memset( &ctx->source, 0, sizeof(ctx->source) ); ctx->source.gpu = &ctx->gpu; ctx->source.id = ctx->source_count; - ctx->source.state_flags = adapter->state_flags; + ctx->source.state_flags = state_flags;
/* Wine specific config key where source settings will be held, symlinked with the logically indexed config key */ - sprintf( ctx->source.path, "%s\%s\Video\%s\Sources\%04x", config_keyA, - control_keyA + strlen( "\Registry\Machine" ), ctx->gpu.guid, ctx->gpu.source_count ); + sprintf( ctx->source.path, "%s\%s\Video\%s\Sources\%s", config_keyA, + control_keyA + strlen( "\Registry\Machine" ), ctx->gpu.guid, name );
if (!write_source_to_registry( &ctx->source, &ctx->source_key )) WARN( "Failed to write source to registry\n" ); @@ -1446,12 +1446,9 @@ static void add_mode( const DEVMODEW *mode, BOOL current, void *param )
if (!ctx->gpu.source_count) { - static const struct gdi_adapter default_adapter = - { - .state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE, - }; - TRACE( "adding default fake adapter\n" ); - add_adapter( &default_adapter, ctx ); + static const DWORD source_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE; + TRACE( "adding default fake source\n" ); + add_source( "Default", source_flags, ctx ); }
nopos_mode = *mode; @@ -1475,7 +1472,7 @@ static void add_mode( const DEVMODEW *mode, BOOL current, void *param ) static const struct gdi_device_manager device_manager = { add_gpu, - add_adapter, + add_source, add_monitor, add_mode, }; @@ -1757,11 +1754,8 @@ static BOOL default_update_display_devices( const struct gdi_device_manager *man { .dmFields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY, .dmBitsPerPel = 16, .dmPelsWidth = 1024, .dmPelsHeight = 768, .dmDisplayFrequency = 60, }, }; + static const DWORD source_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE; static const struct gdi_gpu gpu; - static const struct gdi_adapter adapter = - { - .state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE, - }; struct gdi_monitor monitor = {0}; DEVMODEW mode = {{0}}; UINT i; @@ -1769,7 +1763,7 @@ static BOOL default_update_display_devices( const struct gdi_device_manager *man if (!force) return TRUE;
manager->add_gpu( &gpu, ctx ); - manager->add_adapter( &adapter, ctx ); + manager->add_source( "Default", source_flags, ctx );
if (!read_source_mode( ctx->source_key, ENUM_CURRENT_SETTINGS, &mode )) { @@ -1833,10 +1827,10 @@ static void desktop_add_gpu( const struct gdi_gpu *gpu, void *param ) { }
-static void desktop_add_adapter( const struct gdi_adapter *adapter, void *param ) +static void desktop_add_source( const char *name, UINT state_flags, void *param ) { struct device_manager_ctx *ctx = param; - ctx->is_primary = !!(adapter->state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE); + ctx->is_primary = !!(state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE); }
static void desktop_add_monitor( const struct gdi_monitor *monitor, void *param ) @@ -1858,18 +1852,15 @@ static void desktop_add_mode( const DEVMODEW *mode, BOOL current, void *param ) static const struct gdi_device_manager desktop_device_manager = { desktop_add_gpu, - desktop_add_adapter, + desktop_add_source, desktop_add_monitor, desktop_add_mode, };
static BOOL desktop_update_display_devices( BOOL force, struct device_manager_ctx *ctx ) { + static const DWORD source_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE; static const struct gdi_gpu gpu; - static const struct gdi_adapter adapter = - { - .state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE, - }; struct gdi_monitor monitor = {0}; static struct screen_size { @@ -1934,7 +1925,7 @@ static BOOL desktop_update_display_devices( BOOL force, struct device_manager_ct }
add_gpu( &gpu, ctx ); - add_adapter( &adapter, ctx ); + add_source( "Default", source_flags, ctx ); if (!read_source_mode( ctx->source_key, ENUM_CURRENT_SETTINGS, ¤t )) { current = mode; diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index c39bf690a06..f8646378627 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -273,11 +273,8 @@ BOOL ANDROID_UpdateDisplayDevices( const struct gdi_device_manager *device_manag { if (force || force_display_devices_refresh) { + static const DWORD source_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE; static const struct gdi_gpu gpu; - static const struct gdi_adapter adapter = - { - .state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE, - }; struct gdi_monitor gdi_monitor = { .rc_monitor = virtual_screen_rect, @@ -290,7 +287,7 @@ BOOL ANDROID_UpdateDisplayDevices( const struct gdi_device_manager *device_manag .dmBitsPerPel = screen_bpp, .dmPelsWidth = screen_width, .dmPelsHeight = screen_height, .dmDisplayFrequency = 60, }; device_manager->add_gpu( &gpu, param ); - device_manager->add_adapter( &adapter, param ); + device_manager->add_source( "Default", source_flags, param ); device_manager->add_monitor( &gdi_monitor, param ); device_manager->add_mode( &mode, TRUE, param ); force_display_devices_refresh = FALSE; diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 6d6e76da1ee..ea9b5771064 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -1178,12 +1178,10 @@ BOOL macdrv_UpdateDisplayDevices( const struct gdi_device_manager *device_manage for (adapter = adapters; adapter < adapters + adapter_count; adapter++) { DEVMODEW current_mode = { .dmSize = sizeof(current_mode) }; - struct gdi_adapter gdi_adapter = - { - .id = adapter->id, - .state_flags = adapter->state_flags, - }; - device_manager->add_adapter( &gdi_adapter, param ); + char buffer[32]; + + sprintf( buffer, "%04x", adapter->id ); + device_manager->add_source( buffer, adapter->state_flags, param );
if (macdrv_get_monitors(adapter->id, &monitors, &monitor_count)) break; TRACE("adapter: %#x, monitor count: %d\n", adapter->id, monitor_count); diff --git a/dlls/winewayland.drv/display.c b/dlls/winewayland.drv/display.c index 6c399cbf321..13ab8d64abb 100644 --- a/dlls/winewayland.drv/display.c +++ b/dlls/winewayland.drv/display.c @@ -210,23 +210,8 @@ static void wayland_add_device_gpu(const struct gdi_device_manager *device_manag device_manager->add_gpu(&gpu, param); }
-static void wayland_add_device_adapter(const struct gdi_device_manager *device_manager, - void *param, INT output_id) -{ - struct gdi_adapter adapter; - adapter.id = output_id; - adapter.state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP; - if (output_id == 0) - adapter.state_flags |= DISPLAY_DEVICE_PRIMARY_DEVICE; - - TRACE("id=0x%s state_flags=0x%x\n", - wine_dbgstr_longlong(adapter.id), (UINT)adapter.state_flags); - - device_manager->add_adapter(&adapter, param); -} - static void wayland_add_device_monitor(const struct gdi_device_manager *device_manager, - void *param, struct output_info *output_info) + void *param, DWORD state_flags, struct output_info *output_info) { struct gdi_monitor monitor = {0};
@@ -240,6 +225,7 @@ static void wayland_add_device_monitor(const struct gdi_device_manager *device_m TRACE("name=%s rc_monitor=rc_work=%s\n", output_info->output->name, wine_dbgstr_rect(&monitor.rc_monitor));
+ device_manager->add_source(output_info->output->name, state_flags, param); device_manager->add_monitor(&monitor, param); }
@@ -283,7 +269,7 @@ BOOL WAYLAND_UpdateDisplayDevices(const struct gdi_device_manager *device_manage BOOL force, void *param) { struct wayland_output *output; - INT output_id = 0; + DWORD state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE; struct wl_array output_info_array; struct output_info *output_info;
@@ -312,10 +298,9 @@ BOOL WAYLAND_UpdateDisplayDevices(const struct gdi_device_manager *device_manage
wl_array_for_each(output_info, &output_info_array) { - wayland_add_device_adapter(device_manager, param, output_id); - wayland_add_device_monitor(device_manager, param, output_info); + wayland_add_device_monitor(device_manager, param, state_flags, output_info); wayland_add_device_modes(device_manager, param, output_info); - output_id++; + state_flags &= ~DISPLAY_DEVICE_PRIMARY_DEVICE; }
wl_array_release(&output_info_array); diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c index 49475571f71..5dfbd1b797d 100644 --- a/dlls/winex11.drv/display.c +++ b/dlls/winex11.drv/display.c @@ -397,7 +397,7 @@ RECT get_host_primary_monitor_rect(void) { INT gpu_count, adapter_count, monitor_count; struct gdi_gpu *gpus = NULL; - struct gdi_adapter *adapters = NULL; + struct x11drv_adapter *adapters = NULL; struct gdi_monitor *monitors = NULL; RECT rect = {0};
@@ -515,7 +515,7 @@ static const char *debugstr_devmodew( const DEVMODEW *devmode )
BOOL X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manager, BOOL force, void *param ) { - struct gdi_adapter *adapters; + struct x11drv_adapter *adapters; struct gdi_monitor *monitors; struct gdi_gpu *gpus; INT gpu_count, adapter_count, monitor_count; @@ -548,7 +548,8 @@ BOOL X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manage x11drv_settings_id settings_id; BOOL is_primary = adapters[adapter].state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE;
- device_manager->add_adapter( &adapters[adapter], param ); + sprintf( buffer, "%04lx", adapters[adapter].id ); + device_manager->add_source( buffer, adapters[adapter].state_flags, param );
if (!host_handler.get_monitors( adapters[adapter].id, &monitors, &monitor_count )) break; TRACE("adapter: %#lx, monitor count: %d\n", adapters[adapter].id, monitor_count); diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index a525f0dd499..19b9b23337e 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -764,6 +764,12 @@ void init_user_driver(void);
/* X11 display device handler. Used to initialize display device registry data */
+struct x11drv_adapter +{ + ULONG_PTR id; + DWORD state_flags; +}; + /* Required functions for display device registry initialization */ struct x11drv_display_device_handler { @@ -782,7 +788,7 @@ struct x11drv_display_device_handler * The first adapter has to be primary if GPU is primary. * * Return FALSE on failure with parameters unchanged */ - BOOL (*get_adapters)(ULONG_PTR gpu_id, struct gdi_adapter **adapters, int *count); + BOOL (*get_adapters)(ULONG_PTR gpu_id, struct x11drv_adapter **adapters, int *count);
/* get_monitors will be called to get a list of monitors in EnumDisplayDevices context under an adapter. * The first monitor has to be primary if adapter is primary. @@ -794,7 +800,7 @@ struct x11drv_display_device_handler void (*free_gpus)(struct gdi_gpu *gpus);
/* free_adapters will be called to free an adapter list from get_adapters */ - void (*free_adapters)(struct gdi_adapter *adapters); + void (*free_adapters)(struct x11drv_adapter *adapters);
/* free_monitors will be called to free a monitor list from get_monitors */ void (*free_monitors)(struct gdi_monitor *monitors, int count); diff --git a/dlls/winex11.drv/xinerama.c b/dlls/winex11.drv/xinerama.c index 43b25c02b86..426ea6c11d4 100644 --- a/dlls/winex11.drv/xinerama.c +++ b/dlls/winex11.drv/xinerama.c @@ -213,9 +213,9 @@ static void xinerama_free_gpus( struct gdi_gpu *gpus ) free( gpus ); }
-static BOOL xinerama_get_adapters( ULONG_PTR gpu_id, struct gdi_adapter **new_adapters, int *count ) +static BOOL xinerama_get_adapters( ULONG_PTR gpu_id, struct x11drv_adapter **new_adapters, int *count ) { - struct gdi_adapter *adapters = NULL; + struct x11drv_adapter *adapters = NULL; INT index = 0; INT i, j; INT primary_index; @@ -268,7 +268,7 @@ static BOOL xinerama_get_adapters( ULONG_PTR gpu_id, struct gdi_adapter **new_ad /* Primary adapter has to be first */ if (primary_index) { - struct gdi_adapter tmp; + struct x11drv_adapter tmp; tmp = adapters[primary_index]; adapters[primary_index] = adapters[0]; adapters[0] = tmp; @@ -280,7 +280,7 @@ static BOOL xinerama_get_adapters( ULONG_PTR gpu_id, struct gdi_adapter **new_ad return TRUE; }
-static void xinerama_free_adapters( struct gdi_adapter *adapters ) +static void xinerama_free_adapters( struct x11drv_adapter *adapters ) { free( adapters ); } diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index d77eb1a0163..9d027e75175 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -863,9 +863,9 @@ static void xrandr14_free_gpus( struct gdi_gpu *gpus ) free( gpus ); }
-static BOOL xrandr14_get_adapters( ULONG_PTR gpu_id, struct gdi_adapter **new_adapters, int *count ) +static BOOL xrandr14_get_adapters( ULONG_PTR gpu_id, struct x11drv_adapter **new_adapters, int *count ) { - struct gdi_adapter *adapters = NULL; + struct x11drv_adapter *adapters = NULL; XRRScreenResources *screen_resources = NULL; XRRProviderInfo *provider_info = NULL; XRRCrtcInfo *enum_crtc_info, *crtc_info = NULL; @@ -999,7 +999,7 @@ static BOOL xrandr14_get_adapters( ULONG_PTR gpu_id, struct gdi_adapter **new_ad /* Make primary adapter the first */ if (primary_adapter) { - struct gdi_adapter tmp = adapters[0]; + struct x11drv_adapter tmp = adapters[0]; adapters[0] = adapters[primary_adapter]; adapters[primary_adapter] = tmp; } @@ -1024,7 +1024,7 @@ done: return ret; }
-static void xrandr14_free_adapters( struct gdi_adapter *adapters ) +static void xrandr14_free_adapters( struct x11drv_adapter *adapters ) { free( adapters ); } @@ -1219,7 +1219,7 @@ static BOOL xrandr14_get_id( const WCHAR *device_name, BOOL is_primary, x11drv_s struct current_mode *tmp_modes, *new_current_modes = NULL; INT gpu_count, adapter_count, new_current_mode_count = 0; INT gpu_idx, adapter_idx, display_idx; - struct gdi_adapter *adapters; + struct x11drv_adapter *adapters; struct gdi_gpu *gpus; WCHAR *end;
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index ffe84787d51..f16af308cd3 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -252,12 +252,6 @@ struct gdi_gpu ULONGLONG memory_size; };
-struct gdi_adapter -{ - ULONG_PTR id; - DWORD state_flags; -}; - struct gdi_monitor { RECT rc_monitor; /* RcMonitor in MONITORINFO struct */ @@ -269,7 +263,7 @@ struct gdi_monitor struct gdi_device_manager { void (*add_gpu)( const struct gdi_gpu *gpu, void *param ); - void (*add_adapter)( const struct gdi_adapter *adapter, void *param ); + void (*add_source)( const char *name, UINT state_flags, void *param ); void (*add_monitor)( const struct gdi_monitor *monitor, void *param ); void (*add_mode)( const DEVMODEW *mode, BOOL current, void *param ); };
Rebased and updated, using a symlink between a physically named registry key, which is used to keep persistent information such as the source display settings, and then symlinked to the index-based registry key when devices are refreshed.
Fwiw I don't think the test timeout are related but instead seems to be happening on Gitlab since https://gitlab.winehq.org/wine/wine/-/merge_requests/5262, looks like a crash in some D3D tests while holding the display cache mutex. It's difficult to debug as I am unable to reproduce locally.
Zhiyi Zhang (@zhiyi) commented about dlls/win32u/sysparams.c:
ctx->gpu_count++;
}
-static void add_adapter( const struct gdi_adapter *adapter, void *param ) +static BOOL write_adapter_to_registry( const struct adapter *adapter, HKEY *adapter_key )
write_adapter_to_registry() never fails. So there is no point in having a return value. Maybe return FALSE when failing to create a link key?
Zhiyi Zhang (@zhiyi) commented about dlls/winewayland.drv/display.c:
-{
- struct gdi_adapter adapter;
- adapter.id = output_id;
- adapter.state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP;
- if (output_id == 0)
adapter.state_flags |= DISPLAY_DEVICE_PRIMARY_DEVICE;
- TRACE("id=0x%s state_flags=0x%x\n",
wine_dbgstr_longlong(adapter.id), (UINT)adapter.state_flags);
- device_manager->add_adapter(&adapter, param);
-}
static void wayland_add_device_monitor(const struct gdi_device_manager *device_manager,
void *param, struct output_info *output_info)
void *param, DWORD state_flags, struct output_info *output_info)
I don't like that you're passing state flags for GDI adapters to monitor devices. You're also adding a GDI adapter/source in wayland_add_device_monitor(). However, for example, there can be two monitors under the same GDI adapter when they're mirrored. I understand that maybe winewayland.drv doesn't handle that yet. Let's keep wayland_add_device_adapter and rename it to wayland_add_device_source().
While you're at it, please rebase to the latest master to avoid merge conflicts.