gdi32: Move D3DKMTOpenAdapterFromGdiDisplayName to objects.c.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2021-08-25 13:39:47 +01:00 committed by Alexandre Julliard
parent fbd39cd8b5
commit 1c1ff37390
2 changed files with 96 additions and 92 deletions

View File

@ -32,11 +32,6 @@
#include "ddrawgdi.h"
#include "wine/winbase16.h"
#include "winuser.h"
#include "winternl.h"
#include "initguid.h"
#include "devguid.h"
#include "setupapi.h"
#include "ddk/d3dkmthk.h"
#include "ntgdi_private.h"
#include "wine/list.h"
@ -45,8 +40,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(driver);
DEFINE_DEVPROPKEY(DEVPROPKEY_GPU_LUID, 0x60b193cb, 0x5276, 0x4d0f, 0x96, 0xfc, 0xf1, 0x73, 0xab, 0xad, 0x3e, 0xc6, 2);
struct graphics_driver
{
struct list entry;
@ -163,20 +156,6 @@ BOOL is_display_device( LPCWSTR name )
return TRUE;
}
static HANDLE get_display_device_init_mutex( void )
{
HANDLE mutex = CreateMutexW( NULL, FALSE, L"display_device_init" );
WaitForSingleObject( mutex, INFINITE );
return mutex;
}
static void release_display_device_init_mutex( HANDLE mutex )
{
ReleaseMutex( mutex );
CloseHandle( mutex );
}
#ifdef __i386__
static const WCHAR printer_env[] = L"w32x86";
#elif defined __x86_64__
@ -1249,76 +1228,6 @@ NTSTATUS WINAPI NtGdiDdDDICloseAdapter( const D3DKMT_CLOSEADAPTER *desc )
return status;
}
/******************************************************************************
* D3DKMTOpenAdapterFromGdiDisplayName [GDI32.@]
*/
NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc )
{
WCHAR *end, key_nameW[MAX_PATH], bufferW[MAX_PATH];
HDEVINFO devinfo = INVALID_HANDLE_VALUE;
NTSTATUS status = STATUS_UNSUCCESSFUL;
D3DKMT_OPENADAPTERFROMLUID luid_desc;
SP_DEVINFO_DATA device_data;
DWORD size, state_flags;
DEVPROPTYPE type;
HANDLE mutex;
int index;
TRACE("(%p)\n", desc);
if (!desc)
return STATUS_UNSUCCESSFUL;
TRACE("DeviceName: %s\n", wine_dbgstr_w( desc->DeviceName ));
if (wcsnicmp( desc->DeviceName, L"\\\\.\\DISPLAY", lstrlenW(L"\\\\.\\DISPLAY") ))
return STATUS_UNSUCCESSFUL;
index = wcstol( desc->DeviceName + lstrlenW(L"\\\\.\\DISPLAY"), &end, 10 ) - 1;
if (*end)
return STATUS_UNSUCCESSFUL;
/* Get adapter LUID from SetupAPI */
mutex = get_display_device_init_mutex();
size = sizeof( bufferW );
swprintf( key_nameW, MAX_PATH, L"\\Device\\Video%d", index );
if (RegGetValueW( HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\VIDEO", key_nameW, RRF_RT_REG_SZ, NULL, bufferW, &size ))
goto done;
/* Strip \Registry\Machine\ prefix and retrieve Wine specific data set by the display driver */
lstrcpyW( key_nameW, bufferW + 18 );
size = sizeof( state_flags );
if (RegGetValueW( HKEY_CURRENT_CONFIG, key_nameW, L"StateFlags", RRF_RT_REG_DWORD, NULL,
&state_flags, &size ))
goto done;
if (!(state_flags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
goto done;
size = sizeof( bufferW );
if (RegGetValueW( HKEY_CURRENT_CONFIG, key_nameW, L"GPUID", RRF_RT_REG_SZ, NULL, bufferW, &size ))
goto done;
devinfo = SetupDiCreateDeviceInfoList( &GUID_DEVCLASS_DISPLAY, NULL );
device_data.cbSize = sizeof( device_data );
SetupDiOpenDeviceInfoW( devinfo, bufferW, NULL, 0, &device_data );
if (!SetupDiGetDevicePropertyW( devinfo, &device_data, &DEVPROPKEY_GPU_LUID, &type,
(BYTE *)&luid_desc.AdapterLuid, sizeof( luid_desc.AdapterLuid ),
NULL, 0))
goto done;
if ((status = NtGdiDdDDIOpenAdapterFromLuid( &luid_desc ))) goto done;
desc->hAdapter = luid_desc.hAdapter;
desc->AdapterLuid = luid_desc.AdapterLuid;
desc->VidPnSourceId = index;
done:
SetupDiDestroyDeviceInfoList( devinfo );
release_display_device_init_mutex( mutex );
return status;
}
/******************************************************************************
* NtGdiDdDDIOpenAdapterFromLuid (win32u.@)
*/

View File

@ -19,9 +19,17 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdlib.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
#include "gdi_private.h"
#include "winuser.h"
#include "winreg.h"
#include "winnls.h"
#include "winternl.h"
#include "initguid.h"
#include "devguid.h"
#include "setupapi.h"
#include "wine/rbtree.h"
#include "wine/debug.h"
@ -29,6 +37,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(gdi);
DEFINE_DEVPROPKEY(DEVPROPKEY_GPU_LUID, 0x60b193cb, 0x5276, 0x4d0f, 0x96, 0xfc, 0xf1, 0x73, 0xab, 0xad, 0x3e, 0xc6, 2);
struct hdc_list
{
HDC hdc;
@ -619,3 +629,88 @@ UINT WINAPI SetDIBColorTable( HDC hdc, UINT start, UINT count, const RGBQUAD *co
{
return NtGdiDoPalette( hdc, start, count, (void *)colors, NtGdiSetDIBColorTable, FALSE );
}
static HANDLE get_display_device_init_mutex( void )
{
HANDLE mutex = CreateMutexW( NULL, FALSE, L"display_device_init" );
WaitForSingleObject( mutex, INFINITE );
return mutex;
}
static void release_display_device_init_mutex( HANDLE mutex )
{
ReleaseMutex( mutex );
CloseHandle( mutex );
}
/***********************************************************************
* D3DKMTOpenAdapterFromGdiDisplayName (GDI32.@)
*/
NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc )
{
WCHAR *end, key_nameW[MAX_PATH], bufferW[MAX_PATH];
HDEVINFO devinfo = INVALID_HANDLE_VALUE;
NTSTATUS status = STATUS_UNSUCCESSFUL;
D3DKMT_OPENADAPTERFROMLUID luid_desc;
SP_DEVINFO_DATA device_data;
DWORD size, state_flags;
DEVPROPTYPE type;
HANDLE mutex;
int index;
TRACE("(%p)\n", desc);
if (!desc)
return STATUS_UNSUCCESSFUL;
TRACE("DeviceName: %s\n", wine_dbgstr_w( desc->DeviceName ));
if (wcsnicmp( desc->DeviceName, L"\\\\.\\DISPLAY", lstrlenW(L"\\\\.\\DISPLAY") ))
return STATUS_UNSUCCESSFUL;
index = wcstol( desc->DeviceName + lstrlenW(L"\\\\.\\DISPLAY"), &end, 10 ) - 1;
if (*end)
return STATUS_UNSUCCESSFUL;
/* Get adapter LUID from SetupAPI */
mutex = get_display_device_init_mutex();
size = sizeof( bufferW );
swprintf( key_nameW, MAX_PATH, L"\\Device\\Video%d", index );
if (RegGetValueW( HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\VIDEO", key_nameW,
RRF_RT_REG_SZ, NULL, bufferW, &size ))
goto done;
/* Strip \Registry\Machine\ prefix and retrieve Wine specific data set by the display driver */
lstrcpyW( key_nameW, bufferW + 18 );
size = sizeof( state_flags );
if (RegGetValueW( HKEY_CURRENT_CONFIG, key_nameW, L"StateFlags", RRF_RT_REG_DWORD, NULL,
&state_flags, &size ))
goto done;
if (!(state_flags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
goto done;
size = sizeof( bufferW );
if (RegGetValueW( HKEY_CURRENT_CONFIG, key_nameW, L"GPUID", RRF_RT_REG_SZ, NULL, bufferW, &size ))
goto done;
devinfo = SetupDiCreateDeviceInfoList( &GUID_DEVCLASS_DISPLAY, NULL );
device_data.cbSize = sizeof( device_data );
SetupDiOpenDeviceInfoW( devinfo, bufferW, NULL, 0, &device_data );
if (!SetupDiGetDevicePropertyW( devinfo, &device_data, &DEVPROPKEY_GPU_LUID, &type,
(BYTE *)&luid_desc.AdapterLuid, sizeof( luid_desc.AdapterLuid ),
NULL, 0))
goto done;
if ((status = NtGdiDdDDIOpenAdapterFromLuid( &luid_desc ))) goto done;
desc->hAdapter = luid_desc.hAdapter;
desc->AdapterLuid = luid_desc.AdapterLuid;
desc->VidPnSourceId = index;
done:
SetupDiDestroyDeviceInfoList( devinfo );
release_display_device_init_mutex( mutex );
return status;
}