From: Rémi Bernon rbernon@codeweavers.com
--- dlls/gdi32/gdi32.spec | 4 ++ dlls/win32u/d3dkmt.c | 55 +++++++++++++++++++++++++ dlls/win32u/win32syscalls.h | 20 ++++------ dlls/win32u/win32u.spec | 8 ++-- dlls/wow64win/gdi.c | 80 +++++++++++++++++++++++++++++++++++++ include/ddk/d3dkmthk.h | 38 ++++++++++++++++++ include/ntgdi.h | 4 ++ 7 files changed, 193 insertions(+), 16 deletions(-)
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec index fef4d66effe..c42172f142f 100644 --- a/dlls/gdi32/gdi32.spec +++ b/dlls/gdi32/gdi32.spec @@ -99,6 +99,8 @@ # @ stub CreateScaledCompatibleBitmap # @ stub CreateSessionMappedDIBSection @ stdcall CreateSolidBrush(long) +@ stdcall D3DKMTAcquireKeyedMutex(ptr) win32u.NtGdiDdDDIAcquireKeyedMutex +@ stdcall D3DKMTAcquireKeyedMutex2(ptr) win32u.NtGdiDdDDIAcquireKeyedMutex2 @ stdcall D3DKMTCheckOcclusion(ptr) win32u.NtGdiDdDDICheckOcclusion @ stdcall D3DKMTCheckVidPnExclusiveOwnership(ptr) win32u.NtGdiDdDDICheckVidPnExclusiveOwnership @ stdcall D3DKMTCloseAdapter(ptr) win32u.NtGdiDdDDICloseAdapter @@ -139,6 +141,8 @@ @ stdcall D3DKMTQueryResourceInfoFromNtHandle(ptr) win32u.NtGdiDdDDIQueryResourceInfoFromNtHandle @ stdcall D3DKMTQueryStatistics(ptr) win32u.NtGdiDdDDIQueryStatistics @ stdcall D3DKMTQueryVideoMemoryInfo(ptr) win32u.NtGdiDdDDIQueryVideoMemoryInfo +@ stdcall D3DKMTReleaseKeyedMutex(ptr) win32u.NtGdiDdDDIReleaseKeyedMutex +@ stdcall D3DKMTReleaseKeyedMutex2(ptr) win32u.NtGdiDdDDIReleaseKeyedMutex2 @ stdcall D3DKMTSetQueuedLimit(ptr) win32u.NtGdiDdDDISetQueuedLimit @ stdcall D3DKMTSetVidPnSourceOwner(ptr) win32u.NtGdiDdDDISetVidPnSourceOwner @ stdcall D3DKMTShareObjects(long ptr ptr long ptr) win32u.NtGdiDdDDIShareObjects diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 23640cb39be..3040cce030b 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -1489,6 +1489,61 @@ failed: return status; }
+/****************************************************************************** + * NtGdiDdDDIAcquireKeyedMutex2 (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIAcquireKeyedMutex2( D3DKMT_ACQUIREKEYEDMUTEX2 *params ) +{ + FIXME( "params %p stub!\n", params ); + return STATUS_NOT_IMPLEMENTED; +} + +/****************************************************************************** + * NtGdiDdDDIAcquireKeyedMutex (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIAcquireKeyedMutex( D3DKMT_ACQUIREKEYEDMUTEX *params ) +{ + D3DKMT_ACQUIREKEYEDMUTEX2 params2 = {0}; + NTSTATUS status; + + TRACE( "params %p\n", params ); + + if (!params) return STATUS_INVALID_PARAMETER; + params2.hKeyedMutex = params->hKeyedMutex; + params2.pTimeout = params->pTimeout; + params2.Key = params->Key; + params2.FenceValue = params->FenceValue; + status = NtGdiDdDDIAcquireKeyedMutex2( ¶ms2 ); + params->FenceValue = params2.FenceValue; + + return status; +} + +/****************************************************************************** + * NtGdiDdDDIReleaseKeyedMutex2 (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIReleaseKeyedMutex2( D3DKMT_RELEASEKEYEDMUTEX2 *params ) +{ + FIXME( "params %p stub!\n", params ); + return STATUS_NOT_IMPLEMENTED; +} + +/****************************************************************************** + * NtGdiDdDDIReleaseKeyedMutex (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIReleaseKeyedMutex( D3DKMT_RELEASEKEYEDMUTEX *params ) +{ + D3DKMT_RELEASEKEYEDMUTEX2 params2 = {0}; + + TRACE( "params %p\n", params ); + + if (!params) return STATUS_INVALID_PARAMETER; + params2.hKeyedMutex = params->hKeyedMutex; + params2.Key = params->Key; + params2.FenceValue = params->FenceValue; + return NtGdiDdDDIReleaseKeyedMutex2( ¶ms2 ); +} +
/****************************************************************************** * NtGdiDdDDICreateSynchronizationObject2 (win32u.@) diff --git a/dlls/win32u/win32syscalls.h b/dlls/win32u/win32syscalls.h index f37eae3551b..a11a487cb72 100644 --- a/dlls/win32u/win32syscalls.h +++ b/dlls/win32u/win32syscalls.h @@ -201,8 +201,8 @@ SYSCALL_ENTRY( 0x10c5, NtGdiDDCCISetVCPFeature, 0 ) \ SYSCALL_ENTRY( 0x10c6, NtGdiDdCreateFullscreenSprite, 0 ) \ SYSCALL_ENTRY( 0x10c7, NtGdiDdDDIAbandonSwapChain, 0 ) \ - SYSCALL_ENTRY( 0x10c8, NtGdiDdDDIAcquireKeyedMutex, 0 ) \ - SYSCALL_ENTRY( 0x10c9, NtGdiDdDDIAcquireKeyedMutex2, 0 ) \ + SYSCALL_ENTRY( 0x10c8, NtGdiDdDDIAcquireKeyedMutex, 4 ) \ + SYSCALL_ENTRY( 0x10c9, NtGdiDdDDIAcquireKeyedMutex2, 4 ) \ SYSCALL_ENTRY( 0x10ca, NtGdiDdDDIAcquireSwapChain, 0 ) \ SYSCALL_ENTRY( 0x10cb, NtGdiDdDDIAddSurfaceToSwapChain, 0 ) \ SYSCALL_ENTRY( 0x10cc, NtGdiDdDDIAdjustFullscreenGamma, 0 ) \ @@ -343,8 +343,8 @@ SYSCALL_ENTRY( 0x1153, NtGdiDdDDIQueryVideoMemoryInfo, 4 ) \ SYSCALL_ENTRY( 0x1154, NtGdiDdDDIReclaimAllocations, 0 ) \ SYSCALL_ENTRY( 0x1155, NtGdiDdDDIReclaimAllocations2, 0 ) \ - SYSCALL_ENTRY( 0x1156, NtGdiDdDDIReleaseKeyedMutex, 0 ) \ - SYSCALL_ENTRY( 0x1157, NtGdiDdDDIReleaseKeyedMutex2, 0 ) \ + SYSCALL_ENTRY( 0x1156, NtGdiDdDDIReleaseKeyedMutex, 4 ) \ + SYSCALL_ENTRY( 0x1157, NtGdiDdDDIReleaseKeyedMutex2, 4 ) \ SYSCALL_ENTRY( 0x1158, NtGdiDdDDIReleaseProcessVidPnSourceOwners, 0 ) \ SYSCALL_ENTRY( 0x1159, NtGdiDdDDIReleaseSwapChain, 0 ) \ SYSCALL_ENTRY( 0x115a, NtGdiDdDDIRemoveSurfaceFromSwapChain, 0 ) \ @@ -1743,8 +1743,8 @@ SYSCALL_ENTRY( 0x10c5, NtGdiDDCCISetVCPFeature, 0 ) \ SYSCALL_ENTRY( 0x10c6, NtGdiDdCreateFullscreenSprite, 0 ) \ SYSCALL_ENTRY( 0x10c7, NtGdiDdDDIAbandonSwapChain, 0 ) \ - SYSCALL_ENTRY( 0x10c8, NtGdiDdDDIAcquireKeyedMutex, 0 ) \ - SYSCALL_ENTRY( 0x10c9, NtGdiDdDDIAcquireKeyedMutex2, 0 ) \ + SYSCALL_ENTRY( 0x10c8, NtGdiDdDDIAcquireKeyedMutex, 8 ) \ + SYSCALL_ENTRY( 0x10c9, NtGdiDdDDIAcquireKeyedMutex2, 8 ) \ SYSCALL_ENTRY( 0x10ca, NtGdiDdDDIAcquireSwapChain, 0 ) \ SYSCALL_ENTRY( 0x10cb, NtGdiDdDDIAddSurfaceToSwapChain, 0 ) \ SYSCALL_ENTRY( 0x10cc, NtGdiDdDDIAdjustFullscreenGamma, 0 ) \ @@ -1885,8 +1885,8 @@ SYSCALL_ENTRY( 0x1153, NtGdiDdDDIQueryVideoMemoryInfo, 8 ) \ SYSCALL_ENTRY( 0x1154, NtGdiDdDDIReclaimAllocations, 0 ) \ SYSCALL_ENTRY( 0x1155, NtGdiDdDDIReclaimAllocations2, 0 ) \ - SYSCALL_ENTRY( 0x1156, NtGdiDdDDIReleaseKeyedMutex, 0 ) \ - SYSCALL_ENTRY( 0x1157, NtGdiDdDDIReleaseKeyedMutex2, 0 ) \ + SYSCALL_ENTRY( 0x1156, NtGdiDdDDIReleaseKeyedMutex, 8 ) \ + SYSCALL_ENTRY( 0x1157, NtGdiDdDDIReleaseKeyedMutex2, 8 ) \ SYSCALL_ENTRY( 0x1158, NtGdiDdDDIReleaseProcessVidPnSourceOwners, 0 ) \ SYSCALL_ENTRY( 0x1159, NtGdiDdDDIReleaseSwapChain, 0 ) \ SYSCALL_ENTRY( 0x115a, NtGdiDdDDIRemoveSurfaceFromSwapChain, 0 ) \ @@ -3257,8 +3257,6 @@ SYSCALL_STUB( NtGdiDDCCISetVCPFeature ) \ SYSCALL_STUB( NtGdiDdCreateFullscreenSprite ) \ SYSCALL_STUB( NtGdiDdDDIAbandonSwapChain ) \ - SYSCALL_STUB( NtGdiDdDDIAcquireKeyedMutex ) \ - SYSCALL_STUB( NtGdiDdDDIAcquireKeyedMutex2 ) \ SYSCALL_STUB( NtGdiDdDDIAcquireSwapChain ) \ SYSCALL_STUB( NtGdiDdDDIAddSurfaceToSwapChain ) \ SYSCALL_STUB( NtGdiDdDDIAdjustFullscreenGamma ) \ @@ -3360,8 +3358,6 @@ SYSCALL_STUB( NtGdiDdDDIQueryVidPnExclusiveOwnership ) \ SYSCALL_STUB( NtGdiDdDDIReclaimAllocations ) \ SYSCALL_STUB( NtGdiDdDDIReclaimAllocations2 ) \ - SYSCALL_STUB( NtGdiDdDDIReleaseKeyedMutex ) \ - SYSCALL_STUB( NtGdiDdDDIReleaseKeyedMutex2 ) \ SYSCALL_STUB( NtGdiDdDDIReleaseProcessVidPnSourceOwners ) \ SYSCALL_STUB( NtGdiDdDDIReleaseSwapChain ) \ SYSCALL_STUB( NtGdiDdDDIRemoveSurfaceFromSwapChain ) \ diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 84654596515..61e87675357 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -199,8 +199,8 @@ @ stub -syscall NtGdiDDCCISetVCPFeature @ stub -syscall NtGdiDdCreateFullscreenSprite @ stub -syscall NtGdiDdDDIAbandonSwapChain -@ stub -syscall NtGdiDdDDIAcquireKeyedMutex -@ stub -syscall NtGdiDdDDIAcquireKeyedMutex2 +@ stdcall -syscall NtGdiDdDDIAcquireKeyedMutex(ptr) +@ stdcall -syscall NtGdiDdDDIAcquireKeyedMutex2(ptr) @ stub -syscall NtGdiDdDDIAcquireSwapChain @ stub -syscall NtGdiDdDDIAddSurfaceToSwapChain @ stub -syscall NtGdiDdDDIAdjustFullscreenGamma @@ -341,8 +341,8 @@ @ stdcall -syscall NtGdiDdDDIQueryVideoMemoryInfo(ptr) @ stub -syscall NtGdiDdDDIReclaimAllocations @ stub -syscall NtGdiDdDDIReclaimAllocations2 -@ stub -syscall NtGdiDdDDIReleaseKeyedMutex -@ stub -syscall NtGdiDdDDIReleaseKeyedMutex2 +@ stdcall -syscall NtGdiDdDDIReleaseKeyedMutex(ptr) +@ stdcall -syscall NtGdiDdDDIReleaseKeyedMutex2(ptr) @ stub -syscall NtGdiDdDDIReleaseProcessVidPnSourceOwners @ stub -syscall NtGdiDdDDIReleaseSwapChain @ stub -syscall NtGdiDdDDIRemoveSurfaceFromSwapChain diff --git a/dlls/wow64win/gdi.c b/dlls/wow64win/gdi.c index a03dd4e4990..9ba1c3b93de 100644 --- a/dlls/wow64win/gdi.c +++ b/dlls/wow64win/gdi.c @@ -399,6 +399,56 @@ NTSTATUS WINAPI wow64_NtGdiCreateSolidBrush( UINT *args ) return HandleToUlong( NtGdiCreateSolidBrush( color, brush )); }
+NTSTATUS WINAPI wow64_NtGdiDdDDIAcquireKeyedMutex( UINT *args ) +{ + struct + { + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + ULONG pTimeout; + UINT64 FenceValue; + } *desc32 = get_ptr( &args ); + D3DKMT_ACQUIREKEYEDMUTEX desc; + NTSTATUS status; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.hKeyedMutex = desc32->hKeyedMutex; + desc.Key = desc32->Key; + desc.pTimeout = UlongToHandle( desc32->pTimeout ); + desc.FenceValue = desc32->FenceValue; + status = NtGdiDdDDIAcquireKeyedMutex( &desc ); + desc32->FenceValue = desc.FenceValue; + + return status; +} + +NTSTATUS WINAPI wow64_NtGdiDdDDIAcquireKeyedMutex2( UINT *args ) +{ + struct + { + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + ULONG pTimeout; + UINT64 FenceValue; + ULONG pPrivateRuntimeData; + UINT PrivateRuntimeDataSize; + } *desc32 = get_ptr( &args ); + D3DKMT_ACQUIREKEYEDMUTEX2 desc; + NTSTATUS status; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.hKeyedMutex = desc32->hKeyedMutex; + desc.Key = desc32->Key; + desc.pTimeout = UlongToHandle( desc32->pTimeout ); + desc.FenceValue = desc32->FenceValue; + desc.pPrivateRuntimeData = UlongToHandle( desc32->pPrivateRuntimeData ); + desc.PrivateRuntimeDataSize = desc32->PrivateRuntimeDataSize; + status = NtGdiDdDDIAcquireKeyedMutex2( &desc ); + desc32->FenceValue = desc.FenceValue; + + return status; +} + NTSTATUS WINAPI wow64_NtGdiDdDDICheckOcclusion( UINT *args ) { struct @@ -1430,6 +1480,36 @@ NTSTATUS WINAPI wow64_NtGdiDdDDIQueryVideoMemoryInfo( UINT *args ) return status; }
+NTSTATUS WINAPI wow64_NtGdiDdDDIReleaseKeyedMutex( UINT *args ) +{ + D3DKMT_RELEASEKEYEDMUTEX *desc = get_ptr( &args ); + return NtGdiDdDDIReleaseKeyedMutex( desc ); +} + +NTSTATUS WINAPI wow64_NtGdiDdDDIReleaseKeyedMutex2( UINT *args ) +{ + struct + { + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + UINT64 FenceValue; + ULONG pPrivateRuntimeData; + UINT PrivateRuntimeDataSize; + } *desc32 = get_ptr( &args ); + D3DKMT_RELEASEKEYEDMUTEX2 desc; + NTSTATUS status; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.hKeyedMutex = desc32->hKeyedMutex; + desc.Key = desc32->Key; + desc.FenceValue = desc32->FenceValue; + desc.pPrivateRuntimeData = UlongToHandle( desc32->pPrivateRuntimeData ); + desc.PrivateRuntimeDataSize = desc32->PrivateRuntimeDataSize; + status = NtGdiDdDDIReleaseKeyedMutex2( &desc ); + + return status; +} + NTSTATUS WINAPI wow64_NtGdiDdDDISetQueuedLimit( UINT *args ) { D3DKMT_SETQUEUEDLIMIT *desc = get_ptr( &args ); diff --git a/include/ddk/d3dkmthk.h b/include/ddk/d3dkmthk.h index 2650ff723aa..b072b16f1fc 100644 --- a/include/ddk/d3dkmthk.h +++ b/include/ddk/d3dkmthk.h @@ -878,6 +878,40 @@ typedef struct _D3DKMT_OPENKEYEDMUTEXFROMNTHANDLE UINT PrivateRuntimeDataSize; } D3DKMT_OPENKEYEDMUTEXFROMNTHANDLE;
+typedef struct _D3DKMT_ACQUIREKEYEDMUTEX +{ + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + LARGE_INTEGER *pTimeout; + UINT64 FenceValue; +} D3DKMT_ACQUIREKEYEDMUTEX; + +typedef struct _D3DKMT_RELEASEKEYEDMUTEX +{ + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + UINT64 FenceValue; +} D3DKMT_RELEASEKEYEDMUTEX; + +typedef struct _D3DKMT_ACQUIREKEYEDMUTEX2 +{ + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + LARGE_INTEGER *pTimeout; + UINT64 FenceValue; + VOID *pPrivateRuntimeData; + UINT PrivateRuntimeDataSize; +} D3DKMT_ACQUIREKEYEDMUTEX2; + +typedef struct _D3DKMT_RELEASEKEYEDMUTEX2 +{ + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + UINT64 FenceValue; + VOID *pPrivateRuntimeData; + UINT PrivateRuntimeDataSize; +} D3DKMT_RELEASEKEYEDMUTEX2; + typedef struct _D3DKMT_OPENNTHANDLEFROMNAME { DWORD dwDesiredAccess; @@ -1295,6 +1329,8 @@ extern "C" { #endif /* __cplusplus */
+NTSTATUS WINAPI D3DKMTAcquireKeyedMutex( D3DKMT_ACQUIREKEYEDMUTEX *params ); +NTSTATUS WINAPI D3DKMTAcquireKeyedMutex2( D3DKMT_ACQUIREKEYEDMUTEX2 *params ); NTSTATUS WINAPI D3DKMTCheckOcclusion( const D3DKMT_CHECKOCCLUSION *desc ); NTSTATUS WINAPI D3DKMTCheckVidPnExclusiveOwnership(const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc); NTSTATUS WINAPI D3DKMTCloseAdapter(const D3DKMT_CLOSEADAPTER *desc); @@ -1334,6 +1370,8 @@ NTSTATUS WINAPI D3DKMTQueryResourceInfo( D3DKMT_QUERYRESOURCEINFO *params ); NTSTATUS WINAPI D3DKMTQueryResourceInfoFromNtHandle( D3DKMT_QUERYRESOURCEINFOFROMNTHANDLE *params ); NTSTATUS WINAPI D3DKMTQueryStatistics(D3DKMT_QUERYSTATISTICS *stats); NTSTATUS WINAPI D3DKMTQueryVideoMemoryInfo(D3DKMT_QUERYVIDEOMEMORYINFO *desc); +NTSTATUS WINAPI D3DKMTReleaseKeyedMutex( D3DKMT_RELEASEKEYEDMUTEX *params ); +NTSTATUS WINAPI D3DKMTReleaseKeyedMutex2( D3DKMT_RELEASEKEYEDMUTEX2 *params ); NTSTATUS WINAPI D3DKMTSetQueuedLimit(D3DKMT_SETQUEUEDLIMIT *desc); NTSTATUS WINAPI D3DKMTSetVidPnSourceOwner(const D3DKMT_SETVIDPNSOURCEOWNER *desc); NTSTATUS WINAPI D3DKMTShareObjects( UINT count, const D3DKMT_HANDLE *handles, OBJECT_ATTRIBUTES *attr, UINT access, HANDLE *handle ); diff --git a/include/ntgdi.h b/include/ntgdi.h index f073cf5ac61..d8fbfc6c8fd 100644 --- a/include/ntgdi.h +++ b/include/ntgdi.h @@ -514,6 +514,8 @@ W32KAPI BOOL WINAPI NtGdiUnrealizeObject( HGDIOBJ obj ); W32KAPI BOOL WINAPI NtGdiUpdateColors( HDC hdc ); W32KAPI BOOL WINAPI NtGdiWidenPath( HDC hdc );
+W32KAPI NTSTATUS WINAPI NtGdiDdDDIAcquireKeyedMutex( D3DKMT_ACQUIREKEYEDMUTEX *params ); +W32KAPI NTSTATUS WINAPI NtGdiDdDDIAcquireKeyedMutex2( D3DKMT_ACQUIREKEYEDMUTEX2 *params ); W32KAPI NTSTATUS WINAPI NtGdiDdDDICheckOcclusion( const D3DKMT_CHECKOCCLUSION *desc ); W32KAPI NTSTATUS WINAPI NtGdiDdDDICheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ); W32KAPI NTSTATUS WINAPI NtGdiDdDDICloseAdapter( const D3DKMT_CLOSEADAPTER *desc ); @@ -553,6 +555,8 @@ W32KAPI NTSTATUS WINAPI NtGdiDdDDIQueryResourceInfo( D3DKMT_QUERYRESOURCEINFO *p W32KAPI NTSTATUS WINAPI NtGdiDdDDIQueryResourceInfoFromNtHandle( D3DKMT_QUERYRESOURCEINFOFROMNTHANDLE *params ); W32KAPI NTSTATUS WINAPI NtGdiDdDDIQueryStatistics( D3DKMT_QUERYSTATISTICS *stats ); W32KAPI NTSTATUS WINAPI NtGdiDdDDIQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *desc ); +W32KAPI NTSTATUS WINAPI NtGdiDdDDIReleaseKeyedMutex( D3DKMT_RELEASEKEYEDMUTEX *params ); +W32KAPI NTSTATUS WINAPI NtGdiDdDDIReleaseKeyedMutex2( D3DKMT_RELEASEKEYEDMUTEX2 *params ); W32KAPI NTSTATUS WINAPI NtGdiDdDDISetQueuedLimit( D3DKMT_SETQUEUEDLIMIT *desc ); W32KAPI NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ); W32KAPI NTSTATUS WINAPI NtGdiDdDDIShareObjects( UINT count, const D3DKMT_HANDLE *handles, OBJECT_ATTRIBUTES *attr, UINT access, HANDLE *handle );
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/tests/d3dkmt.c | 135 +++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+)
diff --git a/dlls/win32u/tests/d3dkmt.c b/dlls/win32u/tests/d3dkmt.c index ba25286642e..812490255aa 100644 --- a/dlls/win32u/tests/d3dkmt.c +++ b/dlls/win32u/tests/d3dkmt.c @@ -93,6 +93,7 @@ static const char *debugstr_ok( const char *cond ) #define ok_i4( r, op, e ) ok_ex( r, op, e, int, "%i" ) #define ok_u4( r, op, e ) ok_ex( r, op, e, UINT, "%u" ) #define ok_x4( r, op, e ) ok_ex( r, op, e, UINT, "%#x" ) +#define ok_x8( r, op, e ) ok_ex( r, op, e, UINT64, "%#I64x" ) #define ok_u1( r, op, e ) ok_ex( r, op, e, unsigned char, "%u" ) #define ok_ptr( r, op, e ) ok_ex( r, op, e, const void *, "%p" )
@@ -2070,6 +2071,139 @@ static void test_D3DKMTCreateKeyedMutex( void ) ok_nt( STATUS_SUCCESS, status ); }
+static DWORD WINAPI test_acquire_mutex( void *arg ) +{ + NTSTATUS status = D3DKMTAcquireKeyedMutex( arg ); + todo_wine ok_nt( STATUS_ABANDONED, status ); + return 0; +} + +static void test_D3DKMTAcquireKeyedMutex( void ) +{ + LARGE_INTEGER timeout = {.QuadPart = 10 * -10000}; + D3DKMT_DESTROYKEYEDMUTEX destroy = {0}; + D3DKMT_ACQUIREKEYEDMUTEX acquire = {0}; + D3DKMT_RELEASEKEYEDMUTEX release = {0}; + D3DKMT_CREATEKEYEDMUTEX create = {0}; + D3DKMT_OPENKEYEDMUTEX open = {0}; + D3DKMT_HANDLE next_local = 0; + NTSTATUS status; + HANDLE thread; + DWORD ret; + + create.hKeyedMutex = create.hSharedHandle = 0x1eadbeed; + status = D3DKMTCreateKeyedMutex( &create ); + ok_nt( STATUS_SUCCESS, status ); + check_d3dkmt_local( create.hKeyedMutex, &next_local ); + check_d3dkmt_global( create.hSharedHandle ); + + status = D3DKMTAcquireKeyedMutex( NULL ); + ok_nt( STATUS_INVALID_PARAMETER, status ); + acquire.hKeyedMutex = 0x1eadbeed; + acquire.Key = 0xdeadbeef; + acquire.pTimeout = &timeout; + acquire.FenceValue = 0xdeadbeef; + status = D3DKMTAcquireKeyedMutex( &acquire ); + todo_wine ok_nt( STATUS_INVALID_PARAMETER, status ); + ok_x4( acquire.Key, ==, 0xdeadbeef ); + ok_x8( acquire.FenceValue, ==, 0xdeadbeef ); + + acquire.hKeyedMutex = create.hKeyedMutex; + acquire.Key = 0xdeadbeef; + acquire.FenceValue = 0xdeadbeef; + status = D3DKMTAcquireKeyedMutex( &acquire ); + todo_wine ok_nt( STATUS_TIMEOUT, status ); + ok_x4( acquire.Key, ==, 0xdeadbeef ); + todo_wine ok_x8( acquire.FenceValue, ==, 0 ); + + acquire.hKeyedMutex = create.hKeyedMutex; + acquire.Key = 0; + acquire.FenceValue = 0xdeadbeef; + status = D3DKMTAcquireKeyedMutex( &acquire ); + todo_wine ok_nt( STATUS_SUCCESS, status ); + ok_x4( acquire.Key, ==, 0 ); + todo_wine ok_x8( acquire.FenceValue, ==, 0 ); + + status = D3DKMTReleaseKeyedMutex( NULL ); + ok_nt( STATUS_INVALID_PARAMETER, status ); + release.hKeyedMutex = 0x1eadbeed; + release.Key = 0xdeadbeef; + release.FenceValue = 0xdeadbeef; + status = D3DKMTReleaseKeyedMutex( &release ); + todo_wine ok_nt( STATUS_INVALID_PARAMETER, status ); + ok_x4( release.Key, ==, 0xdeadbeef ); + ok_x8( release.FenceValue, ==, 0xdeadbeef ); + release.hKeyedMutex = create.hKeyedMutex; + release.Key = 1; + release.FenceValue = 1234; + status = D3DKMTReleaseKeyedMutex( &release ); + todo_wine ok_nt( STATUS_SUCCESS, status ); + ok_x4( release.Key, ==, 1 ); + ok_x8( release.FenceValue, ==, 1234 ); + release.FenceValue = 0xdeadbeef; + status = D3DKMTReleaseKeyedMutex( &release ); + todo_wine ok_nt( STATUS_INVALID_PARAMETER, status ); + ok_x4( release.Key, ==, 1 ); + ok_x8( release.FenceValue, ==, 0xdeadbeef ); + + acquire.Key = 0; + acquire.FenceValue = 0xdeadbeef; + status = D3DKMTAcquireKeyedMutex( &acquire ); + todo_wine ok_nt( STATUS_TIMEOUT, status ); + todo_wine ok_x8( acquire.FenceValue, ==, 0 ); + acquire.Key = 1; + acquire.FenceValue = 0xdeadbeef; + status = D3DKMTAcquireKeyedMutex( &acquire ); + todo_wine ok_nt( STATUS_SUCCESS, status ); + todo_wine ok_x8( acquire.FenceValue, ==, 1234 ); + + release.Key = 0; + release.FenceValue = 0; + status = D3DKMTReleaseKeyedMutex( &release ); + todo_wine ok_nt( STATUS_SUCCESS, status ); + acquire.Key = 0; + acquire.FenceValue = 0xdeadbeef; + status = D3DKMTAcquireKeyedMutex( &acquire ); + todo_wine ok_nt( STATUS_SUCCESS, status ); + todo_wine ok_x8( acquire.FenceValue, ==, 0 ); + + open.hSharedHandle = create.hSharedHandle; + open.hKeyedMutex = 0xdeadbeef; + status = D3DKMTOpenKeyedMutex( &open ); + ok_nt( STATUS_SUCCESS, status ); + check_d3dkmt_local( open.hKeyedMutex, &next_local ); + + acquire.hKeyedMutex = open.hKeyedMutex; + acquire.Key = 0; + acquire.FenceValue = 0xdeadbeef; + timeout.QuadPart = 5000 * -10000; + thread = CreateThread( NULL, 0, test_acquire_mutex, &acquire, 0, NULL ); + ok_ptr( thread, !=, NULL ); + ret = WaitForSingleObject( thread, 100 ); + todo_wine ok_u4( ret, ==, WAIT_TIMEOUT ); + + destroy.hKeyedMutex = create.hKeyedMutex; + status = D3DKMTDestroyKeyedMutex( &destroy ); + ok_nt( STATUS_SUCCESS, status ); + ret = WaitForSingleObject( thread, 5000 ); + ok_u4( ret, ==, 0 ); + CloseHandle( thread ); + + acquire.Key = 0xdeadbeef; + acquire.FenceValue = 0xdeadbeef; + timeout.QuadPart = 100 * -10000; + status = D3DKMTAcquireKeyedMutex( &acquire ); + todo_wine ok_nt( STATUS_ABANDONED, status ); + todo_wine ok_x8( acquire.FenceValue, ==, 0 ); + status = D3DKMTAcquireKeyedMutex( &acquire ); + todo_wine ok_nt( STATUS_ABANDONED, status ); + todo_wine ok_x8( acquire.FenceValue, ==, 0 ); + + destroy.hKeyedMutex = open.hKeyedMutex; + status = D3DKMTDestroyKeyedMutex( &destroy ); + ok_nt( STATUS_SUCCESS, status ); +} + static void test_D3DKMTCreateAllocation( void ) { OBJECT_ATTRIBUTES attr = {.Length = sizeof(attr)}; @@ -5071,6 +5205,7 @@ START_TEST( d3dkmt ) test_gpu_device_properties(); test_D3DKMTCreateSynchronizationObject(); test_D3DKMTCreateKeyedMutex(); + test_D3DKMTAcquireKeyedMutex(); test_D3DKMTCreateAllocation(); test_D3DKMTShareObjects(); test_shared_resources();