* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* PURPOSE: Support for physical devices
- * FILE: subsystems/win32/win32k/eng/pdevobj.c
+ * FILE: win32ss/gdi/eng/pdevobj.c
* PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org)
*/
INIT_FUNCTION
NTSTATUS
NTAPI
-InitPDEVImpl()
+InitPDEVImpl(VOID)
{
ghsemPDEV = EngCreateSemaphore();
if (!ghsemPDEV) return STATUS_INSUFFICIENT_RESOURCES;
#endif
PPDEVOBJ
-PDEVOBJ_AllocPDEV()
+PDEVOBJ_AllocPDEV(VOID)
{
PPDEVOBJ ppdev;
RtlZeroMemory(ppdev, sizeof(PDEVOBJ));
+ ppdev->hsemDevLock = EngCreateSemaphore();
+ if (ppdev->hsemDevLock == NULL)
+ {
+ ExFreePoolWithTag(ppdev, GDITAG_PDEV);
+ return NULL;
+ }
+
+ /* Allocate EDD_DIRECTDRAW_GLOBAL for our ReactX driver */
+ ppdev->pEDDgpl = ExAllocatePoolWithTag(PagedPool, sizeof(EDD_DIRECTDRAW_GLOBAL), GDITAG_PDEV);
+ if (ppdev->pEDDgpl)
+ RtlZeroMemory(ppdev->pEDDgpl, sizeof(EDD_DIRECTDRAW_GLOBAL));
+
ppdev->cPdevRefs = 1;
return ppdev;
}
+static
+VOID
+PDEVOBJ_vDeletePDEV(
+ PPDEVOBJ ppdev)
+{
+ EngDeleteSemaphore(ppdev->hsemDevLock);
+ if (ppdev->pEDDgpl)
+ ExFreePoolWithTag(ppdev->pEDDgpl, GDITAG_PDEV);
+ ExFreePoolWithTag(ppdev, GDITAG_PDEV);
+}
+
VOID
NTAPI
PDEVOBJ_vRelease(PPDEVOBJ ppdev)
gppdevPrimary = NULL;
/* Free it */
- ExFreePoolWithTag(ppdev, GDITAG_PDEV );
+ PDEVOBJ_vDeletePDEV(ppdev);
}
/* Unlock loader */
{
/* Call the drivers DrvEnableSurface */
hsurf = ppdev->pldev->pfn.EnableSurface(ppdev->dhpdev);
+ if (hsurf== NULL)
+ {
+ DPRINT1("Failed to create PDEV surface!\n");
+ return NULL;
+ }
/* Get a reference to the surface */
ppdev->pSurface = SURFACE_ShareLockSurface(hsurf);
+ NT_ASSERT(ppdev->pSurface != NULL);
}
/* Increment reference count */
return ppdev->pSurface;
}
+VOID
+NTAPI
+PDEVOBJ_vRefreshModeList(
+ PPDEVOBJ ppdev)
+{
+ PGRAPHICS_DEVICE pGraphicsDevice;
+ PDEVMODEINFO pdminfo, pdmiNext;
+ DEVMODEW dmDefault;
+
+ /* Lock the PDEV */
+ EngAcquireSemaphore(ppdev->hsemDevLock);
+
+ pGraphicsDevice = ppdev->pGraphicsDevice;
+
+ /* Remember our default mode */
+ dmDefault = *pGraphicsDevice->pDevModeList[pGraphicsDevice->iDefaultMode].pdm;
+
+ /* Clear out the modes */
+ for (pdminfo = pGraphicsDevice->pdevmodeInfo;
+ pdminfo;
+ pdminfo = pdmiNext)
+ {
+ pdmiNext = pdminfo->pdmiNext;
+ ExFreePoolWithTag(pdminfo, GDITAG_DEVMODE);
+ }
+ pGraphicsDevice->pdevmodeInfo = NULL;
+ ExFreePoolWithTag(pGraphicsDevice->pDevModeList, GDITAG_GDEVICE);
+ pGraphicsDevice->pDevModeList = NULL;
+
+ /* Now re-populate the list */
+ if (!EngpPopulateDeviceModeList(pGraphicsDevice, &dmDefault))
+ {
+ DPRINT1("FIXME: EngpPopulateDeviceModeList failed, we just destroyed a perfectly good mode list\n");
+ }
+
+ ppdev->pdmwDev = pGraphicsDevice->pDevModeList[pGraphicsDevice->iCurrentMode].pdm;
+
+ /* Unlock PDEV */
+ EngReleaseSemaphore(ppdev->hsemDevLock);
+}
+
PDEVMODEW
NTAPI
PDEVOBJ_pdmMatchDevMode(
DPRINT1("Could not load display driver '%ls', '%ls'\n",
pGraphicsDevice->pDiplayDrivers,
pdm->dmDeviceName);
- ExFreePoolWithTag(ppdev, GDITAG_PDEV);
+ PDEVOBJ_vRelease(ppdev);
return NULL;
}
ppdev->pfnMovePointer = EngMovePointer;
ppdev->pGraphicsDevice = pGraphicsDevice;
- ppdev->hsemDevLock = EngCreateSemaphore();
+
+ // DxEngGetHdevData asks for Graphics DeviceObject in hSpooler field
+ ppdev->hSpooler = ppdev->pGraphicsDevice->DeviceObject;
+
// Should we change the ative mode of pGraphicsDevice ?
ppdev->pdmwDev = PDEVOBJ_pdmMatchDevMode(ppdev, pdm) ;
pSurface = PDEVOBJ_pSurface(ppdevTmp);
if (!pSurface)
{
- DPRINT1("DrvEnableSurface failed\n");
+ DPRINT1("PDEVOBJ_pSurface failed\n");
goto leave;
}