diff --git a/reactos/drivers/directx/dxg/ddhmg.c b/reactos/drivers/directx/dxg/ddhmg.c new file mode 100644 index 00000000000..2eb02cab5f3 --- /dev/null +++ b/reactos/drivers/directx/dxg/ddhmg.c @@ -0,0 +1,128 @@ + + +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Native driver for dxg implementation + * FILE: drivers/directx/dxg/ddhmg.c + * PROGRAMER: Magnus olsen (magnus@greatlord.com) + * REVISION HISTORY: + * 30/12-2007 Magnus Olsen + */ + +#include + +/* The DdHmgr manger stuff */ +ULONG gcSizeDdHmgr = 64 * sizeof(DD_ENTRY); +PDD_ENTRY gpentDdHmgr = NULL; + +ULONG gcMaxDdHmgr = 0; +PDD_ENTRY gpentDdHmgrLast = NULL; + +HANDLE ghFreeDdHmgr = 0; +HSEMAPHORE ghsemHmgr = NULL; + +BOOL +FASTCALL +VerifyObjectOwner(PDD_ENTRY pEntry) +{ + DWORD Pid = (DWORD) PsGetCurrentProcessId() & 0xFFFFFFFC; + DWORD check = pEntry->ObjectOwner.ulObj & 0xFFFFFFFE; + return ( (check == Pid) || (!check)); +} + +BOOL +FASTCALL +DdHmgCreate() +{ + gpentDdHmgr = EngAllocMem(FL_ZERO_MEMORY, gcSizeDdHmgr, TAG_THDD); + ghFreeDdHmgr = 0; + gcMaxDdHmgr = 1; + + if (gpentDdHmgr) + { + ghsemHmgr = EngCreateSemaphore(); + + if (ghsemHmgr) + { + gpLockShortDelay = EngAllocMem(FL_ZERO_MEMORY | FL_NONPAGED_MEMORY, sizeof(LARGE_INTEGER), TAG_GINI); + + if (gpLockShortDelay) + { + gpLockShortDelay->HighPart = -1; + return TRUE; + } + + EngDeleteSemaphore(ghsemHmgr); + ghsemHmgr = NULL; + } + + EngFreeMem(gpentDdHmgr); + gpentDdHmgr = NULL; + } + + return FALSE; +} + +BOOL +FASTCALL +DdHmgDestroy() +{ + gcMaxDdHmgr = 0; + gcSizeDdHmgr = 0; + ghFreeDdHmgr = 0; + gpentDdHmgrLast = NULL; + + if (gpentDdHmgr) + { + EngFreeMem(gpentDdHmgr); + gpentDdHmgr = NULL; + } + + if (ghsemHmgr) + { + EngDeleteSemaphore(ghsemHmgr); + ghsemHmgr = NULL; + } + + return TRUE; +} + +PVOID +FASTCALL +DdHmgLock( HANDLE DdHandle, UCHAR ObjectType, BOOLEAN LockOwned) +{ + + DWORD Index = (DWORD)DdHandle & 0x1FFFFF; + PDD_ENTRY pEntry = NULL; + PVOID Object = NULL; + + if ( !LockOwned ) + { + EngAcquireSemaphore(ghsemHmgr); + } + + if ( Index < gcMaxDdHmgr ) + { + pEntry = (PDD_ENTRY)((PBYTE)gpentDdHmgr + (sizeof(DD_ENTRY) * Index)); + if ( VerifyObjectOwner(pEntry) ) + { + if ( (pEntry->Objt == ObjectType ) && + (pEntry->FullUnique == (((DWORD)DdHandle >> 21) & 0x7FF) ) && + (pEntry->pobj->cExclusiveLock == 0) && + (pEntry->pobj->Tid == PsGetCurrentThread())) + { + InterlockedIncrement(&pEntry->pobj->cExclusiveLock); + pEntry->pobj->Tid = PsGetCurrentThread(); + Object = pEntry->pobj; + } + } + } + + if ( !LockOwned ) + { + EngDeleteSemaphore(ghsemHmgr); + } + + return Object; +} diff --git a/reactos/drivers/directx/dxg/dxg.rbuild b/reactos/drivers/directx/dxg/dxg.rbuild index 57421e86592..788ef755e71 100644 --- a/reactos/drivers/directx/dxg/dxg.rbuild +++ b/reactos/drivers/directx/dxg/dxg.rbuild @@ -1,6 +1,6 @@ - . @@ -8,6 +8,7 @@ installbase="system32/drivers" installname="dxg.sys"> dxgthk ntoskrnl main.c + ddhmg.c eng.c historic.c dxg.rc diff --git a/reactos/drivers/directx/dxg/dxg_int.h b/reactos/drivers/directx/dxg/dxg_int.h index 24135a1e967..17ec7c3ff11 100644 --- a/reactos/drivers/directx/dxg/dxg_int.h +++ b/reactos/drivers/directx/dxg/dxg_int.h @@ -31,20 +31,71 @@ #include "tags.h" +typedef struct _DD_BASEOBJECT +{ + HANDLE hHmgr; + ULONG ulShareCount; + LONG cExclusiveLock; + PVOID Tid; +} DD_BASEOBJECT, *PDD_BASEOBJECT, *POBJ; + + typedef struct _DD_ENTRY +{ + union + { + POBJ pobj; + HANDLE hFree; + }; + union + { + ULONG ulObj; + struct + { + USHORT Count; + USHORT Lock; + HANDLE Pid; + }; + } ObjectOwner; + USHORT FullUnique; + UCHAR Objt; + UCHAR Flags; + PVOID pUser; +} DD_ENTRY, *PDD_ENTRY; + + + /* exported functions */ NTSTATUS DriverEntry(IN PVOID Context1, IN PVOID Context2); NTSTATUS GsDriverEntry(IN PVOID Context1, IN PVOID Context2); NTSTATUS DxDdCleanupDxGraphics(); +/* Global pointers */ +extern ULONG gcSizeDdHmgr; +extern PDD_ENTRY gpentDdHmgr; +extern ULONG gcMaxDdHmgr; +extern PDD_ENTRY gpentDdHmgrLast; +extern HANDLE ghFreeDdHmgr; +extern HSEMAPHORE ghsemHmgr; +extern LONG gcDummyPageRefCnt; +extern HSEMAPHORE ghsemDummyPage; +extern VOID *gpDummyPage; +extern PEPROCESS gpepSession; +extern PLARGE_INTEGER gpLockShortDelay; + + /* Driver list export functions */ DWORD STDCALL DxDxgGenericThunk(ULONG_PTR ulIndex, ULONG_PTR ulHandle, SIZE_T *pdwSizeOfPtr1, PVOID pvPtr1, SIZE_T *pdwSizeOfPtr2, PVOID pvPtr2); DWORD STDCALL DxDdIoctl(ULONG ulIoctl, PVOID pBuffer, ULONG ulBufferSize); /* Internel functions */ -BOOL DdHmgCreate(); -BOOL DdHmgDestroy(); +BOOL FASTCALL VerifyObjectOwner(PDD_ENTRY pEntry); +BOOL FASTCALL DdHmgCreate(); +BOOL FASTCALL DdHmgDestroy(); +PVOID FASTCALL DdHmgLock( HANDLE DdHandle, UCHAR ObjectType, BOOLEAN LockOwned); + + /* define stuff */ #define drvDxEngLockDC gpEngFuncs[DXENG_INDEX_DxEngLockDC] @@ -53,3 +104,4 @@ BOOL DdHmgDestroy(); #define drvDxEngUnlockDC gpEngFuncs[DXENG_INDEX_DxEngUnlockDC] #define drvDxEngUnlockHdev gpEngFuncs[DXENG_INDEX_DxEngUnlockHdev] #define drvDxEngLockHdev gpEngFuncs[DXENG_INDEX_DxEngLockHdev] + diff --git a/reactos/drivers/directx/dxg/main.c b/reactos/drivers/directx/dxg/main.c index c69035fa740..ba82eeb78fa 100644 --- a/reactos/drivers/directx/dxg/main.c +++ b/reactos/drivers/directx/dxg/main.c @@ -13,17 +13,11 @@ #include #include "dxg_driver.h" -ULONG gcMaxDdHmgr = 0; -ULONG gcSizeDdHmgr = 0; LONG gcDummyPageRefCnt = 0; -HSEMAPHORE ghsemHmgr = NULL; HSEMAPHORE ghsemDummyPage = NULL; VOID *gpDummyPage = NULL; PEPROCESS gpepSession = NULL; PLARGE_INTEGER gpLockShortDelay = NULL; -HANDLE ghFreeDdHmgr = 0; -VOID *gpentDdHmgr = NULL; -VOID *gpentDdHmgrLast = NULL; PDRVFN gpEngFuncs; @@ -142,61 +136,10 @@ DxDdCleanupDxGraphics() return 0; } -BOOL -DdHmgDestroy() -{ - gcMaxDdHmgr = 0; - gcSizeDdHmgr = 0; - ghFreeDdHmgr = 0; - gpentDdHmgrLast = NULL; - - if (gpentDdHmgr) - { - EngFreeMem(gpentDdHmgr); - gpentDdHmgr = NULL; - } - - if (ghsemHmgr) - { - EngDeleteSemaphore(ghsemHmgr); - ghsemHmgr = NULL; - } - - return TRUE; -} - - -BOOL -DdHmgCreate() -{ - gpentDdHmgr = EngAllocMem(FL_ZERO_MEMORY, gcSizeDdHmgr, TAG_THDD); - ghFreeDdHmgr = 0; - gcMaxDdHmgr = 1; - - if (gpentDdHmgr) - { - ghsemHmgr = EngCreateSemaphore(); - - if (ghsemHmgr) - { - gpLockShortDelay = EngAllocMem(FL_ZERO_MEMORY | FL_NONPAGED_MEMORY, sizeof(LARGE_INTEGER), TAG_GINI); - - if (gpLockShortDelay) - { - gpLockShortDelay->HighPart = -1; - return TRUE; - } - - EngDeleteSemaphore(ghsemHmgr); - ghsemHmgr = NULL; - } - - EngFreeMem(gpentDdHmgr); - gpentDdHmgr = NULL; - } - - return FALSE; -} + + + +