-- v4: win32u: Move D3DKMT VidPn* functions out of winex11. win32u: Move D3DKMT functions to a new d3dkmt.c source.
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 26518d285d9..e9580063218 100644 --- a/dlls/win32u/font.c +++ b/dlls/win32u/font.c @@ -4785,11 +4785,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 2f46522f59f..a525f0dd499 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 */
v4: Only include the first two commits for now, see if that works.
Zhiyi Zhang (@zhiyi) commented about dlls/win32u/d3dkmt.c:
{ if (device->handle == desc->hDevice) {
memset( &set_owner_desc, 0, sizeof(set_owner_desc) );
Why did you need to change this function?
On Mon Mar 11 07:36:59 2024 +0000, Zhiyi Zhang wrote:
Why did you need to change this function?
Because NtGdiDdDDISetVidPnSourceOwner needs to enter the lock.
This merge request was approved by Zhiyi Zhang.