mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
[DXG] Implement DxDdCreateDirectDrawObject and update DdHmgAlloc CORE-4490
svn path=/trunk/; revision=74171
This commit is contained in:
parent
47e72b3d01
commit
856b02d967
6 changed files with 107 additions and 24 deletions
|
@ -24,10 +24,10 @@ typedef struct _EDD_DIRECTDRAW_LOCAL
|
|||
/* 0x2C */ FLONG fl;
|
||||
/* 0x30 */ struct _EDD_DIRECTDRAW_LOCAL *peDirectDrawLocal_prev; // verified to match Windows XP,
|
||||
// points to the old DDLocal when new handle is created.
|
||||
/* 0x34 */ PEPROCESS Process;
|
||||
/* 0x34 */ ULONG unk_034;
|
||||
/* 0x38 */ ULONG unk_038;
|
||||
/* 0x3C */ HANDLE UniqueProcess;
|
||||
/* 0x40 */ VOID *unk_040;
|
||||
/* 0x40 */ PEPROCESS Process;
|
||||
/* 0x44 */ VOID *unk_044;
|
||||
/* 0x48 */ ULONG unk_048;
|
||||
/* 0x4C */ ULONG unk_04C;
|
||||
|
|
|
@ -323,12 +323,12 @@ DdGetFreeHandle(UCHAR objType)
|
|||
* Size of memory to be allocated
|
||||
* @param CHAR objType
|
||||
* Object type
|
||||
* @param UINT objFlags
|
||||
* Object flags
|
||||
* @param UINT objLock
|
||||
* Object lock flag
|
||||
*
|
||||
* @return
|
||||
* Handle if object is not locked by objFlags
|
||||
* Object if lock is set in objFlags
|
||||
* Handle if object is not locked by objLock
|
||||
* Object if lock is set in objLock
|
||||
* 0 if it fails.
|
||||
*
|
||||
* @remarks.
|
||||
|
@ -336,7 +336,7 @@ DdGetFreeHandle(UCHAR objType)
|
|||
*--*/
|
||||
HANDLE
|
||||
FASTCALL
|
||||
DdHmgAlloc(ULONG objSize, CHAR objType, UINT objFlags)
|
||||
DdHmgAlloc(ULONG objSize, CHAR objType, BOOLEAN objLock)
|
||||
{
|
||||
PVOID pObject = NULL;
|
||||
HANDLE DdHandle = NULL;
|
||||
|
@ -363,16 +363,17 @@ DdHmgAlloc(ULONG objSize, CHAR objType, UINT objFlags)
|
|||
|
||||
pEntry->Pid = (HANDLE)(((ULONG)PsGetCurrentProcessId() & 0xFFFFFFFC) | ((ULONG)(pEntry->Pid) & 1));
|
||||
|
||||
if (objFlags & 1)
|
||||
if (objLock)
|
||||
{
|
||||
InterlockedIncrement((VOID*)&pEntry->pobj->cExclusiveLock);
|
||||
pEntry->pobj->Tid = KeGetCurrentThread();
|
||||
|
||||
pEntry->pobj->cExclusiveLock = objFlags & 1;
|
||||
}
|
||||
pEntry->pobj->hHmgr = DdHandle;
|
||||
|
||||
EngReleaseSemaphore(ghsemHmgr);
|
||||
|
||||
/* Return handle if object not locked */
|
||||
if (!(objFlags & 1))
|
||||
if (!objLock)
|
||||
return DdHandle;
|
||||
|
||||
return (HANDLE)pEntry;
|
||||
|
|
|
@ -149,15 +149,6 @@ DxDdColorControl(
|
|||
return 0;
|
||||
}
|
||||
|
||||
DWORD
|
||||
NTAPI
|
||||
DxDdCreateDirectDrawObject(
|
||||
PVOID p1)
|
||||
{
|
||||
TRACE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
DWORD
|
||||
NTAPI
|
||||
DxDdCreateD3DBuffer(
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <initguid.h>
|
||||
#include <ddrawi.h>
|
||||
#include <ntgdityp.h>
|
||||
#include <psfuncs.h>
|
||||
|
||||
DEFINE_GUID(GUID_NTCallbacks, 0x6fe9ecde, 0xdf89, 0x11d1, 0x9d, 0xb0, 0x00, 0x60, 0x08, 0x27, 0x71, 0xba);
|
||||
DEFINE_GUID(GUID_DDMoreCaps, 0x880baf30, 0xb030, 0x11d0, 0x8e, 0xa7, 0x00, 0x60, 0x97, 0x97, 0xea, 0x5b);
|
||||
|
@ -52,8 +53,9 @@ typedef struct _DD_BASEOBJECT
|
|||
#define CapOver_DisableOGL 0x8
|
||||
#define CapOver_DisableEscapes 0x10
|
||||
|
||||
|
||||
#define ObjType_DDLOCAL_TYPE 1
|
||||
#define ObjType_DDSURFACE_TYPE 2
|
||||
#define ObjType_DDCONTEXT_TYPE 3
|
||||
#define ObjType_DDVIDEOPORT_TYPE 4
|
||||
#define ObjType_DDMOTIONCOMP_TYPE 5
|
||||
|
||||
|
@ -171,7 +173,8 @@ typedef struct _DXENG_FUNCTIONS
|
|||
NTSTATUS NTAPI DriverEntry(IN PVOID Context1, IN PVOID Context2);
|
||||
NTSTATUS NTAPI GsDriverEntry(IN PVOID Context1, IN PVOID Context2);
|
||||
NTSTATUS APIENTRY DxDdCleanupDxGraphics(VOID);
|
||||
BOOL NTAPI DxDdEnableDirectDraw(PVOID arg1, BOOL arg2);
|
||||
BOOL NTAPI DxDdEnableDirectDraw(HANDLE hDev, BOOL arg2);
|
||||
DWORD NTAPI DxDdCreateDirectDrawObject(HDC hDC);
|
||||
|
||||
/* Global pointers */
|
||||
extern ULONG gcSizeDdHmgr;
|
||||
|
@ -198,6 +201,7 @@ BOOL FASTCALL VerifyObjectOwner(PDD_ENTRY pEntry);
|
|||
BOOL FASTCALL DdHmgCreate(VOID);
|
||||
BOOL FASTCALL DdHmgDestroy(VOID);
|
||||
PVOID FASTCALL DdHmgLock(HANDLE DdHandle, UCHAR ObjectType, BOOLEAN LockOwned);
|
||||
HANDLE FASTCALL DdHmgAlloc(ULONG objSize, CHAR objType, BOOLEAN objLock);
|
||||
|
||||
|
||||
#endif /* _DXG_PCH_ */
|
||||
|
|
|
@ -68,6 +68,40 @@ BOOL intDdGetDriverInfo(PEDD_DIRECTDRAW_GLOBAL peDdGl, GUID guid, PVOID callback
|
|||
}
|
||||
|
||||
|
||||
PVOID
|
||||
FASTCALL
|
||||
intDdCreateDirectDrawLocal(HDEV hDev)
|
||||
{
|
||||
PEDD_DIRECTDRAW_GLOBAL peDdGl = NULL;
|
||||
PEDD_DIRECTDRAW_LOCAL peDdL = NULL;
|
||||
PDD_ENTRY AllocRet;
|
||||
|
||||
peDdGl = (PEDD_DIRECTDRAW_GLOBAL)gpEngFuncs.DxEngGetHdevData(hDev, DxEGShDevData_eddg);
|
||||
|
||||
AllocRet = DdHmgAlloc(sizeof(EDD_DIRECTDRAW_LOCAL), ObjType_DDLOCAL_TYPE, TRUE);
|
||||
if (!AllocRet)
|
||||
return NULL;
|
||||
|
||||
peDdL = (PEDD_DIRECTDRAW_LOCAL)AllocRet;
|
||||
|
||||
/* initialize DIRECTDRAW_LOCAL */
|
||||
peDdL->peDirectDrawLocal_prev = peDdGl->peDirectDrawLocalList;
|
||||
peDdL->UniqueProcess = PsGetCurrentThreadProcessId();
|
||||
peDdL->Process = PsGetCurrentProcess();
|
||||
|
||||
// link DirectDrawGlobal and DirectDrawLocal
|
||||
peDdGl->peDirectDrawLocalList = peDdL;
|
||||
peDdL->peDirectDrawGlobal = peDdGl;
|
||||
peDdL->peDirectDrawGlobal2 = peDdGl;
|
||||
|
||||
gpEngFuncs.DxEngReferenceHdev(hDev);
|
||||
|
||||
InterlockedExchangeAdd((LONG*)&peDdL->pobj.cExclusiveLock, 0xFFFFFFFF);
|
||||
|
||||
return peDdL->pobj.hHmgr;
|
||||
}
|
||||
|
||||
|
||||
PDD_SURFACE_LOCAL
|
||||
NTAPI
|
||||
DxDdLockDirectDrawSurface(HANDLE hDdSurface)
|
||||
|
@ -266,3 +300,56 @@ DxDdEnableDirectDraw(HANDLE hDev, BOOL arg2/*What for?*/)
|
|||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name DxDdCreateDirectDrawObject
|
||||
* @implemented
|
||||
*
|
||||
* Function creates new DirectDraw object
|
||||
*
|
||||
* @param HDC hDC
|
||||
* Device context handle
|
||||
*
|
||||
* @return
|
||||
* Newly created DirectDraw object handle.
|
||||
*
|
||||
* @remarks.
|
||||
* Missing all AGP stuff
|
||||
*--*/
|
||||
DWORD
|
||||
NTAPI
|
||||
DxDdCreateDirectDrawObject(
|
||||
HDC hDC)
|
||||
{
|
||||
PDC pDC = NULL;
|
||||
HDEV hDev = NULL;
|
||||
DWORD retVal = 0;
|
||||
|
||||
pDC = gpEngFuncs.DxEngLockDC(hDC);
|
||||
if (!pDC)
|
||||
return 0;
|
||||
|
||||
// get driver hDev from DC
|
||||
hDev = (HDEV)gpEngFuncs.DxEngGetDCState(hDC, 3);
|
||||
if (!hDev) {
|
||||
gpEngFuncs.DxEngUnlockDC(pDC);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// is this primary display?
|
||||
if (!gpEngFuncs.DxEngGetHdevData(hDev, DxEGShDevData_display))
|
||||
{
|
||||
gpEngFuncs.DxEngUnlockDC(pDC);
|
||||
return 0;
|
||||
}
|
||||
|
||||
gpEngFuncs.DxEngLockHdev(hDev);
|
||||
|
||||
// create object only for 8BPP and more
|
||||
if (gpEngFuncs.DxEngGetHdevData(hDev, DxEGShDevData_DitherFmt) >= BMF_8BPP)
|
||||
retVal = (DWORD)intDdCreateDirectDrawLocal(hDev);
|
||||
|
||||
gpEngFuncs.DxEngUnlockHdev(hDev);
|
||||
gpEngFuncs.DxEngUnlockDC(pDC);
|
||||
return retVal;
|
||||
}
|
||||
|
|
|
@ -912,10 +912,10 @@ void dump_edd_directdraw_local(PEDD_DIRECTDRAW_LOCAL pEddlcl)
|
|||
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->fl : 0x%08lx\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, fl), pEddlcl->fl);
|
||||
|
||||
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->peDirectDrawLocal_prev : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, peDirectDrawLocal_prev), pEddlcl->peDirectDrawLocal_prev);
|
||||
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->Process : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, Process), pEddlcl->Process);
|
||||
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_034 : 0x%08lx\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_034), pEddlcl->unk_034);
|
||||
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_038 : 0x%08lx\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_038), pEddlcl->unk_038);
|
||||
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->UniqueProcess : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, UniqueProcess), pEddlcl->UniqueProcess);
|
||||
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_040 : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_040), pEddlcl->unk_040);
|
||||
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->Process : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, Process), pEddlcl->Process);
|
||||
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_044 : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_044), pEddlcl->unk_044);
|
||||
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_048 : 0x%08lx\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_048), pEddlcl->unk_048);
|
||||
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_04C : 0x%08lx\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_04C), pEddlcl->unk_04C);
|
||||
|
|
Loading…
Reference in a new issue