From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/Makefile.in | 1 + dlls/win32u/d3dkmt.c | 305 ++++++++++++++++++++++++++++++++++++++++ dlls/win32u/driver.c | 284 ------------------------------------- 3 files changed, 306 insertions(+), 284 deletions(-) create mode 100644 dlls/win32u/d3dkmt.c
diff --git a/dlls/win32u/Makefile.in b/dlls/win32u/Makefile.in index 878baeaffbe..61c06e900a4 100644 --- a/dlls/win32u/Makefile.in +++ b/dlls/win32u/Makefile.in @@ -16,6 +16,7 @@ SOURCES = \ clipboard.c \ clipping.c \ cursoricon.c \ + d3dkmt.c \ dc.c \ dce.c \ defwnd.c \ diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c new file mode 100644 index 00000000000..42386f95bde --- /dev/null +++ b/dlls/win32u/d3dkmt.c @@ -0,0 +1,305 @@ +/* + * Copyright 2024 Rémi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#if 0 +#pragma makedep unix +#endif + +#include "config.h" + +#include <pthread.h> + +#include "ntstatus.h" +#define WIN32_NO_STATUS +#include "ntgdi_private.h" +#include "win32u_private.h" +#include "wine/vulkan.h" +#include "wine/vulkan_driver.h" + +WINE_DEFAULT_DEBUG_CHANNEL(vulkan); + +struct d3dkmt_adapter +{ + D3DKMT_HANDLE handle; /* Kernel mode graphics adapter handle */ + struct list entry; /* List entry */ + VkPhysicalDevice vk_device; /* Vulkan physical device */ +}; + +struct d3dkmt_device +{ + D3DKMT_HANDLE handle; /* Kernel mode graphics device handle*/ + struct list entry; /* List entry */ +}; + +static pthread_mutex_t d3dkmt_lock = PTHREAD_MUTEX_INITIALIZER; +static struct list d3dkmt_adapters = LIST_INIT( d3dkmt_adapters ); +static struct list d3dkmt_devices = LIST_INIT( d3dkmt_devices ); + +/****************************************************************************** + * NtGdiDdDDIOpenAdapterFromHdc (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromHdc( D3DKMT_OPENADAPTERFROMHDC *desc ) +{ + FIXME( "(%p): stub\n", desc ); + return STATUS_NO_MEMORY; +} + +/****************************************************************************** + * NtGdiDdDDIEscape (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIEscape( const D3DKMT_ESCAPE *desc ) +{ + FIXME( "(%p): stub\n", desc ); + return STATUS_NO_MEMORY; +} + +/****************************************************************************** + * NtGdiDdDDICloseAdapter (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDICloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) +{ + NTSTATUS status = STATUS_INVALID_PARAMETER; + struct d3dkmt_adapter *adapter; + + TRACE( "(%p)\n", desc ); + + if (!desc || !desc->hAdapter) return STATUS_INVALID_PARAMETER; + + if (get_display_driver()->pD3DKMTCloseAdapter) + get_display_driver()->pD3DKMTCloseAdapter( desc ); + + pthread_mutex_lock( &d3dkmt_lock ); + LIST_FOR_EACH_ENTRY( adapter, &d3dkmt_adapters, struct d3dkmt_adapter, entry ) + { + if (adapter->handle == desc->hAdapter) + { + list_remove( &adapter->entry ); + free( adapter ); + status = STATUS_SUCCESS; + break; + } + } + pthread_mutex_unlock( &d3dkmt_lock ); + + return status; +} + +/****************************************************************************** + * NtGdiDdDDIOpenAdapterFromDeviceName (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromDeviceName( D3DKMT_OPENADAPTERFROMDEVICENAME *desc ) +{ + D3DKMT_OPENADAPTERFROMLUID desc_luid; + NTSTATUS status; + + FIXME( "desc %p stub.\n", desc ); + + if (!desc || !desc->pDeviceName) return STATUS_INVALID_PARAMETER; + + memset( &desc_luid, 0, sizeof(desc_luid) ); + if ((status = NtGdiDdDDIOpenAdapterFromLuid( &desc_luid ))) return status; + + desc->AdapterLuid = desc_luid.AdapterLuid; + desc->hAdapter = desc_luid.hAdapter; + return STATUS_SUCCESS; +} + +/****************************************************************************** + * NtGdiDdDDIOpenAdapterFromLuid (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc ) +{ + static D3DKMT_HANDLE handle_start = 0; + struct d3dkmt_adapter *adapter; + + if (!(adapter = malloc( sizeof(*adapter) ))) return STATUS_NO_MEMORY; + + pthread_mutex_lock( &d3dkmt_lock ); + desc->hAdapter = adapter->handle = ++handle_start; + list_add_tail( &d3dkmt_adapters, &adapter->entry ); + pthread_mutex_unlock( &d3dkmt_lock ); + + if (get_display_driver()->pD3DKMTOpenAdapterFromLuid) + get_display_driver()->pD3DKMTOpenAdapterFromLuid( desc ); + + return STATUS_SUCCESS; +} + +/****************************************************************************** + * NtGdiDdDDICreateDevice (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDICreateDevice( D3DKMT_CREATEDEVICE *desc ) +{ + static D3DKMT_HANDLE handle_start = 0; + struct d3dkmt_adapter *adapter; + struct d3dkmt_device *device; + BOOL found = FALSE; + + TRACE( "(%p)\n", desc ); + + if (!desc) return STATUS_INVALID_PARAMETER; + + pthread_mutex_lock( &d3dkmt_lock ); + LIST_FOR_EACH_ENTRY( adapter, &d3dkmt_adapters, struct d3dkmt_adapter, entry ) + { + if (adapter->handle == desc->hAdapter) + { + found = TRUE; + break; + } + } + pthread_mutex_unlock( &d3dkmt_lock ); + + if (!found) return STATUS_INVALID_PARAMETER; + + if (desc->Flags.LegacyMode || desc->Flags.RequestVSync || desc->Flags.DisableGpuTimeout) + FIXME( "Flags unsupported.\n" ); + + device = calloc( 1, sizeof(*device) ); + if (!device) return STATUS_NO_MEMORY; + + pthread_mutex_lock( &d3dkmt_lock ); + device->handle = ++handle_start; + list_add_tail( &d3dkmt_devices, &device->entry ); + pthread_mutex_unlock( &d3dkmt_lock ); + + desc->hDevice = device->handle; + return STATUS_SUCCESS; +} + +/****************************************************************************** + * NtGdiDdDDIDestroyDevice (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIDestroyDevice( const D3DKMT_DESTROYDEVICE *desc ) +{ + NTSTATUS status = STATUS_INVALID_PARAMETER; + D3DKMT_SETVIDPNSOURCEOWNER set_owner_desc; + struct d3dkmt_device *device; + + TRACE( "(%p)\n", desc ); + + if (!desc || !desc->hDevice) return STATUS_INVALID_PARAMETER; + + pthread_mutex_lock( &d3dkmt_lock ); + LIST_FOR_EACH_ENTRY( device, &d3dkmt_devices, struct d3dkmt_device, entry ) + { + if (device->handle == desc->hDevice) + { + memset( &set_owner_desc, 0, sizeof(set_owner_desc) ); + set_owner_desc.hDevice = desc->hDevice; + NtGdiDdDDISetVidPnSourceOwner( &set_owner_desc ); + list_remove( &device->entry ); + free( device ); + status = STATUS_SUCCESS; + break; + } + } + pthread_mutex_unlock( &d3dkmt_lock ); + + return status; +} + +/****************************************************************************** + * NtGdiDdDDIQueryAdapterInfo (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIQueryAdapterInfo( D3DKMT_QUERYADAPTERINFO *desc ) +{ + if (!desc) return STATUS_INVALID_PARAMETER; + + FIXME( "desc %p, type %d stub\n", desc, desc->Type ); + return STATUS_NOT_IMPLEMENTED; +} + +/****************************************************************************** + * NtGdiDdDDIQueryStatistics (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIQueryStatistics( D3DKMT_QUERYSTATISTICS *stats ) +{ + FIXME( "(%p): stub\n", stats ); + return STATUS_SUCCESS; +} + +/****************************************************************************** + * NtGdiDdDDIQueryVideoMemoryInfo (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *desc ) +{ + OBJECT_BASIC_INFORMATION info; + NTSTATUS status; + + TRACE( "(%p)\n", desc ); + + if (!desc || !desc->hAdapter || + (desc->MemorySegmentGroup != D3DKMT_MEMORY_SEGMENT_GROUP_LOCAL && + desc->MemorySegmentGroup != D3DKMT_MEMORY_SEGMENT_GROUP_NON_LOCAL)) + return STATUS_INVALID_PARAMETER; + + /* FIXME: Wine currently doesn't support linked adapters */ + if (desc->PhysicalAdapterIndex > 0) return STATUS_INVALID_PARAMETER; + + status = NtQueryObject( desc->hProcess ? desc->hProcess : GetCurrentProcess(), + ObjectBasicInformation, &info, sizeof(info), NULL ); + if (status != STATUS_SUCCESS) return status; + if (!(info.GrantedAccess & PROCESS_QUERY_INFORMATION)) return STATUS_ACCESS_DENIED; + + if (!get_display_driver()->pD3DKMTQueryVideoMemoryInfo) return STATUS_PROCEDURE_NOT_FOUND; + return get_display_driver()->pD3DKMTQueryVideoMemoryInfo( desc ); +} + +/****************************************************************************** + * NtGdiDdDDISetQueuedLimit (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDISetQueuedLimit( D3DKMT_SETQUEUEDLIMIT *desc ) +{ + FIXME( "(%p): stub\n", desc ); + return STATUS_NOT_IMPLEMENTED; +} + +/****************************************************************************** + * NtGdiDdDDISetVidPnSourceOwner (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) +{ + TRACE( "(%p)\n", desc ); + + if (!get_display_driver()->pD3DKMTSetVidPnSourceOwner) return STATUS_PROCEDURE_NOT_FOUND; + + if (!desc || !desc->hDevice || (desc->VidPnSourceCount && (!desc->pType || !desc->pVidPnSourceId))) + return STATUS_INVALID_PARAMETER; + + /* Store the VidPN source ownership info in the graphics driver because + * the graphics driver needs to change ownership sometimes. For example, + * when a new window is moved to a VidPN source with an exclusive owner, + * such an exclusive owner will be released before showing the new window */ + return get_display_driver()->pD3DKMTSetVidPnSourceOwner( desc ); +} + +/****************************************************************************** + * NtGdiDdDDICheckVidPnExclusiveOwnership (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDICheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) +{ + TRACE( "(%p)\n", desc ); + + if (!get_display_driver()->pD3DKMTCheckVidPnExclusiveOwnership) + return STATUS_PROCEDURE_NOT_FOUND; + + if (!desc || !desc->hAdapter) return STATUS_INVALID_PARAMETER; + + return get_display_driver()->pD3DKMTCheckVidPnExclusiveOwnership( desc ); +} diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index 7fcdbc4c383..cf1b7764145 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -37,25 +37,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(driver); WINE_DECLARE_DEBUG_CHANNEL(winediag);
-struct d3dkmt_adapter -{ - D3DKMT_HANDLE handle; /* Kernel mode graphics adapter handle */ - struct list entry; /* List entry */ -}; - -struct d3dkmt_device -{ - D3DKMT_HANDLE handle; /* Kernel mode graphics device handle*/ - struct list entry; /* List entry */ -}; - static const struct user_driver_funcs lazy_load_driver; static struct user_driver_funcs null_user_driver; - -static struct list d3dkmt_adapters = LIST_INIT( d3dkmt_adapters ); -static struct list d3dkmt_devices = LIST_INIT( d3dkmt_devices ); - -static pthread_mutex_t driver_lock = PTHREAD_MUTEX_INITIALIZER; static WCHAR driver_load_error[80];
static INT nulldrv_AbortDoc( PHYSDEV dev ) @@ -1448,270 +1431,3 @@ INT WINAPI NtGdiExtEscape( HDC hdc, WCHAR *driver, int driver_id, INT escape, IN release_dc_ptr( dc ); return ret; } - - -/****************************************************************************** - * NtGdiDdDDIOpenAdapterFromHdc (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromHdc( D3DKMT_OPENADAPTERFROMHDC *desc ) -{ - FIXME( "(%p): stub\n", desc ); - return STATUS_NO_MEMORY; -} - -/****************************************************************************** - * NtGdiDdDDIEscape (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDIEscape( const D3DKMT_ESCAPE *desc ) -{ - FIXME( "(%p): stub\n", desc ); - return STATUS_NO_MEMORY; -} - -/****************************************************************************** - * NtGdiDdDDICloseAdapter (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDICloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) -{ - NTSTATUS status = STATUS_INVALID_PARAMETER; - struct d3dkmt_adapter *adapter; - - TRACE("(%p)\n", desc); - - if (!desc || !desc->hAdapter) - return STATUS_INVALID_PARAMETER; - - if (get_display_driver()->pD3DKMTCloseAdapter) - get_display_driver()->pD3DKMTCloseAdapter( desc ); - - pthread_mutex_lock( &driver_lock ); - LIST_FOR_EACH_ENTRY( adapter, &d3dkmt_adapters, struct d3dkmt_adapter, entry ) - { - if (adapter->handle == desc->hAdapter) - { - list_remove( &adapter->entry ); - free( adapter ); - status = STATUS_SUCCESS; - break; - } - } - pthread_mutex_unlock( &driver_lock ); - - return status; -} - -/****************************************************************************** - * NtGdiDdDDIOpenAdapterFromDeviceName (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromDeviceName( D3DKMT_OPENADAPTERFROMDEVICENAME *desc ) -{ - D3DKMT_OPENADAPTERFROMLUID desc_luid; - NTSTATUS status; - - FIXME( "desc %p stub.\n", desc ); - - if (!desc || !desc->pDeviceName) return STATUS_INVALID_PARAMETER; - - memset( &desc_luid, 0, sizeof( desc_luid )); - if ((status = NtGdiDdDDIOpenAdapterFromLuid( &desc_luid ))) return status; - - desc->AdapterLuid = desc_luid.AdapterLuid; - desc->hAdapter = desc_luid.hAdapter; - return STATUS_SUCCESS; -} - -/****************************************************************************** - * NtGdiDdDDIOpenAdapterFromLuid (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc ) -{ - static D3DKMT_HANDLE handle_start = 0; - struct d3dkmt_adapter *adapter; - - if (!(adapter = malloc( sizeof( *adapter ) ))) return STATUS_NO_MEMORY; - - pthread_mutex_lock( &driver_lock ); - desc->hAdapter = adapter->handle = ++handle_start; - list_add_tail( &d3dkmt_adapters, &adapter->entry ); - pthread_mutex_unlock( &driver_lock ); - - if (get_display_driver()->pD3DKMTOpenAdapterFromLuid) - get_display_driver()->pD3DKMTOpenAdapterFromLuid( desc ); - - return STATUS_SUCCESS; -} - -/****************************************************************************** - * NtGdiDdDDICreateDevice (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDICreateDevice( D3DKMT_CREATEDEVICE *desc ) -{ - static D3DKMT_HANDLE handle_start = 0; - struct d3dkmt_adapter *adapter; - struct d3dkmt_device *device; - BOOL found = FALSE; - - TRACE("(%p)\n", desc); - - if (!desc) - return STATUS_INVALID_PARAMETER; - - pthread_mutex_lock( &driver_lock ); - LIST_FOR_EACH_ENTRY( adapter, &d3dkmt_adapters, struct d3dkmt_adapter, entry ) - { - if (adapter->handle == desc->hAdapter) - { - found = TRUE; - break; - } - } - pthread_mutex_unlock( &driver_lock ); - - if (!found) - return STATUS_INVALID_PARAMETER; - - if (desc->Flags.LegacyMode || desc->Flags.RequestVSync || desc->Flags.DisableGpuTimeout) - FIXME("Flags unsupported.\n"); - - device = calloc( 1, sizeof( *device ) ); - if (!device) - return STATUS_NO_MEMORY; - - pthread_mutex_lock( &driver_lock ); - device->handle = ++handle_start; - list_add_tail( &d3dkmt_devices, &device->entry ); - pthread_mutex_unlock( &driver_lock ); - - desc->hDevice = device->handle; - return STATUS_SUCCESS; -} - -/****************************************************************************** - * NtGdiDdDDIDestroyDevice (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDIDestroyDevice( const D3DKMT_DESTROYDEVICE *desc ) -{ - NTSTATUS status = STATUS_INVALID_PARAMETER; - D3DKMT_SETVIDPNSOURCEOWNER set_owner_desc; - struct d3dkmt_device *device; - - TRACE("(%p)\n", desc); - - if (!desc || !desc->hDevice) - return STATUS_INVALID_PARAMETER; - - pthread_mutex_lock( &driver_lock ); - LIST_FOR_EACH_ENTRY( device, &d3dkmt_devices, struct d3dkmt_device, entry ) - { - if (device->handle == desc->hDevice) - { - memset( &set_owner_desc, 0, sizeof(set_owner_desc) ); - set_owner_desc.hDevice = desc->hDevice; - NtGdiDdDDISetVidPnSourceOwner( &set_owner_desc ); - list_remove( &device->entry ); - free( device ); - status = STATUS_SUCCESS; - break; - } - } - pthread_mutex_unlock( &driver_lock ); - - return status; -} - -/****************************************************************************** - * NtGdiDdDDIQueryAdapterInfo (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDIQueryAdapterInfo( D3DKMT_QUERYADAPTERINFO *desc ) -{ - if (!desc) - return STATUS_INVALID_PARAMETER; - - FIXME("desc %p, type %d stub\n", desc, desc->Type); - return STATUS_NOT_IMPLEMENTED; -} - -/****************************************************************************** - * NtGdiDdDDIQueryStatistics (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDIQueryStatistics( D3DKMT_QUERYSTATISTICS *stats ) -{ - FIXME("(%p): stub\n", stats); - return STATUS_SUCCESS; -} - -/****************************************************************************** - * NtGdiDdDDIQueryVideoMemoryInfo (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDIQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *desc ) -{ - OBJECT_BASIC_INFORMATION info; - NTSTATUS status; - - TRACE("(%p)\n", desc); - - if (!desc || !desc->hAdapter || - (desc->MemorySegmentGroup != D3DKMT_MEMORY_SEGMENT_GROUP_LOCAL && - desc->MemorySegmentGroup != D3DKMT_MEMORY_SEGMENT_GROUP_NON_LOCAL)) - return STATUS_INVALID_PARAMETER; - - /* FIXME: Wine currently doesn't support linked adapters */ - if (desc->PhysicalAdapterIndex > 0) - return STATUS_INVALID_PARAMETER; - - status = NtQueryObject(desc->hProcess ? desc->hProcess : GetCurrentProcess(), - ObjectBasicInformation, &info, sizeof(info), NULL); - if (status != STATUS_SUCCESS) - return status; - if (!(info.GrantedAccess & PROCESS_QUERY_INFORMATION)) - return STATUS_ACCESS_DENIED; - - if (!get_display_driver()->pD3DKMTQueryVideoMemoryInfo) - return STATUS_PROCEDURE_NOT_FOUND; - return get_display_driver()->pD3DKMTQueryVideoMemoryInfo(desc); -} - -/****************************************************************************** - * NtGdiDdDDISetQueuedLimit (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDISetQueuedLimit( D3DKMT_SETQUEUEDLIMIT *desc ) -{ - FIXME( "(%p): stub\n", desc ); - return STATUS_NOT_IMPLEMENTED; -} - -/****************************************************************************** - * NtGdiDdDDISetVidPnSourceOwner (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) -{ - TRACE("(%p)\n", desc); - - if (!get_display_driver()->pD3DKMTSetVidPnSourceOwner) - return STATUS_PROCEDURE_NOT_FOUND; - - if (!desc || !desc->hDevice || (desc->VidPnSourceCount && (!desc->pType || !desc->pVidPnSourceId))) - return STATUS_INVALID_PARAMETER; - - /* Store the VidPN source ownership info in the graphics driver because - * the graphics driver needs to change ownership sometimes. For example, - * when a new window is moved to a VidPN source with an exclusive owner, - * such an exclusive owner will be released before showing the new window */ - return get_display_driver()->pD3DKMTSetVidPnSourceOwner( desc ); -} - -/****************************************************************************** - * NtGdiDdDDICheckVidPnExclusiveOwnership (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDICheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) -{ - TRACE("(%p)\n", desc); - - if (!get_display_driver()->pD3DKMTCheckVidPnExclusiveOwnership) - return STATUS_PROCEDURE_NOT_FOUND; - - if (!desc || !desc->hAdapter) - return STATUS_INVALID_PARAMETER; - - return get_display_driver()->pD3DKMTCheckVidPnExclusiveOwnership( desc ); -}
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/d3dkmt.c | 157 ++++++++++++++++++++++++++++----- dlls/win32u/dibdrv/dc.c | 4 - dlls/win32u/driver.c | 12 --- dlls/win32u/emfdrv.c | 2 - dlls/win32u/font.c | 2 - dlls/win32u/path.c | 2 - dlls/winex11.drv/init.c | 2 - dlls/winex11.drv/x11drv.h | 2 - dlls/winex11.drv/x11drv_main.c | 149 ------------------------------- dlls/winex11.drv/xrender.c | 2 - include/wine/gdi_driver.h | 4 +- 11 files changed, 138 insertions(+), 200 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 42386f95bde..f4d695ac0cb 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -46,9 +46,18 @@ struct d3dkmt_device struct list entry; /* List entry */ };
+struct d3dkmt_vidpn_source +{ + D3DKMT_VIDPNSOURCEOWNER_TYPE type; /* VidPN source owner type */ + D3DDDI_VIDEO_PRESENT_SOURCE_ID id; /* VidPN present source id */ + D3DKMT_HANDLE device; /* Kernel mode device context */ + struct list entry; /* List entry */ +}; + static pthread_mutex_t d3dkmt_lock = PTHREAD_MUTEX_INITIALIZER; static struct list d3dkmt_adapters = LIST_INIT( d3dkmt_adapters ); static struct list d3dkmt_devices = LIST_INIT( d3dkmt_devices ); +static struct list d3dkmt_vidpn_sources = LIST_INIT( d3dkmt_vidpn_sources ); /* VidPN source information list */
/****************************************************************************** * NtGdiDdDDIOpenAdapterFromHdc (win32u.@) @@ -187,9 +196,8 @@ NTSTATUS WINAPI NtGdiDdDDICreateDevice( D3DKMT_CREATEDEVICE *desc ) */ NTSTATUS WINAPI NtGdiDdDDIDestroyDevice( const D3DKMT_DESTROYDEVICE *desc ) { - NTSTATUS status = STATUS_INVALID_PARAMETER; - D3DKMT_SETVIDPNSOURCEOWNER set_owner_desc; - struct d3dkmt_device *device; + D3DKMT_SETVIDPNSOURCEOWNER set_owner_desc = {0}; + struct d3dkmt_device *device, *found = NULL;
TRACE( "(%p)\n", desc );
@@ -200,18 +208,19 @@ NTSTATUS WINAPI NtGdiDdDDIDestroyDevice( const D3DKMT_DESTROYDEVICE *desc ) { if (device->handle == desc->hDevice) { - memset( &set_owner_desc, 0, sizeof(set_owner_desc) ); - set_owner_desc.hDevice = desc->hDevice; - NtGdiDdDDISetVidPnSourceOwner( &set_owner_desc ); list_remove( &device->entry ); - free( device ); - status = STATUS_SUCCESS; + found = device; break; } } pthread_mutex_unlock( &d3dkmt_lock );
- return status; + if (!found) return STATUS_INVALID_PARAMETER; + + set_owner_desc.hDevice = desc->hDevice; + NtGdiDdDDISetVidPnSourceOwner( &set_owner_desc ); + free( found ); + return STATUS_SUCCESS; }
/****************************************************************************** @@ -275,18 +284,115 @@ NTSTATUS WINAPI NtGdiDdDDISetQueuedLimit( D3DKMT_SETQUEUEDLIMIT *desc ) */ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) { - TRACE( "(%p)\n", desc ); + struct d3dkmt_vidpn_source *source, *source2; + BOOL found; + UINT i;
- if (!get_display_driver()->pD3DKMTSetVidPnSourceOwner) return STATUS_PROCEDURE_NOT_FOUND; + TRACE( "(%p)\n", desc );
if (!desc || !desc->hDevice || (desc->VidPnSourceCount && (!desc->pType || !desc->pVidPnSourceId))) return STATUS_INVALID_PARAMETER;
- /* Store the VidPN source ownership info in the graphics driver because - * the graphics driver needs to change ownership sometimes. For example, - * when a new window is moved to a VidPN source with an exclusive owner, - * such an exclusive owner will be released before showing the new window */ - return get_display_driver()->pD3DKMTSetVidPnSourceOwner( desc ); + pthread_mutex_lock( &d3dkmt_lock ); + + /* Check parameters */ + for (i = 0; i < desc->VidPnSourceCount; ++i) + { + LIST_FOR_EACH_ENTRY( source, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) + { + if (source->id == desc->pVidPnSourceId[i]) + { + /* Same device */ + if (source->device == desc->hDevice) + { + if ((source->type == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE && + (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_SHARED || + desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EMULATED)) || + (source->type == D3DKMT_VIDPNSOURCEOWNER_EMULATED && + desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE)) + { + pthread_mutex_unlock( &d3dkmt_lock ); + return STATUS_INVALID_PARAMETER; + } + } + /* Different devices */ + else + { + if ((source->type == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE || source->type == D3DKMT_VIDPNSOURCEOWNER_EMULATED) && + (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE || + desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EMULATED)) + { + pthread_mutex_unlock( &d3dkmt_lock ); + return STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE; + } + } + } + } + + /* On Windows, it seems that all video present sources are owned by DMM clients, so any attempt to set + * D3DKMT_VIDPNSOURCEOWNER_SHARED come back STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE */ + if (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_SHARED) + { + pthread_mutex_unlock( &d3dkmt_lock ); + return STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE; + } + + /* FIXME: D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI unsupported */ + if (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI || desc->pType[i] > D3DKMT_VIDPNSOURCEOWNER_EMULATED) + { + pthread_mutex_unlock( &d3dkmt_lock ); + return STATUS_INVALID_PARAMETER; + } + } + + /* Remove owner */ + if (!desc->VidPnSourceCount && !desc->pType && !desc->pVidPnSourceId) + { + LIST_FOR_EACH_ENTRY_SAFE( source, source2, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) + { + if (source->device == desc->hDevice) + { + list_remove( &source->entry ); + free( source ); + } + } + + pthread_mutex_unlock( &d3dkmt_lock ); + return STATUS_SUCCESS; + } + + /* Add owner */ + for (i = 0; i < desc->VidPnSourceCount; ++i) + { + found = FALSE; + LIST_FOR_EACH_ENTRY( source, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) + { + if (source->device == desc->hDevice && source->id == desc->pVidPnSourceId[i]) + { + found = TRUE; + break; + } + } + + if (found) source->type = desc->pType[i]; + else + { + source = malloc( sizeof(*source) ); + if (!source) + { + pthread_mutex_unlock( &d3dkmt_lock ); + return STATUS_NO_MEMORY; + } + + source->id = desc->pVidPnSourceId[i]; + source->type = desc->pType[i]; + source->device = desc->hDevice; + list_add_tail( &d3dkmt_vidpn_sources, &source->entry ); + } + } + + pthread_mutex_unlock( &d3dkmt_lock ); + return STATUS_SUCCESS; }
/****************************************************************************** @@ -294,12 +400,23 @@ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER */ NTSTATUS WINAPI NtGdiDdDDICheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) { - TRACE( "(%p)\n", desc ); + struct d3dkmt_vidpn_source *source;
- if (!get_display_driver()->pD3DKMTCheckVidPnExclusiveOwnership) - return STATUS_PROCEDURE_NOT_FOUND; + TRACE( "(%p)\n", desc );
if (!desc || !desc->hAdapter) return STATUS_INVALID_PARAMETER;
- return get_display_driver()->pD3DKMTCheckVidPnExclusiveOwnership( desc ); + pthread_mutex_lock( &d3dkmt_lock ); + + LIST_FOR_EACH_ENTRY( source, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) + { + if (source->id == desc->VidPnSourceId && source->type == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE) + { + pthread_mutex_unlock( &d3dkmt_lock ); + return STATUS_GRAPHICS_PRESENT_OCCLUDED; + } + } + + pthread_mutex_unlock( &d3dkmt_lock ); + return STATUS_SUCCESS; } diff --git a/dlls/win32u/dibdrv/dc.c b/dlls/win32u/dibdrv/dc.c index 7fe4b765a78..4ec5f0a7358 100644 --- a/dlls/win32u/dibdrv/dc.c +++ b/dlls/win32u/dibdrv/dc.c @@ -707,11 +707,9 @@ const struct gdi_dc_funcs dib_driver = dibdrv_StrokeAndFillPath, /* pStrokeAndFillPath */ dibdrv_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTCloseAdapter */ NULL, /* pD3DKMTOpenAdapterFromLuid */ NULL, /* pD3DKMTQueryVideoMemoryInfo */ - NULL, /* pD3DKMTSetVidPnSourceOwner */ GDI_PRIORITY_DIB_DRV /* priority */ };
@@ -1268,10 +1266,8 @@ static const struct gdi_dc_funcs window_driver = NULL, /* pStrokeAndFillPath */ NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTCloseAdapter */ NULL, /* pD3DKMTOpenAdapterFromLuid */ NULL, /* pD3DKMTQueryVideoMemoryInfo */ - NULL, /* pD3DKMTSetVidPnSourceOwner */ GDI_PRIORITY_DIB_DRV + 10 /* priority */ }; diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index cf1b7764145..bd513ee20b7 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -522,11 +522,6 @@ static BOOL nulldrv_UnrealizePalette( HPALETTE palette ) return FALSE; }
-static NTSTATUS nulldrv_D3DKMTCheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) -{ - return STATUS_PROCEDURE_NOT_FOUND; -} - static NTSTATUS nulldrv_D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) { return STATUS_PROCEDURE_NOT_FOUND; @@ -542,11 +537,6 @@ static NTSTATUS nulldrv_D3DKMTQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO return STATUS_PROCEDURE_NOT_FOUND; }
-static NTSTATUS nulldrv_D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) -{ - return STATUS_PROCEDURE_NOT_FOUND; -} - const struct gdi_dc_funcs null_driver = { nulldrv_AbortDoc, /* pAbortDoc */ @@ -638,11 +628,9 @@ const struct gdi_dc_funcs null_driver = nulldrv_StrokeAndFillPath, /* pStrokeAndFillPath */ nulldrv_StrokePath, /* pStrokePath */ nulldrv_UnrealizePalette, /* pUnrealizePalette */ - nulldrv_D3DKMTCheckVidPnExclusiveOwnership, /* pD3DKMTCheckVidPnExclusiveOwnership */ nulldrv_D3DKMTCloseAdapter, /* pD3DKMTCloseAdapter */ nulldrv_D3DKMTOpenAdapterFromLuid, /* pD3DKMTOpenAdapterFromLuid */ nulldrv_D3DKMTQueryVideoMemoryInfo, /* pD3DKMTQueryVideoMemoryInfo */ - nulldrv_D3DKMTSetVidPnSourceOwner, /* pD3DKMTSetVidPnSourceOwner */
GDI_PRIORITY_NULL_DRV /* priority */ }; diff --git a/dlls/win32u/emfdrv.c b/dlls/win32u/emfdrv.c index 069ad9d1297..30c5e837924 100644 --- a/dlls/win32u/emfdrv.c +++ b/dlls/win32u/emfdrv.c @@ -519,11 +519,9 @@ static const struct gdi_dc_funcs emfdrv_driver = EMFDRV_StrokeAndFillPath, /* pStrokeAndFillPath */ EMFDRV_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTCloseAdapter */ NULL, /* pD3DKMTOpenAdapterFromLuid */ NULL, /* pD3DKMTQueryVideoMemoryInfo */ - NULL, /* pD3DKMTSetVidPnSourceOwner */ GDI_PRIORITY_GRAPHICS_DRV /* priority */ };
diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c index 9ee89f1b5c4..07f895dd5fe 100644 --- a/dlls/win32u/font.c +++ b/dlls/win32u/font.c @@ -4772,11 +4772,9 @@ const struct gdi_dc_funcs font_driver = NULL, /* pStrokeAndFillPath */ NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTCloseAdapter */ NULL, /* pD3DKMTOpenAdapterFromLuid */ NULL, /* pD3DKMTQueryVideoMemoryInfo */ - NULL, /* pD3DKMTSetVidPnSourceOwner */ GDI_PRIORITY_FONT_DRV /* priority */ };
diff --git a/dlls/win32u/path.c b/dlls/win32u/path.c index e0c96f5ef6f..9589389a4ca 100644 --- a/dlls/win32u/path.c +++ b/dlls/win32u/path.c @@ -2118,10 +2118,8 @@ const struct gdi_dc_funcs path_driver = NULL, /* pStrokeAndFillPath */ NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTCloseAdapter */ NULL, /* pD3DKMTOpenAdapterFromLuid */ NULL, /* pD3DKMTQueryVideoMemoryInfo */ - NULL, /* pD3DKMTSetVidPnSourceOwner */ GDI_PRIORITY_PATH_DRV /* priority */ }; diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 43fb0ac0c1c..1a5cd1cfb25 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -384,11 +384,9 @@ static const struct user_driver_funcs x11drv_funcs = .dc_funcs.pStrokeAndFillPath = X11DRV_StrokeAndFillPath, .dc_funcs.pStrokePath = X11DRV_StrokePath, .dc_funcs.pUnrealizePalette = X11DRV_UnrealizePalette, - .dc_funcs.pD3DKMTCheckVidPnExclusiveOwnership = X11DRV_D3DKMTCheckVidPnExclusiveOwnership, .dc_funcs.pD3DKMTCloseAdapter = X11DRV_D3DKMTCloseAdapter, .dc_funcs.pD3DKMTOpenAdapterFromLuid = X11DRV_D3DKMTOpenAdapterFromLuid, .dc_funcs.pD3DKMTQueryVideoMemoryInfo = X11DRV_D3DKMTQueryVideoMemoryInfo, - .dc_funcs.pD3DKMTSetVidPnSourceOwner = X11DRV_D3DKMTSetVidPnSourceOwner, .dc_funcs.priority = GDI_PRIORITY_GRAPHICS_DRV,
.pActivateKeyboardLayout = X11DRV_ActivateKeyboardLayout, diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 9c1b8012466..3091e5ac0b7 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -158,11 +158,9 @@ extern BOOL X11DRV_Arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ); extern BOOL X11DRV_Chord( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ); -extern NTSTATUS X11DRV_D3DKMTCheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ); extern NTSTATUS X11DRV_D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc ); extern NTSTATUS X11DRV_D3DKMTOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc ); extern NTSTATUS X11DRV_D3DKMTQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *desc ); -extern NTSTATUS X11DRV_D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ); extern BOOL X11DRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom ); extern BOOL X11DRV_ExtFloodFill( PHYSDEV dev, INT x, INT y, COLORREF color, UINT fillType ); extern BOOL X11DRV_FillPath( PHYSDEV dev ); diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 0925fe54b9c..bbb0386bd69 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -107,17 +107,8 @@ struct x11_d3dkmt_adapter struct list entry; /* List entry */ };
-struct d3dkmt_vidpn_source -{ - D3DKMT_VIDPNSOURCEOWNER_TYPE type; /* VidPN source owner type */ - D3DDDI_VIDEO_PRESENT_SOURCE_ID id; /* VidPN present source id */ - D3DKMT_HANDLE device; /* Kernel mode device context */ - struct list entry; /* List entry */ -}; - static VkInstance d3dkmt_vk_instance; /* Vulkan instance for D3DKMT functions */ static struct list x11_d3dkmt_adapters = LIST_INIT( x11_d3dkmt_adapters ); -static struct list d3dkmt_vidpn_sources = LIST_INIT( d3dkmt_vidpn_sources ); /* VidPN source information list */
#define IS_OPTION_TRUE(ch) \ ((ch) == 'y' || (ch) == 'Y' || (ch) == 't' || (ch) == 'T' || (ch) == '1') @@ -854,146 +845,6 @@ NTSTATUS X11DRV_D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) return STATUS_SUCCESS; }
-/********************************************************************** - * X11DRV_D3DKMTSetVidPnSourceOwner - */ -NTSTATUS X11DRV_D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) -{ - struct d3dkmt_vidpn_source *source, *source2; - NTSTATUS status = STATUS_SUCCESS; - BOOL found; - UINT i; - - TRACE("(%p)\n", desc); - - pthread_mutex_lock( &d3dkmt_mutex ); - - /* Check parameters */ - for (i = 0; i < desc->VidPnSourceCount; ++i) - { - LIST_FOR_EACH_ENTRY( source, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) - { - if (source->id == desc->pVidPnSourceId[i]) - { - /* Same device */ - if (source->device == desc->hDevice) - { - if ((source->type == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE - && (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_SHARED - || desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EMULATED)) - || (source->type == D3DKMT_VIDPNSOURCEOWNER_EMULATED - && desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE)) - { - status = STATUS_INVALID_PARAMETER; - goto done; - } - } - /* Different devices */ - else - { - if ((source->type == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE - || source->type == D3DKMT_VIDPNSOURCEOWNER_EMULATED) - && (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE - || desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EMULATED)) - { - status = STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE; - goto done; - } - } - } - } - - /* On Windows, it seems that all video present sources are owned by DMM clients, so any attempt to set - * D3DKMT_VIDPNSOURCEOWNER_SHARED come back STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE */ - if (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_SHARED) - { - status = STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE; - goto done; - } - - /* FIXME: D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI unsupported */ - if (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI || desc->pType[i] > D3DKMT_VIDPNSOURCEOWNER_EMULATED) - { - status = STATUS_INVALID_PARAMETER; - goto done; - } - } - - /* Remove owner */ - if (!desc->VidPnSourceCount && !desc->pType && !desc->pVidPnSourceId) - { - LIST_FOR_EACH_ENTRY_SAFE( source, source2, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) - { - if (source->device == desc->hDevice) - { - list_remove( &source->entry ); - free( source ); - } - } - goto done; - } - - /* Add owner */ - for (i = 0; i < desc->VidPnSourceCount; ++i) - { - found = FALSE; - LIST_FOR_EACH_ENTRY( source, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) - { - if (source->device == desc->hDevice && source->id == desc->pVidPnSourceId[i]) - { - found = TRUE; - break; - } - } - - if (found) - source->type = desc->pType[i]; - else - { - source = malloc( sizeof( *source ) ); - if (!source) - { - status = STATUS_NO_MEMORY; - goto done; - } - - source->id = desc->pVidPnSourceId[i]; - source->type = desc->pType[i]; - source->device = desc->hDevice; - list_add_tail( &d3dkmt_vidpn_sources, &source->entry ); - } - } - -done: - pthread_mutex_unlock( &d3dkmt_mutex ); - return status; -} - -/********************************************************************** - * X11DRV_D3DKMTCheckVidPnExclusiveOwnership - */ -NTSTATUS X11DRV_D3DKMTCheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) -{ - struct d3dkmt_vidpn_source *source; - - TRACE("(%p)\n", desc); - - if (!desc || !desc->hAdapter) - return STATUS_INVALID_PARAMETER; - - pthread_mutex_lock( &d3dkmt_mutex ); - LIST_FOR_EACH_ENTRY( source, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) - { - if (source->id == desc->VidPnSourceId && source->type == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE) - { - pthread_mutex_unlock( &d3dkmt_mutex ); - return STATUS_GRAPHICS_PRESENT_OCCLUDED; - } - } - pthread_mutex_unlock( &d3dkmt_mutex ); - return STATUS_SUCCESS; -} - static HANDLE get_display_device_init_mutex(void) { WCHAR bufferW[256]; diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index 74723915fc5..c8ce9326d17 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -2234,11 +2234,9 @@ static const struct gdi_dc_funcs xrender_funcs = NULL, /* pStrokeAndFillPath */ NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTCloseAdapter */ NULL, /* pD3DKMTOpenAdapterFromLuid */ NULL, /* pD3DKMTQueryVideoMemoryInfo */ - NULL, /* pD3DKMTSetVidPnSourceOwner */ GDI_PRIORITY_GRAPHICS_DRV + 10 /* priority */ };
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index 4acf23df1d4..ffe84787d51 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -166,18 +166,16 @@ struct gdi_dc_funcs BOOL (*pStrokeAndFillPath)(PHYSDEV); BOOL (*pStrokePath)(PHYSDEV); BOOL (*pUnrealizePalette)(HPALETTE); - NTSTATUS (*pD3DKMTCheckVidPnExclusiveOwnership)(const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *); NTSTATUS (*pD3DKMTCloseAdapter)(const D3DKMT_CLOSEADAPTER *); NTSTATUS (*pD3DKMTOpenAdapterFromLuid)(D3DKMT_OPENADAPTERFROMLUID *); NTSTATUS (*pD3DKMTQueryVideoMemoryInfo)(D3DKMT_QUERYVIDEOMEMORYINFO *); - NTSTATUS (*pD3DKMTSetVidPnSourceOwner)(const D3DKMT_SETVIDPNSOURCEOWNER *);
/* priority order for the driver on the stack */ UINT priority; };
/* increment this when you change the DC function table */ -#define WINE_GDI_DRIVER_VERSION 83 +#define WINE_GDI_DRIVER_VERSION 84
#define GDI_PRIORITY_NULL_DRV 0 /* null driver */ #define GDI_PRIORITY_FONT_DRV 100 /* any font driver */
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index a31d586a5b6..173df2ee73b 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -227,6 +227,7 @@ struct display_device
struct gpu { + LONG refcount; struct list entry; LUID luid; unsigned int adapter_count; @@ -239,6 +240,7 @@ struct adapter struct display_device dev; LUID gpu_luid; unsigned int id; + struct gpu *gpu; const WCHAR *config_key; unsigned int mode_count; DEVMODEW *modes; @@ -465,6 +467,18 @@ static void release_display_device_init_mutex( HANDLE mutex ) NtClose( mutex ); }
+static struct gpu *gpu_acquire( struct gpu *gpu ) +{ + InterlockedIncrement( &gpu->refcount ); + return gpu; +} + +static void gpu_release( struct gpu *gpu ) +{ + if (!InterlockedDecrement( &gpu->refcount )) + free( gpu ); +} + static struct adapter *adapter_acquire( struct adapter *adapter ) { InterlockedIncrement( &adapter->refcount ); @@ -475,6 +489,7 @@ static void adapter_release( struct adapter *adapter ) { if (!InterlockedDecrement( &adapter->refcount )) { + gpu_release( adapter->gpu ); free( adapter->modes ); free( adapter ); } @@ -1680,7 +1695,7 @@ static void clear_display_devices(void) { gpu = LIST_ENTRY( list_head( &gpus ), struct gpu, entry ); list_remove( &gpu->entry ); - free( gpu ); + gpu_release( gpu ); } }
@@ -1725,7 +1740,8 @@ static BOOL update_display_cache_from_registry(void)
if (!read_display_adapter_settings( adapter_id, adapter )) { - adapter_release( adapter ); + free( adapter->modes ); + free( adapter ); break; }
@@ -1792,6 +1808,7 @@ static BOOL update_display_cache_from_registry(void) NtClose( gpu_key ); continue; } + gpu->refcount = 1;
if ((prop_key = reg_open_key( gpu_key, devpropkey_gpu_luidW, sizeof(devpropkey_gpu_luidW) ))) @@ -1804,7 +1821,10 @@ static BOOL update_display_cache_from_registry(void) LIST_FOR_EACH_ENTRY(adapter, &adapters, struct adapter, entry) { if (!memcmp( &adapter->gpu_luid, &gpu->luid, sizeof(LUID) )) + { + adapter->gpu = gpu_acquire( gpu ); gpu->adapter_count++; + } }
list_add_tail( &gpus, &gpu->entry );
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 84 ++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 44 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 173df2ee73b..dd6e6a89c87 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -6659,79 +6659,75 @@ NTSTATUS WINAPI NtUserDisplayConfigGetDeviceInfo( DISPLAYCONFIG_DEVICE_INFO_HEAD NTSTATUS WINAPI NtGdiDdDDIEnumAdapters2( D3DKMT_ENUMADAPTERS2 *desc ) { D3DKMT_OPENADAPTERFROMLUID open_adapter_from_luid; - static const ULONG max_adapters = 34; + struct gpu *gpu, *current_gpus[34]; D3DKMT_CLOSEADAPTER close_adapter; NTSTATUS status = STATUS_SUCCESS; - ULONG idx = 0, count; - struct gpu *gpu; + UINT idx = 0, count = 0;
TRACE( "(%p)\n", desc );
if (!desc) return STATUS_INVALID_PARAMETER;
- if (!desc->pAdapters) + if (!lock_display_devices()) return STATUS_UNSUCCESSFUL; + LIST_FOR_EACH_ENTRY( gpu, &gpus, struct gpu, entry ) { - desc->NumAdapters = max_adapters; - return STATUS_SUCCESS; + if (desc->pAdapters) current_gpus[count] = gpu_acquire( gpu ); + if (count++ >= ARRAY_SIZE(current_gpus)) + { + WARN( "Too many adapters (%u), only up to %zu can be enumerated.\n", + count, ARRAY_SIZE(current_gpus) ); + break; + } } + unlock_display_devices();
- if (!lock_display_devices()) return STATUS_UNSUCCESSFUL; - - if ((count = list_count( &gpus )) > max_adapters) + if (!desc->pAdapters) { - WARN( "Too many adapters (%u), only up to %u can be enumerated.\n", - (unsigned int)count, (unsigned int)max_adapters ); - count = max_adapters; + desc->NumAdapters = ARRAY_SIZE(current_gpus); + return STATUS_SUCCESS; }
if (count > desc->NumAdapters) { - status = STATUS_BUFFER_TOO_SMALL; - goto done; + while (count) gpu_release( current_gpus[--count] ); + return STATUS_BUFFER_TOO_SMALL; }
- LIST_FOR_EACH_ENTRY( gpu, &gpus, struct gpu, entry ) + for (idx = 0; idx < count; idx++) { - if (gpu->luid.LowPart || gpu->luid.HighPart) + if (!gpu->luid.LowPart && !gpu->luid.HighPart) { - open_adapter_from_luid.AdapterLuid = gpu->luid; - - /* give the GDI driver a chance to be notified about new adapter handle */ - if (NT_SUCCESS( NtGdiDdDDIOpenAdapterFromLuid( &open_adapter_from_luid ) )) - { - 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].bPrecisePresentRegionsPreferred = FALSE; - idx += 1; - continue; - } - else - { - ERR( "Failed to open adapter %u from LUID.\n", (unsigned int)idx ); - } + ERR( "Adapter %u does not have a LUID.\n", idx ); + status = STATUS_UNSUCCESSFUL; + break; } - else + open_adapter_from_luid.AdapterLuid = gpu->luid; + + /* give the GDI driver a chance to be notified about new adapter handle */ + if ((status = NtGdiDdDDIOpenAdapterFromLuid( &open_adapter_from_luid ))) { - ERR( "Adapter %u does not have a LUID.\n", (unsigned int)idx ); + ERR( "Failed to open adapter %u from LUID, status %#x.\n", idx, (UINT)status ); + break; }
- while (idx--) + 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].bPrecisePresentRegionsPreferred = FALSE; + } + + if (idx != count) + { + while (idx) { - close_adapter.hAdapter = desc->pAdapters[idx].hAdapter; + close_adapter.hAdapter = desc->pAdapters[--idx].hAdapter; NtGdiDdDDICloseAdapter( &close_adapter ); }
memset( desc->pAdapters, 0, desc->NumAdapters * sizeof(D3DKMT_ADAPTERINFO) ); - status = STATUS_UNSUCCESSFUL; - break; } + desc->NumAdapters = idx;
-done: - if (status == STATUS_SUCCESS) - desc->NumAdapters = idx; - - unlock_display_devices(); - + while (count) gpu_release( current_gpus[--count] ); return status; }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/d3dkmt.c | 178 ++++++++++++++++- dlls/win32u/dibdrv/dc.c | 6 - dlls/win32u/driver.c | 18 -- dlls/win32u/emfdrv.c | 3 - dlls/win32u/font.c | 3 - dlls/win32u/path.c | 3 - dlls/win32u/sysparams.c | 34 +++- dlls/win32u/win32u_private.h | 1 + dlls/winex11.drv/init.c | 3 - dlls/winex11.drv/x11drv.h | 3 - dlls/winex11.drv/x11drv_main.c | 342 --------------------------------- dlls/winex11.drv/xrender.c | 3 - include/wine/gdi_driver.h | 5 +- 13 files changed, 202 insertions(+), 400 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index f4d695ac0cb..6bf4fc926e1 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -58,6 +58,7 @@ static pthread_mutex_t d3dkmt_lock = PTHREAD_MUTEX_INITIALIZER; static struct list d3dkmt_adapters = LIST_INIT( d3dkmt_adapters ); static struct list d3dkmt_devices = LIST_INIT( d3dkmt_devices ); static struct list d3dkmt_vidpn_sources = LIST_INIT( d3dkmt_vidpn_sources ); /* VidPN source information list */ +static VkInstance d3dkmt_vk_instance; /* Vulkan instance for D3DKMT functions */
/****************************************************************************** * NtGdiDdDDIOpenAdapterFromHdc (win32u.@) @@ -83,16 +84,15 @@ NTSTATUS WINAPI NtGdiDdDDIEscape( const D3DKMT_ESCAPE *desc ) NTSTATUS WINAPI NtGdiDdDDICloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) { NTSTATUS status = STATUS_INVALID_PARAMETER; + const struct vulkan_funcs *vulkan_funcs; struct d3dkmt_adapter *adapter;
TRACE( "(%p)\n", desc );
if (!desc || !desc->hAdapter) return STATUS_INVALID_PARAMETER;
- if (get_display_driver()->pD3DKMTCloseAdapter) - get_display_driver()->pD3DKMTCloseAdapter( desc ); - pthread_mutex_lock( &d3dkmt_lock ); + LIST_FOR_EACH_ENTRY( adapter, &d3dkmt_adapters, struct d3dkmt_adapter, entry ) { if (adapter->handle == desc->hAdapter) @@ -103,8 +103,14 @@ NTSTATUS WINAPI NtGdiDdDDICloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) break; } } - pthread_mutex_unlock( &d3dkmt_lock );
+ if (list_empty( &d3dkmt_adapters ) && (vulkan_funcs = __wine_get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ))) + { + vulkan_funcs->p_vkDestroyInstance( d3dkmt_vk_instance, NULL ); + d3dkmt_vk_instance = NULL; + } + + pthread_mutex_unlock( &d3dkmt_lock ); return status; }
@@ -133,19 +139,120 @@ NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromDeviceName( D3DKMT_OPENADAPTERFROMDEVIC */ NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc ) { + const struct vulkan_funcs *vulkan_funcs; static D3DKMT_HANDLE handle_start = 0; struct d3dkmt_adapter *adapter;
- if (!(adapter = malloc( sizeof(*adapter) ))) return STATUS_NO_MEMORY; + /* Find the Vulkan device with corresponding UUID */ + if ((vulkan_funcs = __wine_get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ))) + { + static const char *extensions[] = + { + VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, + VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, + }; + PFN_vkGetPhysicalDeviceProperties2KHR pvkGetPhysicalDeviceProperties2KHR; + PFN_vkEnumeratePhysicalDevices pvkEnumeratePhysicalDevices; + VkPhysicalDevice *vk_physical_devices = NULL; + VkPhysicalDeviceProperties2 properties2; + NTSTATUS status = STATUS_UNSUCCESSFUL; + UINT device_count, device_idx = 0; + VkInstanceCreateInfo create_info; + VkPhysicalDeviceIDProperties id; + GUID uuid = {0}; + VkResult vr; + + if (!get_vulkan_uuid_from_luid( &desc->AdapterLuid, &uuid )) + WARN( "Failed to find Vulkan device with LUID %08x:%08x.\n", + (int)desc->AdapterLuid.HighPart, (int)desc->AdapterLuid.LowPart ); + + pthread_mutex_lock( &d3dkmt_lock ); + + if (!d3dkmt_vk_instance) + { + memset( &create_info, 0, sizeof(create_info) ); + create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + create_info.enabledExtensionCount = ARRAY_SIZE( extensions ); + create_info.ppEnabledExtensionNames = extensions; + + vr = vulkan_funcs->p_vkCreateInstance( &create_info, NULL, &d3dkmt_vk_instance ); + if (vr != VK_SUCCESS) + { + WARN( "Failed to create a Vulkan instance, vr %d.\n", vr ); + goto done; + } + } + +#define LOAD_VK_FUNC( f ) \ + if (!(p##f = (void *)vulkan_funcs->p_vkGetInstanceProcAddr( d3dkmt_vk_instance, #f ))) \ + { \ + WARN( "Failed to load " #f ".\n" ); \ + goto done; \ + } + + LOAD_VK_FUNC( vkEnumeratePhysicalDevices ) + LOAD_VK_FUNC( vkGetPhysicalDeviceProperties2KHR ) +#undef LOAD_VK_FUNC + + vr = pvkEnumeratePhysicalDevices( d3dkmt_vk_instance, &device_count, NULL ); + if (vr != VK_SUCCESS || !device_count) + { + WARN( "No Vulkan device found, vr %d, device_count %d.\n", vr, device_count ); + goto done; + } + + if (!(vk_physical_devices = calloc( device_count, sizeof(*vk_physical_devices) ))) + goto done; + + vr = pvkEnumeratePhysicalDevices( d3dkmt_vk_instance, &device_count, vk_physical_devices ); + if (vr != VK_SUCCESS) + { + WARN( "vkEnumeratePhysicalDevices failed, vr %d.\n", vr ); + goto done; + } + + for (device_idx = 0; device_idx < device_count; ++device_idx) + { + memset( &id, 0, sizeof(id) ); + id.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES; + properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; + properties2.pNext = &id; + + pvkGetPhysicalDeviceProperties2KHR( vk_physical_devices[device_idx], &properties2 ); + if (!IsEqualGUID( &uuid, id.deviceUUID )) continue;
+ if (!(adapter = malloc( sizeof(*adapter) ))) + { + status = STATUS_NO_MEMORY; + goto done; + } + + adapter->handle = desc->hAdapter; + adapter->vk_device = vk_physical_devices[device_idx]; + list_add_head( &d3dkmt_adapters, &adapter->entry ); + status = STATUS_SUCCESS; + break; + } + + done: + if (d3dkmt_vk_instance && list_empty( &d3dkmt_adapters )) + { + vulkan_funcs->p_vkDestroyInstance( d3dkmt_vk_instance, NULL ); + d3dkmt_vk_instance = NULL; + } + pthread_mutex_unlock( &d3dkmt_lock ); + free( vk_physical_devices ); + + if (!status) return status; + FIXME( "vulkan failed with status %#x, using fallback\n", (UINT)status ); + } + + if (!(adapter = malloc( sizeof(*adapter) ))) return STATUS_NO_MEMORY; pthread_mutex_lock( &d3dkmt_lock ); desc->hAdapter = adapter->handle = ++handle_start; list_add_tail( &d3dkmt_adapters, &adapter->entry ); pthread_mutex_unlock( &d3dkmt_lock );
- if (get_display_driver()->pD3DKMTOpenAdapterFromLuid) - get_display_driver()->pD3DKMTOpenAdapterFromLuid( desc ); - return STATUS_SUCCESS; }
@@ -248,6 +355,7 @@ NTSTATUS WINAPI NtGdiDdDDIQueryStatistics( D3DKMT_QUERYSTATISTICS *stats ) */ NTSTATUS WINAPI NtGdiDdDDIQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *desc ) { + const struct vulkan_funcs *vulkan_funcs; OBJECT_BASIC_INFORMATION info; NTSTATUS status;
@@ -266,8 +374,58 @@ NTSTATUS WINAPI NtGdiDdDDIQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *des if (status != STATUS_SUCCESS) return status; if (!(info.GrantedAccess & PROCESS_QUERY_INFORMATION)) return STATUS_ACCESS_DENIED;
- if (!get_display_driver()->pD3DKMTQueryVideoMemoryInfo) return STATUS_PROCEDURE_NOT_FOUND; - return get_display_driver()->pD3DKMTQueryVideoMemoryInfo( desc ); + if ((vulkan_funcs = __wine_get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ))) + { + PFN_vkGetPhysicalDeviceMemoryProperties2KHR pvkGetPhysicalDeviceMemoryProperties2KHR; + VkPhysicalDeviceMemoryBudgetPropertiesEXT budget; + VkPhysicalDeviceMemoryProperties2 properties2; + struct d3dkmt_adapter *adapter; + unsigned int i; + + desc->Budget = 0; + desc->CurrentUsage = 0; + desc->CurrentReservation = 0; + desc->AvailableForReservation = 0; + + pthread_mutex_lock( &d3dkmt_lock ); + + LIST_FOR_EACH_ENTRY( adapter, &d3dkmt_adapters, struct d3dkmt_adapter, entry ) + { + if (adapter->handle != desc->hAdapter) continue; + + if (!(pvkGetPhysicalDeviceMemoryProperties2KHR = (void *)vulkan_funcs->p_vkGetInstanceProcAddr( d3dkmt_vk_instance, "vkGetPhysicalDeviceMemoryProperties2KHR" ))) + WARN( "Failed to load vkGetPhysicalDeviceMemoryProperties2KHR.\n" ); + else + { + memset( &budget, 0, sizeof(budget) ); + budget.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT; + properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2; + properties2.pNext = &budget; + pvkGetPhysicalDeviceMemoryProperties2KHR( adapter->vk_device, &properties2 ); + for (i = 0; i < properties2.memoryProperties.memoryHeapCount; ++i) + { + if ((desc->MemorySegmentGroup == D3DKMT_MEMORY_SEGMENT_GROUP_LOCAL && + properties2.memoryProperties.memoryHeaps[i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) || + (desc->MemorySegmentGroup == D3DKMT_MEMORY_SEGMENT_GROUP_NON_LOCAL && + !(properties2.memoryProperties.memoryHeaps[i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT))) + { + desc->Budget += budget.heapBudget[i]; + desc->CurrentUsage += budget.heapUsage[i]; + } + } + desc->AvailableForReservation = desc->Budget / 2; + } + + pthread_mutex_unlock( &d3dkmt_lock ); + return STATUS_SUCCESS; + } + + pthread_mutex_unlock( &d3dkmt_lock ); + return STATUS_INVALID_PARAMETER; + } + + WARN( "Vulkan is unavailable.\n" ); + return STATUS_PROCEDURE_NOT_FOUND; }
/****************************************************************************** diff --git a/dlls/win32u/dibdrv/dc.c b/dlls/win32u/dibdrv/dc.c index 4ec5f0a7358..637b92f5256 100644 --- a/dlls/win32u/dibdrv/dc.c +++ b/dlls/win32u/dibdrv/dc.c @@ -707,9 +707,6 @@ const struct gdi_dc_funcs dib_driver = dibdrv_StrokeAndFillPath, /* pStrokeAndFillPath */ dibdrv_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCloseAdapter */ - NULL, /* pD3DKMTOpenAdapterFromLuid */ - NULL, /* pD3DKMTQueryVideoMemoryInfo */ GDI_PRIORITY_DIB_DRV /* priority */ };
@@ -1266,8 +1263,5 @@ static const struct gdi_dc_funcs window_driver = NULL, /* pStrokeAndFillPath */ NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCloseAdapter */ - NULL, /* pD3DKMTOpenAdapterFromLuid */ - NULL, /* pD3DKMTQueryVideoMemoryInfo */ GDI_PRIORITY_DIB_DRV + 10 /* priority */ }; diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index bd513ee20b7..875974bebdf 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -522,21 +522,6 @@ static BOOL nulldrv_UnrealizePalette( HPALETTE palette ) return FALSE; }
-static NTSTATUS nulldrv_D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) -{ - return STATUS_PROCEDURE_NOT_FOUND; -} - -static NTSTATUS nulldrv_D3DKMTOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc ) -{ - return STATUS_PROCEDURE_NOT_FOUND; -} - -static NTSTATUS nulldrv_D3DKMTQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *desc ) -{ - return STATUS_PROCEDURE_NOT_FOUND; -} - const struct gdi_dc_funcs null_driver = { nulldrv_AbortDoc, /* pAbortDoc */ @@ -628,9 +613,6 @@ const struct gdi_dc_funcs null_driver = nulldrv_StrokeAndFillPath, /* pStrokeAndFillPath */ nulldrv_StrokePath, /* pStrokePath */ nulldrv_UnrealizePalette, /* pUnrealizePalette */ - nulldrv_D3DKMTCloseAdapter, /* pD3DKMTCloseAdapter */ - nulldrv_D3DKMTOpenAdapterFromLuid, /* pD3DKMTOpenAdapterFromLuid */ - nulldrv_D3DKMTQueryVideoMemoryInfo, /* pD3DKMTQueryVideoMemoryInfo */
GDI_PRIORITY_NULL_DRV /* priority */ }; diff --git a/dlls/win32u/emfdrv.c b/dlls/win32u/emfdrv.c index 30c5e837924..34dd997040d 100644 --- a/dlls/win32u/emfdrv.c +++ b/dlls/win32u/emfdrv.c @@ -519,9 +519,6 @@ static const struct gdi_dc_funcs emfdrv_driver = EMFDRV_StrokeAndFillPath, /* pStrokeAndFillPath */ EMFDRV_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCloseAdapter */ - NULL, /* pD3DKMTOpenAdapterFromLuid */ - NULL, /* pD3DKMTQueryVideoMemoryInfo */ GDI_PRIORITY_GRAPHICS_DRV /* priority */ };
diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c index 07f895dd5fe..42eec2925dc 100644 --- a/dlls/win32u/font.c +++ b/dlls/win32u/font.c @@ -4772,9 +4772,6 @@ const struct gdi_dc_funcs font_driver = NULL, /* pStrokeAndFillPath */ NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCloseAdapter */ - NULL, /* pD3DKMTOpenAdapterFromLuid */ - NULL, /* pD3DKMTQueryVideoMemoryInfo */ GDI_PRIORITY_FONT_DRV /* priority */ };
diff --git a/dlls/win32u/path.c b/dlls/win32u/path.c index 9589389a4ca..770214abdd9 100644 --- a/dlls/win32u/path.c +++ b/dlls/win32u/path.c @@ -2118,8 +2118,5 @@ const struct gdi_dc_funcs path_driver = NULL, /* pStrokeAndFillPath */ NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCloseAdapter */ - NULL, /* pD3DKMTOpenAdapterFromLuid */ - NULL, /* pD3DKMTQueryVideoMemoryInfo */ GDI_PRIORITY_PATH_DRV /* priority */ }; diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index dd6e6a89c87..76e2a743ade 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -230,6 +230,7 @@ struct gpu LONG refcount; struct list entry; LUID luid; + GUID vulkan_uuid; unsigned int adapter_count; };
@@ -442,7 +443,7 @@ void user_check_not_lock(void) } }
-static HANDLE get_display_device_init_mutex( void ) +HANDLE get_display_device_init_mutex( void ) { WCHAR bufferW[256]; UNICODE_STRING name = {.Buffer = bufferW}; @@ -461,7 +462,7 @@ static HANDLE get_display_device_init_mutex( void ) return mutex; }
-static void release_display_device_init_mutex( HANDLE mutex ) +void release_display_device_init_mutex( HANDLE mutex ) { NtReleaseMutant( mutex, NULL ); NtClose( mutex ); @@ -1818,6 +1819,14 @@ static BOOL update_display_cache_from_registry(void) NtClose( prop_key ); }
+ if ((prop_key = reg_open_key( gpu_key, devpropkey_gpu_vulkan_uuidW, + sizeof(devpropkey_gpu_vulkan_uuidW) ))) + { + if (query_reg_value( prop_key, NULL, value, sizeof(buffer) ) == sizeof(GUID)) + gpu->vulkan_uuid = *(const GUID *)value->Data; + NtClose( prop_key ); + } + LIST_FOR_EACH_ENTRY(adapter, &adapters, struct adapter, entry) { if (!memcmp( &adapter->gpu_luid, &gpu->luid, sizeof(LUID) )) @@ -6731,3 +6740,24 @@ NTSTATUS WINAPI NtGdiDdDDIEnumAdapters2( D3DKMT_ENUMADAPTERS2 *desc ) while (count) gpu_release( current_gpus[--count] ); return status; } + +/* Find the Vulkan device UUID corresponding to a LUID */ +BOOL get_vulkan_uuid_from_luid( const LUID *luid, GUID *uuid ) +{ + struct gpu *gpu; + BOOL found; + + if (!lock_display_devices()) return FALSE; + + LIST_FOR_EACH_ENTRY( gpu, &gpus, struct gpu, entry ) + { + if ((found = !memcmp( &gpu->luid, luid, sizeof(*luid) ))) + { + *uuid = gpu->vulkan_uuid; + break; + } + } + + unlock_display_devices(); + return found; +} diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index d5f010a8249..25dcaad7418 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -192,6 +192,7 @@ extern BOOL update_display_cache( BOOL force ); extern void user_lock(void); extern void user_unlock(void); extern void user_check_not_lock(void); +extern BOOL get_vulkan_uuid_from_luid( const LUID *luid, GUID *uuid );
/* winstation.c */ extern BOOL is_virtual_desktop(void); diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 1a5cd1cfb25..02ff0200bcb 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -384,9 +384,6 @@ static const struct user_driver_funcs x11drv_funcs = .dc_funcs.pStrokeAndFillPath = X11DRV_StrokeAndFillPath, .dc_funcs.pStrokePath = X11DRV_StrokePath, .dc_funcs.pUnrealizePalette = X11DRV_UnrealizePalette, - .dc_funcs.pD3DKMTCloseAdapter = X11DRV_D3DKMTCloseAdapter, - .dc_funcs.pD3DKMTOpenAdapterFromLuid = X11DRV_D3DKMTOpenAdapterFromLuid, - .dc_funcs.pD3DKMTQueryVideoMemoryInfo = X11DRV_D3DKMTQueryVideoMemoryInfo, .dc_funcs.priority = GDI_PRIORITY_GRAPHICS_DRV,
.pActivateKeyboardLayout = X11DRV_ActivateKeyboardLayout, diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 3091e5ac0b7..82eb932868b 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -158,9 +158,6 @@ extern BOOL X11DRV_Arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ); extern BOOL X11DRV_Chord( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ); -extern NTSTATUS X11DRV_D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc ); -extern NTSTATUS X11DRV_D3DKMTOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc ); -extern NTSTATUS X11DRV_D3DKMTQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *desc ); extern BOOL X11DRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom ); extern BOOL X11DRV_ExtFloodFill( PHYSDEV dev, INT x, INT y, COLORREF color, UINT fillType ); extern BOOL X11DRV_FillPath( PHYSDEV dev ); diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index bbb0386bd69..4c8fd943ffd 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -97,19 +97,8 @@ static int (*old_error_handler)( Display *, XErrorEvent * ); static BOOL use_xim = TRUE; static WCHAR input_style[20];
-static pthread_mutex_t d3dkmt_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t error_mutex = PTHREAD_MUTEX_INITIALIZER;
-struct x11_d3dkmt_adapter -{ - D3DKMT_HANDLE handle; /* Kernel mode graphics adapter handle */ - VkPhysicalDevice vk_device; /* Vulkan physical device */ - struct list entry; /* List entry */ -}; - -static VkInstance d3dkmt_vk_instance; /* Vulkan instance for D3DKMT functions */ -static struct list x11_d3dkmt_adapters = LIST_INIT( x11_d3dkmt_adapters ); - #define IS_OPTION_TRUE(ch) \ ((ch) == 'y' || (ch) == 'Y' || (ch) == 't' || (ch) == 'T' || (ch) == '1') #define IS_OPTION_FALSE(ch) \ @@ -817,337 +806,6 @@ BOOL X11DRV_SystemParametersInfo( UINT action, UINT int_param, void *ptr_param, return FALSE; /* let user32 handle it */ }
-NTSTATUS X11DRV_D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) -{ - const struct vulkan_funcs *vulkan_funcs = get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION); - struct x11_d3dkmt_adapter *adapter; - - if (!vulkan_funcs) - return STATUS_UNSUCCESSFUL; - - pthread_mutex_lock(&d3dkmt_mutex); - LIST_FOR_EACH_ENTRY(adapter, &x11_d3dkmt_adapters, struct x11_d3dkmt_adapter, entry) - { - if (adapter->handle == desc->hAdapter) - { - list_remove(&adapter->entry); - free(adapter); - break; - } - } - - if (list_empty(&x11_d3dkmt_adapters)) - { - vulkan_funcs->p_vkDestroyInstance(d3dkmt_vk_instance, NULL); - d3dkmt_vk_instance = NULL; - } - pthread_mutex_unlock(&d3dkmt_mutex); - return STATUS_SUCCESS; -} - -static HANDLE get_display_device_init_mutex(void) -{ - WCHAR bufferW[256]; - UNICODE_STRING name = {.Buffer = bufferW}; - OBJECT_ATTRIBUTES attr; - char buffer[256]; - HANDLE mutex; - - snprintf( buffer, ARRAY_SIZE(buffer), "\Sessions\%u\BaseNamedObjects\display_device_init", - (int)NtCurrentTeb()->Peb->SessionId ); - name.MaximumLength = asciiz_to_unicode( bufferW, buffer ); - name.Length = name.MaximumLength - sizeof(WCHAR); - - InitializeObjectAttributes( &attr, &name, OBJ_OPENIF, NULL, NULL ); - if (NtCreateMutant( &mutex, MUTEX_ALL_ACCESS, &attr, FALSE ) < 0) return 0; - NtWaitForSingleObject( mutex, FALSE, NULL ); - return mutex; -} - -static void release_display_device_init_mutex(HANDLE mutex) -{ - NtReleaseMutant( mutex, NULL ); - NtClose( mutex ); -} - -/* Find the Vulkan device UUID corresponding to a LUID */ -static BOOL get_vulkan_uuid_from_luid( const LUID *luid, GUID *uuid ) -{ - static const WCHAR class_guidW[] = {'C','l','a','s','s','G','U','I','D',0}; - static const WCHAR devpropkey_gpu_vulkan_uuidW[] = - { - 'P','r','o','p','e','r','t','i','e','s', - '\','{','2','3','3','A','9','E','F','3','-','A','F','C','4','-','4','A','B','D', - '-','B','5','6','4','-','C','3','2','F','2','1','F','1','5','3','5','C','}', - '\','0','0','0','2' - }; - static const WCHAR devpropkey_gpu_luidW[] = - { - 'P','r','o','p','e','r','t','i','e','s', - '\','{','6','0','B','1','9','3','C','B','-','5','2','7','6','-','4','D','0','F', - '-','9','6','F','C','-','F','1','7','3','A','B','A','D','3','E','C','6','}', - '\','0','0','0','2' - }; - static const WCHAR guid_devclass_displayW[] = - {'{','4','D','3','6','E','9','6','8','-','E','3','2','5','-','1','1','C','E','-', - 'B','F','C','1','-','0','8','0','0','2','B','E','1','0','3','1','8','}',0}; - static const WCHAR pci_keyW[] = - { - '\','R','e','g','i','s','t','r','y', - '\','M','a','c','h','i','n','e', - '\','S','y','s','t','e','m', - '\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t', - '\','E','n','u','m', - '\','P','C','I' - }; - char buffer[4096]; - KEY_VALUE_PARTIAL_INFORMATION *value = (void *)buffer; - HKEY subkey, device_key, prop_key, pci_key; - KEY_NODE_INFORMATION *key = (void *)buffer; - DWORD size, i = 0; - HANDLE mutex; - - mutex = get_display_device_init_mutex(); - - pci_key = reg_open_key(NULL, pci_keyW, sizeof(pci_keyW)); - while (!NtEnumerateKey(pci_key, i++, KeyNodeInformation, key, sizeof(buffer), &size)) - { - unsigned int j = 0; - - if (!(subkey = reg_open_key(pci_key, key->Name, key->NameLength))) - continue; - - while (!NtEnumerateKey(subkey, j++, KeyNodeInformation, key, sizeof(buffer), &size)) - { - if (!(device_key = reg_open_key(subkey, key->Name, key->NameLength))) - continue; - - size = query_reg_value(device_key, class_guidW, value, sizeof(buffer)); - if (size != sizeof(guid_devclass_displayW) || - wcscmp((WCHAR *)value->Data, guid_devclass_displayW)) - { - NtClose(device_key); - continue; - } - - if (!(prop_key = reg_open_key(device_key, devpropkey_gpu_luidW, - sizeof(devpropkey_gpu_luidW)))) - { - NtClose(device_key); - continue; - } - - size = query_reg_value(prop_key, NULL, value, sizeof(buffer)); - NtClose(prop_key); - if (size != sizeof(LUID) || memcmp(value->Data, luid, sizeof(LUID))) - { - NtClose(device_key); - continue; - } - - if (!(prop_key = reg_open_key(device_key, devpropkey_gpu_vulkan_uuidW, - sizeof(devpropkey_gpu_vulkan_uuidW)))) - { - NtClose(device_key); - continue; - } - - size = query_reg_value(prop_key, NULL, value, sizeof(buffer)); - NtClose(prop_key); - if (size != sizeof(GUID)) - { - NtClose(device_key); - continue; - } - - *uuid = *(const GUID *)value->Data; - NtClose(device_key); - NtClose(subkey); - NtClose(pci_key); - release_display_device_init_mutex(mutex); - return TRUE; - } - NtClose(subkey); - } - NtClose(pci_key); - - release_display_device_init_mutex(mutex); - return FALSE; -} - -NTSTATUS X11DRV_D3DKMTOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc ) -{ - static const char *extensions[] = - { - VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, - VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, - }; - const struct vulkan_funcs *vulkan_funcs; - PFN_vkGetPhysicalDeviceProperties2KHR pvkGetPhysicalDeviceProperties2KHR; - PFN_vkEnumeratePhysicalDevices pvkEnumeratePhysicalDevices; - VkPhysicalDevice *vk_physical_devices = NULL; - VkPhysicalDeviceProperties2 properties2; - NTSTATUS status = STATUS_UNSUCCESSFUL; - UINT device_count, device_idx = 0; - struct x11_d3dkmt_adapter *adapter; - VkInstanceCreateInfo create_info; - VkPhysicalDeviceIDProperties id; - VkResult vr; - GUID uuid; - - if (!get_vulkan_uuid_from_luid(&desc->AdapterLuid, &uuid)) - { - WARN("Failed to find Vulkan device with LUID %08x:%08x.\n", - (int)desc->AdapterLuid.HighPart, (int)desc->AdapterLuid.LowPart); - return STATUS_INVALID_PARAMETER; - } - - /* Find the Vulkan device with corresponding UUID */ - if (!(vulkan_funcs = get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION))) - { - WARN("Vulkan is unavailable.\n"); - return STATUS_UNSUCCESSFUL; - } - - pthread_mutex_lock(&d3dkmt_mutex); - - if (!d3dkmt_vk_instance) - { - memset(&create_info, 0, sizeof(create_info)); - create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - create_info.enabledExtensionCount = ARRAY_SIZE(extensions); - create_info.ppEnabledExtensionNames = extensions; - - vr = vulkan_funcs->p_vkCreateInstance(&create_info, NULL, &d3dkmt_vk_instance); - if (vr != VK_SUCCESS) - { - WARN("Failed to create a Vulkan instance, vr %d.\n", vr); - goto done; - } - } - -#define LOAD_VK_FUNC(f) \ - if (!(p##f = (void *)vulkan_funcs->p_vkGetInstanceProcAddr(d3dkmt_vk_instance, #f))) \ - { \ - WARN("Failed to load " #f ".\n"); \ - goto done; \ - } - - LOAD_VK_FUNC(vkEnumeratePhysicalDevices) - LOAD_VK_FUNC(vkGetPhysicalDeviceProperties2KHR) -#undef LOAD_VK_FUNC - - vr = pvkEnumeratePhysicalDevices(d3dkmt_vk_instance, &device_count, NULL); - if (vr != VK_SUCCESS || !device_count) - { - WARN("No Vulkan device found, vr %d, device_count %d.\n", vr, device_count); - goto done; - } - - if (!(vk_physical_devices = calloc(device_count, sizeof(*vk_physical_devices)))) - goto done; - - vr = pvkEnumeratePhysicalDevices(d3dkmt_vk_instance, &device_count, vk_physical_devices); - if (vr != VK_SUCCESS) - { - WARN("vkEnumeratePhysicalDevices failed, vr %d.\n", vr); - goto done; - } - - for (device_idx = 0; device_idx < device_count; ++device_idx) - { - memset(&id, 0, sizeof(id)); - id.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES; - properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; - properties2.pNext = &id; - - pvkGetPhysicalDeviceProperties2KHR(vk_physical_devices[device_idx], &properties2); - if (!IsEqualGUID(&uuid, id.deviceUUID)) - continue; - - if (!(adapter = malloc(sizeof(*adapter)))) - { - status = STATUS_NO_MEMORY; - goto done; - } - - adapter->handle = desc->hAdapter; - adapter->vk_device = vk_physical_devices[device_idx]; - list_add_head(&x11_d3dkmt_adapters, &adapter->entry); - status = STATUS_SUCCESS; - break; - } - -done: - if (d3dkmt_vk_instance && list_empty(&x11_d3dkmt_adapters)) - { - vulkan_funcs->p_vkDestroyInstance(d3dkmt_vk_instance, NULL); - d3dkmt_vk_instance = NULL; - } - pthread_mutex_unlock(&d3dkmt_mutex); - free(vk_physical_devices); - return status; -} - -NTSTATUS X11DRV_D3DKMTQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *desc ) -{ - const struct vulkan_funcs *vulkan_funcs = get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION); - PFN_vkGetPhysicalDeviceMemoryProperties2KHR pvkGetPhysicalDeviceMemoryProperties2KHR; - VkPhysicalDeviceMemoryBudgetPropertiesEXT budget; - VkPhysicalDeviceMemoryProperties2 properties2; - NTSTATUS status = STATUS_INVALID_PARAMETER; - struct x11_d3dkmt_adapter *adapter; - unsigned int i; - - desc->Budget = 0; - desc->CurrentUsage = 0; - desc->CurrentReservation = 0; - desc->AvailableForReservation = 0; - - if (!vulkan_funcs) - { - WARN("Vulkan is unavailable.\n"); - return STATUS_UNSUCCESSFUL; - } - - pthread_mutex_lock(&d3dkmt_mutex); - LIST_FOR_EACH_ENTRY(adapter, &x11_d3dkmt_adapters, struct x11_d3dkmt_adapter, entry) - { - if (adapter->handle != desc->hAdapter) - continue; - - if (!(pvkGetPhysicalDeviceMemoryProperties2KHR = (void *)vulkan_funcs->p_vkGetInstanceProcAddr(d3dkmt_vk_instance, "vkGetPhysicalDeviceMemoryProperties2KHR"))) - { - WARN("Failed to load vkGetPhysicalDeviceMemoryProperties2KHR.\n"); - status = STATUS_UNSUCCESSFUL; - goto done; - } - - memset(&budget, 0, sizeof(budget)); - budget.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT; - properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2; - properties2.pNext = &budget; - pvkGetPhysicalDeviceMemoryProperties2KHR(adapter->vk_device, &properties2); - for (i = 0; i < properties2.memoryProperties.memoryHeapCount; ++i) - { - if ((desc->MemorySegmentGroup == D3DKMT_MEMORY_SEGMENT_GROUP_LOCAL - && properties2.memoryProperties.memoryHeaps[i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) - || (desc->MemorySegmentGroup == D3DKMT_MEMORY_SEGMENT_GROUP_NON_LOCAL - && !(properties2.memoryProperties.memoryHeaps[i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT))) - { - desc->Budget += budget.heapBudget[i]; - desc->CurrentUsage += budget.heapUsage[i]; - } - } - desc->AvailableForReservation = desc->Budget / 2; - status = STATUS_SUCCESS; - break; - } -done: - pthread_mutex_unlock(&d3dkmt_mutex); - return status; -} - NTSTATUS x11drv_client_func( enum x11drv_client_funcs id, const void *params, ULONG size ) { void *ret_ptr; diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index c8ce9326d17..a59653871fd 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -2234,9 +2234,6 @@ static const struct gdi_dc_funcs xrender_funcs = NULL, /* pStrokeAndFillPath */ NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ - NULL, /* pD3DKMTCloseAdapter */ - NULL, /* pD3DKMTOpenAdapterFromLuid */ - NULL, /* pD3DKMTQueryVideoMemoryInfo */ GDI_PRIORITY_GRAPHICS_DRV + 10 /* priority */ };
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index ffe84787d51..60178cc2689 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -166,16 +166,13 @@ struct gdi_dc_funcs BOOL (*pStrokeAndFillPath)(PHYSDEV); BOOL (*pStrokePath)(PHYSDEV); BOOL (*pUnrealizePalette)(HPALETTE); - NTSTATUS (*pD3DKMTCloseAdapter)(const D3DKMT_CLOSEADAPTER *); - NTSTATUS (*pD3DKMTOpenAdapterFromLuid)(D3DKMT_OPENADAPTERFROMLUID *); - NTSTATUS (*pD3DKMTQueryVideoMemoryInfo)(D3DKMT_QUERYVIDEOMEMORYINFO *);
/* priority order for the driver on the stack */ UINT priority; };
/* increment this when you change the DC function table */ -#define WINE_GDI_DRIVER_VERSION 84 +#define WINE_GDI_DRIVER_VERSION 85
#define GDI_PRIORITY_NULL_DRV 0 /* null driver */ #define GDI_PRIORITY_FONT_DRV 100 /* any font driver */
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=143659
Your paranoid android.
=== debian11b (64 bit WoW report) ===
dxgi: dxgi.c:6715: Test failed: Got unexpected status 0xc000000d, expected 0. dxgi.c:6783: Test failed: Got unexpected status 0xc000000d, expected 0. dxgi.c:6802: Test failed: Got unexpected status 0xc000000d, expected 0xc01e0006. dxgi.c:6817: Test failed: Got unexpected status 0xc000000d, expected 0. dxgi.c:6828: Test failed: Got unexpected status 0xc000000d, expected 0xc01e0006. dxgi.c:6832: Test failed: Got unexpected status 0xc000000d, expected 0. dxgi.c:6847: Test failed: Got unexpected status 0xc000000d.
gdi32: driver.c:93: Test failed: Got unexpected return code 0xc000000d. driver.c:116: Test failed: Expect not null. driver.c:122: Test failed: Got unexpected return code 0xc000000d. driver.c:285: Test failed: Got unexpected return code 0. driver.c:309: Test failed: Got unexpected return code 0xc000000d. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 0. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 1. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 2. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 3. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 4. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 5. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 6. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 7. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 8. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 9. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 10. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 11. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 12. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 13. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 14. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 15. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 16. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 17. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 18. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 19. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 20. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 21. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 22. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 23. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 24. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 25. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 26. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 27. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 28. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 29. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 30. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 31. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 32. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 33. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 34. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 35. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 36. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 37. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 38. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 39. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 40. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 41. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 42. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 43. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 44. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 45. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 46. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 47. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 48. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 49. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 50. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 51. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 52. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 53. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 54. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 55. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 56. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 57. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 58. driver.c:517: Test failed: Got unexpected return code 0xc000000d at test 59. driver.c:539: Test failed: Got unexpected return code 0xc000000d. driver.c:550: Test failed: Got unexpected return code 0xc000000d. driver.c:561: Test failed: Got unexpected return code 0xc000000d. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 0. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 1. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 2. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 3. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 4. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 5. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 6. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 7. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 8. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 9. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 10. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 11. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 12. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 13. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 14. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 15. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 16. driver.c:612: Test failed: Got unexpected return code 0xc000000d at test 17. driver.c:670: Test failed: Got unexpected return code 0xc000000d. driver.c:930: Test failed: GUID_DEVINTERFACE_DISPLAY_ADAPTER: Got unexpected status 0xc000000d. driver.c:930: Test failed: GUID_DISPLAY_DEVICE_ARRIVAL: Got unexpected status 0xc000000d. driver.c:1008: Test failed: group 0: Unexpected current reservation 3932000. driver.c:1008: Test failed: group 1: Unexpected current reservation 3932000. driver.c:1024: Test failed: Got unexpected return code 0xc000000d. driver.c:1031: Test failed: Got unexpected return code 0xc000000d. driver.c:1053: Test failed: Got unexpected return code 0xc000000d.