2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Native driver for dxg implementation
5 * FILE: win32ss/reactx/dxg/eng.c
6 * PROGRAMER: Magnus olsen (magnus@greatlord.com)
7 * Sebastian Gasiorek (sebastian.gasiorek@reactos.org)
9 * 30/12-2007 Magnus Olsen
15 * @name intDdGetDriverInfo
18 * The function intDdGetDriverInfo is used internally in dxg.sys
19 * It retrieves driver information structures
21 * @param PEDD_DIRECTDRAW_GLOBAL peDdGl
22 * DirectDraw global structure
25 * GUID of InfoData to read
27 * @param PVOID callbackStruct
28 * Callback structure pointer
30 * @param ULONG callbackSize
31 * Size of allocated callback structure
33 * @param ULONG *returnSize
34 * Desired structure size returned by driver
37 * Returns true on successful execution, false when error.
40 * Only used internally in dxg.sys
42 BOOL
intDdGetDriverInfo(PEDD_DIRECTDRAW_GLOBAL peDdGl
, GUID guid
, PVOID callbackStruct
, ULONG callbackSize
, ULONG
*returnSize
)
44 DD_GETDRIVERINFODATA ddGetDriverInfoData
;
46 if (peDdGl
->ddHalInfo
.dwFlags
& DDHALINFO_GETDRIVERINFOSET
&& peDdGl
->ddHalInfo
.GetDriverInfo
)
48 memset(&ddGetDriverInfoData
, 0, sizeof(DD_GETDRIVERINFODATA
));
49 ddGetDriverInfoData
.dwSize
= sizeof(DD_GETDRIVERINFODATA
);
50 ddGetDriverInfoData
.dhpdev
= peDdGl
->dhpdev
;
51 memcpy(&ddGetDriverInfoData
.guidInfo
, &guid
, sizeof(GUID
));
52 ddGetDriverInfoData
.dwExpectedSize
= callbackSize
;
53 ddGetDriverInfoData
.lpvData
= callbackStruct
;
54 ddGetDriverInfoData
.ddRVal
= DDERR_CURRENTLYNOTAVAIL
;
55 if (peDdGl
->ddHalInfo
.GetDriverInfo(&ddGetDriverInfoData
) && !ddGetDriverInfoData
.ddRVal
)
58 *returnSize
= ddGetDriverInfoData
.dwActualSize
;
64 /* cleanup on error */
65 memset(callbackStruct
, 0, callbackSize
);
72 * @name intDdGetAllDriverInfo
75 * The function intDdGetAllDriverInfo is used internally in dxg.sys
76 * It retrieves all possible driver information structures
78 * @param PEDD_DIRECTDRAW_GLOBAL peDdGl
79 * Pointer to destination DirectDrawGlobal structure
82 * Only used internally in dxg.sys
83 * Missing some callbacks (VideoPort, DxApi, AGP)
85 VOID
intDdGetAllDriverInfo(PEDD_DIRECTDRAW_GLOBAL peDdGl
)
87 if (peDdGl
->ddHalInfo
.GetDriverInfo
&& peDdGl
->ddHalInfo
.dwFlags
& DDHALINFO_GETDRIVERINFOSET
)
89 intDdGetDriverInfo(peDdGl
, GUID_KernelCaps
, &peDdGl
->ddKernelCaps
, sizeof(peDdGl
->ddKernelCaps
), 0);
90 intDdGetDriverInfo(peDdGl
, GUID_KernelCallbacks
, &peDdGl
->ddKernelCallbacks
, sizeof(peDdGl
->ddKernelCallbacks
), 0);
92 if (intDdGetDriverInfo(peDdGl
, GUID_D3DCallbacks3
, &peDdGl
->d3dNtHalCallbacks3
, sizeof(peDdGl
->d3dNtHalCallbacks3
), 0))
93 peDdGl
->dwCallbackFlags
|= EDDDGBL_D3DCALLBACKS3
;
95 if (intDdGetDriverInfo(peDdGl
, GUID_ColorControlCallbacks
, &peDdGl
->ddColorControlCallbacks
, sizeof(peDdGl
->ddColorControlCallbacks
), 0))
96 peDdGl
->dwCallbackFlags
|= EDDDGBL_COLORCONTROLCALLBACKS
;
98 if (intDdGetDriverInfo(peDdGl
, GUID_MiscellaneousCallbacks
, &peDdGl
->ddMiscellanousCallbacks
, sizeof(peDdGl
->ddMiscellanousCallbacks
), 0))
99 peDdGl
->dwCallbackFlags
|= EDDDGBL_MISCCALLBACKS
;
101 if (intDdGetDriverInfo(peDdGl
, GUID_Miscellaneous2Callbacks
, &peDdGl
->ddMiscellanous2Callbacks
, sizeof(peDdGl
->ddMiscellanous2Callbacks
), 0))
102 peDdGl
->dwCallbackFlags
|= EDDDGBL_MISC2CALLBACKS
;
104 if (intDdGetDriverInfo(peDdGl
, GUID_NTCallbacks
, &peDdGl
->ddNtCallbacks
, sizeof(peDdGl
->ddNtCallbacks
), 0) )
105 peDdGl
->dwCallbackFlags
|= EDDDGBL_NTCALLBACKS
;
107 if (intDdGetDriverInfo(peDdGl
, GUID_DDMoreCaps
, &peDdGl
->ddMoreCaps
, sizeof(peDdGl
->ddMoreCaps
), 0) )
108 peDdGl
->dwCallbackFlags
|= EDDDGBL_DDMORECAPS
;
110 if (intDdGetDriverInfo(peDdGl
, GUID_NTPrivateDriverCaps
, &peDdGl
->ddNtPrivateDriverCaps
, sizeof(peDdGl
->ddNtPrivateDriverCaps
), 0) )
111 peDdGl
->dwCallbackFlags
|= EDDDGBL_PRIVATEDRIVERCAPS
;
113 if (intDdGetDriverInfo(peDdGl
, GUID_MotionCompCallbacks
, &peDdGl
->ddMotionCompCallbacks
, sizeof(peDdGl
->ddMotionCompCallbacks
), 0) )
114 peDdGl
->dwCallbackFlags
|= EDDDGBL_MOTIONCOMPCALLBACKS
;
119 * @name intDdEnableDriver
122 * The function intDdEnableDriver is used internally in dxg.sys
123 * Fills in all EDD_DIRECTDRAW_GLOBAL structures and enables DirectDraw acceleration when possible
125 * @param PEDD_DIRECTDRAW_GLOBAL peDdGl
126 * Pointer to destination DirectDrawGlobal structure
129 * Only used internally in dxg.sys
131 VOID
intDdEnableDriver(PEDD_DIRECTDRAW_GLOBAL peDdGl
)
133 PDRIVER_FUNCTIONS DriverFunctions
;
134 LPD3DNTHAL_GLOBALDRIVERDATA GlobalDriverData
;
135 LPD3DNTHAL_CALLBACKS HalCallbacks
;
136 PDD_D3DBUFCALLBACKS D3DBufCallbacks
;
139 gpEngFuncs
.DxEngLockHdev(peDdGl
->hDev
);
140 DriverFunctions
= (PDRIVER_FUNCTIONS
)gpEngFuncs
.DxEngGetHdevData(peDdGl
->hDev
, DxEGShDevData_DrvFuncs
);
142 // check if driver has DirectDraw functions
143 if ((!DriverFunctions
->GetDirectDrawInfo
)||(!DriverFunctions
->EnableDirectDraw
)||(!DriverFunctions
->DisableDirectDraw
))
147 // reset acceleration flag
148 peDdGl
->fl
= peDdGl
->fl
& 0xFFFFFFFE;
150 // ask for structure sizes
151 if ((peDdGl
->dhpdev
)&&(DriverFunctions
->GetDirectDrawInfo(peDdGl
->dhpdev
, &peDdGl
->ddHalInfo
, &peDdGl
->dwNumHeaps
, NULL
, &peDdGl
->dwNumFourCC
, NULL
)))
153 // allocate memory for DX data
154 if (peDdGl
->dwNumHeaps
)
155 peDdGl
->pvmList
= EngAllocMem(FL_ZERO_MEMORY
, peDdGl
->dwNumHeaps
*sizeof(VIDEOMEMORY
), TAG_GDDV
);
156 if (peDdGl
->dwNumFourCC
)
157 peDdGl
->pdwFourCC
= EngAllocMem(FL_ZERO_MEMORY
, peDdGl
->dwNumFourCC
* 4, TAG_GDDF
);
159 // get data from driver
160 if (!DriverFunctions
->GetDirectDrawInfo(peDdGl
->dhpdev
, &peDdGl
->ddHalInfo
, &peDdGl
->dwNumHeaps
, peDdGl
->pvmList
, &peDdGl
->dwNumFourCC
, peDdGl
->pdwFourCC
))
162 // failed - cleanup and exit
164 EngFreeMem(peDdGl
->pvmList
);
165 if (peDdGl
->pdwFourCC
)
166 EngFreeMem(peDdGl
->pdwFourCC
);
167 gpEngFuncs
.DxEngUnlockHdev(peDdGl
->hDev
);
171 // check if we can enable DirectDraw acceleration
172 if ((peDdGl
->ddHalInfo
.vmiData
.pvPrimary
) &&
173 (DriverFunctions
->EnableDirectDraw(peDdGl
->dhpdev
, &peDdGl
->ddCallbacks
, &peDdGl
->ddSurfaceCallbacks
, &peDdGl
->ddPaletteCallbacks
))&&
174 !(gpEngFuncs
.DxEngGetHdevData(peDdGl
->hDev
, DxEGShDevData_dd_flags
) & CapOver_DisableD3DAccel
)&&
175 (peDdGl
->ddHalInfo
.dwSize
== sizeof(DD_HALINFO
)))
177 GlobalDriverData
= peDdGl
->ddHalInfo
.lpD3DGlobalDriverData
;
178 HalCallbacks
= peDdGl
->ddHalInfo
.lpD3DHALCallbacks
;
179 D3DBufCallbacks
= peDdGl
->ddHalInfo
.lpD3DHALCallbacks
;
181 if (GlobalDriverData
&& GlobalDriverData
->dwSize
== sizeof(D3DNTHAL_GLOBALDRIVERDATA
))
182 memcpy(&peDdGl
->d3dNtGlobalDriverData
, GlobalDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
184 if (HalCallbacks
&& HalCallbacks
->dwSize
== sizeof(D3DNTHAL_CALLBACKS
))
185 memcpy(&peDdGl
->d3dNtHalCallbacks
, HalCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
187 if (D3DBufCallbacks
&& D3DBufCallbacks
->dwSize
== sizeof(DD_D3DBUFCALLBACKS
))
188 memcpy(&peDdGl
->d3dBufCallbacks
, D3DBufCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
190 intDdGetAllDriverInfo(peDdGl
);
192 // enable DirectDraw acceleration
197 // failed - cleanup and exit
199 EngFreeMem(peDdGl
->pvmList
);
200 if (peDdGl
->pdwFourCC
)
201 EngFreeMem(peDdGl
->pdwFourCC
);
205 gpEngFuncs
.DxEngUnlockHdev(peDdGl
->hDev
);
210 intDdCreateDirectDrawLocal(HDEV hDev
)
212 PEDD_DIRECTDRAW_GLOBAL peDdGl
= NULL
;
213 PEDD_DIRECTDRAW_LOCAL peDdL
= NULL
;
216 peDdGl
= (PEDD_DIRECTDRAW_GLOBAL
)gpEngFuncs
.DxEngGetHdevData(hDev
, DxEGShDevData_eddg
);
218 AllocRet
= DdHmgAlloc(sizeof(EDD_DIRECTDRAW_LOCAL
), ObjType_DDLOCAL_TYPE
, TRUE
);
222 peDdL
= (PEDD_DIRECTDRAW_LOCAL
)AllocRet
->pobj
;
224 /* initialize DIRECTDRAW_LOCAL */
225 peDdL
->peDirectDrawLocal_prev
= peDdGl
->peDirectDrawLocalList
;
226 peDdL
->hCreatorProcess
= PsGetCurrentThreadProcessId();
227 peDdL
->Process
= PsGetCurrentProcess();
229 // link DirectDrawGlobal and DirectDrawLocal
230 peDdGl
->peDirectDrawLocalList
= peDdL
;
231 peDdL
->peDirectDrawGlobal
= peDdGl
;
232 peDdL
->peDirectDrawGlobal2
= peDdGl
;
234 gpEngFuncs
.DxEngReferenceHdev(hDev
);
236 InterlockedDecrement((VOID
*)&peDdL
->pobj
.cExclusiveLock
);
238 return peDdL
->pobj
.hHmgr
;
242 * @name DxDdCreateDirectDrawObject
245 * Function creates new DirectDraw object
248 * Device context handle
251 * Newly created DirectDraw object handle.
254 * Missing all AGP stuff
258 DxDdCreateDirectDrawObject(
265 pDC
= gpEngFuncs
.DxEngLockDC(hDC
);
269 // get driver hDev from DC
270 hDev
= (HDEV
)gpEngFuncs
.DxEngGetDCState(hDC
, 3);
272 gpEngFuncs
.DxEngUnlockDC(pDC
);
276 // is this primary display?
277 if (!gpEngFuncs
.DxEngGetHdevData(hDev
, DxEGShDevData_display
))
279 gpEngFuncs
.DxEngUnlockDC(pDC
);
283 gpEngFuncs
.DxEngLockHdev(hDev
);
285 // create object only for 8BPP and more
286 if (gpEngFuncs
.DxEngGetHdevData(hDev
, DxEGShDevData_DitherFmt
) >= BMF_8BPP
)
287 retVal
= (DWORD
)intDdCreateDirectDrawLocal(hDev
);
289 gpEngFuncs
.DxEngUnlockHdev(hDev
);
290 gpEngFuncs
.DxEngUnlockDC(pDC
);
296 * @name DxDdGetDriverInfo
299 * Function queries the driver for DirectDraw and Direct3D functionality
301 * @param HANDLE DdHandle
302 * Handle to DirectDraw object
304 * @param PDD_GETDRIVERINFODATA drvInfoData
305 * Pointer to in/out driver info data structure
309 DxDdGetDriverInfo(HANDLE DdHandle
, PDD_GETDRIVERINFODATA drvInfoData
)
311 PEDD_DIRECTDRAW_LOCAL peDdL
;
312 PEDD_DIRECTDRAW_GLOBAL peDdGl
;
314 DWORD dwInfoSize
= 0;
315 BYTE callbackStruct
[1024];
316 DWORD RetVal
= FALSE
;
318 peDdL
= (PEDD_DIRECTDRAW_LOCAL
)DdHmgLock(DdHandle
, ObjType_DDLOCAL_TYPE
, FALSE
);
322 peDdGl
= peDdL
->peDirectDrawGlobal2
;
324 // check VideoPort related callbacks
325 if (peDdGl
->dwCallbackFlags
& EDDDGBL_VIDEOPORTCALLBACKS
)
327 if (InlineIsEqualGUID(&drvInfoData
->guidInfo
, &GUID_VideoPortCallbacks
))
329 dwInfoSize
= sizeof(DD_VIDEOPORTCALLBACKS
);
330 pInfo
= (VOID
*)&peDdGl
->ddVideoPortCallback
;
332 if (InlineIsEqualGUID(&drvInfoData
->guidInfo
, &GUID_VideoPortCaps
))
334 pInfo
= (VOID
*)peDdGl
->lpDDVideoPortCaps
;
335 dwInfoSize
= 72 * peDdGl
->ddHalInfo
.ddCaps
.dwMaxVideoPorts
;
337 if (InlineIsEqualGUID(&drvInfoData
->guidInfo
, &GUID_D3DCallbacks3
))
339 dwInfoSize
= sizeof(D3DNTHAL_CALLBACKS3
);
340 pInfo
= (VOID
*)&peDdGl
->d3dNtHalCallbacks3
;
344 // check ColorControl related callbacks
345 if (peDdGl
->dwCallbackFlags
& EDDDGBL_COLORCONTROLCALLBACKS
)
347 if (InlineIsEqualGUID(&drvInfoData
->guidInfo
, &GUID_ColorControlCallbacks
))
349 dwInfoSize
= sizeof(DD_COLORCONTROLCALLBACKS
);
350 pInfo
= (VOID
*)&peDdGl
->ddColorControlCallbacks
;
352 if (InlineIsEqualGUID(&drvInfoData
->guidInfo
, &GUID_NTCallbacks
))
354 dwInfoSize
= sizeof(DD_NTCALLBACKS
);
355 pInfo
= (VOID
*)&peDdGl
->ddNtCallbacks
;
359 // check Miscellaneous callbacks
360 if (peDdGl
->dwCallbackFlags
& EDDDGBL_MISCCALLBACKS
)
362 if (InlineIsEqualGUID(&drvInfoData
->guidInfo
, &GUID_MiscellaneousCallbacks
))
364 dwInfoSize
= sizeof(DD_MISCELLANEOUSCALLBACKS
);
365 pInfo
= (VOID
*)&peDdGl
->ddMiscellanousCallbacks
;
367 if (InlineIsEqualGUID(&drvInfoData
->guidInfo
, &GUID_DDMoreCaps
))
369 dwInfoSize
= sizeof(DD_MORECAPS
);
370 pInfo
= &peDdGl
->ddMoreCaps
;
374 if (peDdGl
->dwCallbackFlags
& EDDDGBL_MISC2CALLBACKS
&&
375 InlineIsEqualGUID(&drvInfoData
->guidInfo
, &GUID_Miscellaneous2Callbacks
))
377 dwInfoSize
= sizeof(DD_MISCELLANEOUS2CALLBACKS
);
378 pInfo
= (VOID
*)&peDdGl
->ddMiscellanous2Callbacks
;
381 if (peDdGl
->dwCallbackFlags
& EDDDGBL_MOTIONCOMPCALLBACKS
&&
382 InlineIsEqualGUID(&drvInfoData
->guidInfo
, &GUID_MotionCompCallbacks
))
384 dwInfoSize
= sizeof(DD_MOTIONCOMPCALLBACKS
);
385 pInfo
= (VOID
*)&peDdGl
->ddMotionCompCallbacks
;
388 if (InlineIsEqualGUID(&drvInfoData
->guidInfo
, &GUID_KernelCaps
) )
390 dwInfoSize
= sizeof(DD_KERNELCALLBACKS
);
391 pInfo
= &peDdGl
->ddKernelCaps
;
394 if (InlineIsEqualGUID(&drvInfoData
->guidInfo
, &GUID_DDMoreSurfaceCaps
))
396 dwInfoSize
= sizeof(DDMORESURFACECAPS
);
397 pInfo
= &peDdGl
->ddMoreSurfaceCaps
;
400 if (dwInfoSize
&& pInfo
)
402 gpEngFuncs
.DxEngLockHdev(peDdGl
->hDev
);
403 intDdGetDriverInfo(peDdGl
, drvInfoData
->guidInfo
, &callbackStruct
, dwInfoSize
, &dwInfoSize
);
404 gpEngFuncs
.DxEngUnlockHdev(peDdGl
->hDev
);
405 memcpy(drvInfoData
->lpvData
, callbackStruct
, dwInfoSize
);
408 InterlockedDecrement((VOID
*)&peDdL
->pobj
.cExclusiveLock
);
414 * @name DxDdQueryDirectDrawObject
417 * Function queries the DirectDraw object for its functionality
424 DxDdQueryDirectDrawObject(
426 DD_HALINFO
* pDdHalInfo
,
427 DWORD
* pCallBackFlags
,
428 LPD3DNTHAL_CALLBACKS pd3dNtHalCallbacks
,
429 LPD3DNTHAL_GLOBALDRIVERDATA pd3dNtGlobalDriverData
,
430 PDD_D3DBUFCALLBACKS pd3dBufCallbacks
,
431 LPDDSURFACEDESC pTextureFormats
,
437 PEDD_DIRECTDRAW_LOCAL peDdL
;
438 PEDD_DIRECTDRAW_GLOBAL peDdGl
;
447 if (!gpEngFuncs
.DxEngScreenAccessCheck())
450 peDdL
= (PEDD_DIRECTDRAW_LOCAL
)DdHmgLock(DdHandle
, ObjType_DDLOCAL_TYPE
, FALSE
);
453 peDdGl
= peDdL
->peDirectDrawGlobal2
;
454 gpEngFuncs
.DxEngLockHdev(peDdGl
->hDev
);
456 memcpy(pDdHalInfo
, &peDdGl
->ddHalInfo
, sizeof(DD_HALINFO
));
460 *(DWORD
*)pCallBackFlags
= peDdGl
->ddCallbacks
.dwFlags
;
461 *(DWORD
*)((ULONG
)pCallBackFlags
+ 4) = peDdGl
->ddSurfaceCallbacks
.dwFlags
;
462 *(DWORD
*)((ULONG
)pCallBackFlags
+ 8) = peDdGl
->ddPaletteCallbacks
.dwFlags
;
465 if (pd3dNtHalCallbacks
)
466 memcpy(pd3dNtHalCallbacks
, &peDdGl
->d3dNtHalCallbacks
, sizeof(peDdGl
->d3dNtHalCallbacks
));
468 if (pd3dNtGlobalDriverData
)
469 memcpy(pd3dNtGlobalDriverData
, &peDdGl
->d3dNtGlobalDriverData
, sizeof(peDdGl
->d3dNtGlobalDriverData
));
471 if (pd3dBufCallbacks
)
472 memcpy(pd3dBufCallbacks
, &peDdGl
->d3dBufCallbacks
, sizeof(peDdGl
->d3dBufCallbacks
));
475 memcpy(pTextureFormats
, &peDdGl
->d3dNtGlobalDriverData
.lpTextureFormats
, peDdGl
->d3dNtGlobalDriverData
.dwNumTextureFormats
* sizeof(DDSURFACEDESC2
));
478 *pdwNumFourCC
= peDdGl
->dwNumFourCC
;
481 memcpy(pdwFourCC
, &peDdGl
->pdwFourCC
, 4 * peDdGl
->dwNumFourCC
);
485 gpEngFuncs
.DxEngUnlockHdev(peDdGl
->hDev
);
487 InterlockedDecrement((VOID
*)&peDdL
->pobj
.cExclusiveLock
);
494 * @name DxDdEnableDirectDraw
497 * Function enables DirectDraw
499 * @param PEDD_DIRECTDRAW_GLOBAL peDdGl
500 * Pointer to destination DirectDrawGlobal structure
504 DxDdEnableDirectDraw(HANDLE hDev
, BOOL arg2
/*What for?*/)
506 PEDD_DIRECTDRAW_GLOBAL peDdGl
= NULL
;
508 if (gpEngFuncs
.DxEngGetHdevData(hDev
, DxEGShDevData_display
))
510 peDdGl
= (PEDD_DIRECTDRAW_GLOBAL
)gpEngFuncs
.DxEngGetHdevData(hDev
, DxEGShDevData_eddg
);
512 peDdGl
->bSuspended
= FALSE
;
513 peDdGl
->dhpdev
= (PVOID
)gpEngFuncs
.DxEngGetHdevData(hDev
, DxEGShDevData_dhpdev
);
514 intDdEnableDriver(peDdGl
);
522 * @name DxDdReenableDirectDrawObject
525 * Function re-enables DirectDraw object after mode switch
527 * @param HANDLE DdHandle
528 * DirectDraw object handle
537 * Missing all AGP stuff and second parameter handling
541 DxDdReenableDirectDrawObject(
545 PEDD_DIRECTDRAW_LOCAL peDdL
;
546 PEDD_DIRECTDRAW_GLOBAL peDdGl
;
548 DWORD RetVal
= FALSE
;
550 peDdL
= (PEDD_DIRECTDRAW_LOCAL
)DdHmgLock(DdHandle
, ObjType_DDLOCAL_TYPE
, FALSE
);
555 peDdGl
= peDdL
->peDirectDrawGlobal2
;
557 hDC
= gpEngFuncs
.DxEngGetDesktopDC(0, FALSE
, FALSE
);
559 gpEngFuncs
.DxEngLockShareSem();
560 gpEngFuncs
.DxEngLockHdev(peDdGl
->hDev
);
562 if (peDdGl
->fl
& 1 &&
563 gpEngFuncs
.DxEngGetDCState(hDC
, 2) != 1 &&
564 !(gpEngFuncs
.DxEngGetHdevData(peDdGl
->hDev
, DxEGShDevData_OpenRefs
)) &&
565 !(gpEngFuncs
.DxEngGetHdevData(peDdGl
->hDev
, DxEGShDevData_disable
)) &&
566 !(gpEngFuncs
.DxEngGetHdevData(peDdGl
->hDev
, DxEGShDevData_dd_nCount
)) &&
567 gpEngFuncs
.DxEngGetHdevData(peDdGl
->hDev
, DxEGShDevData_DitherFmt
) >= BMF_8BPP
)
569 // reset acceleration and suspend flags
570 peDdGl
->fl
&= 0xFFFFFFFD;
571 peDdGl
->bSuspended
= 0;
577 gpEngFuncs
.DxEngUnlockHdev(peDdGl
->hDev
);
578 gpEngFuncs
.DxEngUnlockShareSem();
580 InterlockedDecrement((VOID
*)&peDdL
->pobj
.cExclusiveLock
);
587 intDdCreateNewSurfaceObject(PEDD_DIRECTDRAW_LOCAL peDdL
, HANDLE hDirectDrawLocal
, PDD_SURFACE_GLOBAL pDdSurfGlob
, PDD_SURFACE_LOCAL pDdSurfLoc
, PDD_SURFACE_MORE pDdSurfMore
)
589 PEDD_SURFACE pSurface
= NULL
;
591 // first check if we can assign it from current ddHandle
592 if (hDirectDrawLocal
)
594 pSurface
= (PEDD_SURFACE
)DdHmgLock(hDirectDrawLocal
, ObjType_DDSURFACE_TYPE
, FALSE
);
595 // check if surface is locked and belongs to correct DirectDrawLocal
596 if ((pSurface
)&&((pSurface
->peDirectDrawLocal
!= peDdL
)||(!pSurface
->hSecure
)))
598 InterlockedDecrement((VOID
*)&peDdL
->pobj
.cExclusiveLock
);
603 // if surface not found from ddHandle or ddHandle not provided
606 // create new surface object
607 pSurface
= (PEDD_SURFACE
)DdHmgAlloc(sizeof(EDD_SURFACE
), ObjType_DDSURFACE_TYPE
, TRUE
);
610 pSurface
->ddsSurfaceLocal
.lpGbl
= &pSurface
->ddsSurfaceGlobal
;
611 pSurface
->ddsSurfaceLocal
.lpSurfMore
= &pSurface
->ddsSurfaceMore
;
612 pSurface
->ddsSurfaceInt
.lpLcl
= &pSurface
->ddsSurfaceLocal
;
613 pSurface
->peDirectDrawLocal
= peDdL
;
614 pSurface
->peDirectDrawGlobalNext
= peDdL
->peDirectDrawGlobal2
;
615 pSurface
->ldev
= gpEngFuncs
.DxEngGetHdevData(pSurface
->peDirectDrawGlobalNext
->hDev
, DxEGShDevData_ldev
);
616 pSurface
->gdev
= gpEngFuncs
.DxEngGetHdevData(pSurface
->peDirectDrawGlobalNext
->hDev
, DxEGShDevData_GDev
);
617 pSurface
->hSecure
= (VOID
*)1;
623 pSurface
->ddsSurfaceGlobal
.fpVidMem
= pDdSurfGlob
->fpVidMem
;
624 pSurface
->ddsSurfaceGlobal
.lPitch
= pDdSurfGlob
->lPitch
;
625 pSurface
->ddsSurfaceGlobal
.wWidth
= pDdSurfGlob
->wWidth
;
626 pSurface
->ddsSurfaceGlobal
.wHeight
= pDdSurfGlob
->wHeight
;
627 pSurface
->wWidth
= pDdSurfGlob
->wWidth
;
628 pSurface
->wHeight
= pDdSurfGlob
->wHeight
;
629 memcpy(&pSurface
->ddsSurfaceGlobal
.ddpfSurface
, &pDdSurfGlob
->ddpfSurface
, sizeof(pSurface
->ddsSurfaceGlobal
.ddpfSurface
));
630 pSurface
->ddsSurfaceLocal
.ddsCaps
.dwCaps
= pDdSurfLoc
->ddsCaps
.dwCaps
;
631 pSurface
->ddsSurfaceMore
.ddsCapsEx
.dwCaps2
= pDdSurfMore
->ddsCapsEx
.dwCaps2
;
632 pSurface
->ddsSurfaceMore
.ddsCapsEx
.dwCaps3
= pDdSurfMore
->ddsCapsEx
.dwCaps3
;
633 pSurface
->ddsSurfaceMore
.ddsCapsEx
.dwCaps4
= pDdSurfMore
->ddsCapsEx
.dwCaps4
;
634 pSurface
->ddsSurfaceMore
.dwSurfaceHandle
= pDdSurfMore
->dwSurfaceHandle
;
635 pSurface
->hSecure
= (VOID
*)1;
637 peDdL
->peSurface_DdList
= pSurface
;
638 peDdL
->hSurface
= (ULONG
)pSurface
->pobj
.hHmgr
;
646 DxDdCreateSurfaceObject(HANDLE hDirectDrawLocal
,
648 PDD_SURFACE_LOCAL puSurfaceLocal
,
649 PDD_SURFACE_MORE puSurfaceMore
,
650 PDD_SURFACE_GLOBAL puSurfaceGlobal
,
653 HANDLE RetVal
= FALSE
;
654 PEDD_DIRECTDRAW_LOCAL peDdL
= NULL
;
655 PEDD_SURFACE pDdSurface
= NULL
;
657 peDdL
= (PEDD_DIRECTDRAW_LOCAL
)DdHmgLock(hDirectDrawLocal
, ObjType_DDLOCAL_TYPE
, FALSE
);
662 pDdSurface
= intDdCreateNewSurfaceObject(peDdL
, hSurface
, puSurfaceGlobal
, puSurfaceLocal
, puSurfaceMore
);
665 InterlockedDecrement((VOID
*)&peDdL
->pobj
.cExclusiveLock
);
669 RetVal
= pDdSurface
->pobj
.hHmgr
;
671 InterlockedDecrement((VOID
*)&pDdSurface
->pobj
.cExclusiveLock
);
672 InterlockedDecrement((VOID
*)&peDdL
->pobj
.cExclusiveLock
);