mirror of
https://github.com/reactos/reactos.git
synced 2025-06-01 07:28:19 +00:00
[WIN32K]
Implement releasing PDEVOBJs svn path=/branches/reactos-yarotows/; revision=46572
This commit is contained in:
parent
1541aa6f43
commit
2bfb2d80b4
1 changed files with 47 additions and 22 deletions
|
@ -34,9 +34,9 @@ PDEVOBJ_AllocPDEV()
|
||||||
ppdev = ExAllocatePoolWithTag(PagedPool, sizeof(PDEVOBJ), GDITAG_PDEV);
|
ppdev = ExAllocatePoolWithTag(PagedPool, sizeof(PDEVOBJ), GDITAG_PDEV);
|
||||||
if (!ppdev)
|
if (!ppdev)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
RtlZeroMemory(ppdev, sizeof(PDEVOBJ));
|
RtlZeroMemory(ppdev, sizeof(PDEVOBJ));
|
||||||
|
|
||||||
ppdev->cPdevRefs = 1;
|
ppdev->cPdevRefs = 1;
|
||||||
|
|
||||||
return ppdev;
|
return ppdev;
|
||||||
|
@ -51,13 +51,44 @@ PDEVOBJ_vRelease(PPDEVOBJ ppdev)
|
||||||
|
|
||||||
/* Decrease reference count */
|
/* Decrease reference count */
|
||||||
--ppdev->cPdevRefs;
|
--ppdev->cPdevRefs;
|
||||||
|
|
||||||
/* Check if references are left */
|
/* Check if references are left */
|
||||||
if (ppdev->cPdevRefs == 0)
|
if (ppdev->cPdevRefs == 0)
|
||||||
{
|
{
|
||||||
// FIXME: should delete the PDEV now
|
/* Release surface */
|
||||||
UNIMPLEMENTED;
|
if(ppdev->pSurface)
|
||||||
ASSERT(FALSE);
|
{
|
||||||
|
SURFACE_ShareUnlockSurface(ppdev->pSurface);
|
||||||
|
ppdev->pfn.DisableSurface(ppdev->dhpdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable PDEV */
|
||||||
|
ppdev->pfn.DisablePDEV(ppdev->dhpdev);
|
||||||
|
|
||||||
|
/* Remove it from list */
|
||||||
|
if( ppdev == gppdevList )
|
||||||
|
gppdevList = ppdev->ppdevNext ;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PPDEVOBJ ppdevCurrent = gppdevList;
|
||||||
|
BOOL found = FALSE ;
|
||||||
|
while (!found && ppdevCurrent->ppdevNext)
|
||||||
|
{
|
||||||
|
if (ppdevCurrent->ppdevNext == ppdev)
|
||||||
|
found = TRUE;
|
||||||
|
else
|
||||||
|
ppdevCurrent = ppdevCurrent->ppdevNext ;
|
||||||
|
}
|
||||||
|
if(found)
|
||||||
|
ppdevCurrent->ppdevNext = ppdev->ppdevNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Is this the primary one ? */
|
||||||
|
if (ppdev == gppdevPrimary)
|
||||||
|
gppdevPrimary = NULL;
|
||||||
|
|
||||||
|
/* Free it */
|
||||||
|
ExFreePoolWithTag(ppdev, GDITAG_PDEV );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unlock loader */
|
/* Unlock loader */
|
||||||
|
@ -179,7 +210,7 @@ EngpCreatePDEV(
|
||||||
pGraphicsDevice = EngpFindGraphicsDevice(pustrDeviceName, 0, 0);
|
pGraphicsDevice = EngpFindGraphicsDevice(pustrDeviceName, 0, 0);
|
||||||
if (!pGraphicsDevice)
|
if (!pGraphicsDevice)
|
||||||
{
|
{
|
||||||
DPRINT1("No GRAPHICS_DEVICE found for %ls!\n",
|
DPRINT1("No GRAPHICS_DEVICE found for %ls!\n",
|
||||||
pustrDeviceName ? pustrDeviceName->Buffer : 0);
|
pustrDeviceName ? pustrDeviceName->Buffer : 0);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -267,7 +298,7 @@ PDEVOBJ_vSwitchPdev(
|
||||||
ppdev->pfn = ppdev2->pfn;
|
ppdev->pfn = ppdev2->pfn;
|
||||||
ppdev2->pfn = pdevTmp.pfn;
|
ppdev2->pfn = pdevTmp.pfn;
|
||||||
|
|
||||||
/* Exchange LDEVs */
|
/* Exchange LDEVs */
|
||||||
ppdev->pldev = ppdev2->pldev;
|
ppdev->pldev = ppdev2->pldev;
|
||||||
ppdev2->pldev = pdevTmp.pldev;
|
ppdev2->pldev = pdevTmp.pldev;
|
||||||
|
|
||||||
|
@ -291,8 +322,8 @@ PDEVOBJ_vSwitchPdev(
|
||||||
ppdev2->gdiinfo = pdevTmp.gdiinfo;
|
ppdev2->gdiinfo = pdevTmp.gdiinfo;
|
||||||
|
|
||||||
/* Notify each driver instance of its new HDEV association */
|
/* Notify each driver instance of its new HDEV association */
|
||||||
ppdev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev);
|
ppdev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev);
|
||||||
ppdev2->pfn.CompletePDEV(ppdev2->dhpdev, (HDEV)ppdev2);
|
ppdev2->pfn.CompletePDEV(ppdev2->dhpdev, (HDEV)ppdev2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -338,11 +369,10 @@ PDEVOBJ_bSwitchMode(
|
||||||
PSURFACE pSurface;
|
PSURFACE pSurface;
|
||||||
BOOL retval = FALSE;
|
BOOL retval = FALSE;
|
||||||
|
|
||||||
// FIXME: dynamic mode switching is broken, need to fix PDEV locking first!
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/* Lock the PDEV */
|
/* Lock the PDEV */
|
||||||
EngAcquireSemaphore(ppdev->hsemDevLock);
|
EngAcquireSemaphore(ppdev->hsemDevLock);
|
||||||
|
/* And everything else */
|
||||||
|
EngAcquireSemaphore(ghsemPDEV);
|
||||||
|
|
||||||
DPRINT1("PDEVOBJ_bSwitchMode, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface);
|
DPRINT1("PDEVOBJ_bSwitchMode, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface);
|
||||||
|
|
||||||
|
@ -385,19 +415,14 @@ PDEVOBJ_bSwitchMode(
|
||||||
|
|
||||||
/* 8. Disable DirectDraw */
|
/* 8. Disable DirectDraw */
|
||||||
|
|
||||||
/* 9. Disable old surface */
|
PDEVOBJ_vRelease(ppdevTmp);
|
||||||
SURFACE_ShareUnlockSurface(ppdevTmp->pSurface);
|
|
||||||
ppdevTmp->pfn.DisableSurface(ppdevTmp->dhpdev);
|
|
||||||
|
|
||||||
/* 10. Disable old PDEV */
|
|
||||||
ppdevTmp->pfn.DisablePDEV(ppdevTmp->dhpdev);
|
|
||||||
// PDEVOBJ_vReleasePdev(ppdevTmp);
|
|
||||||
|
|
||||||
/* Success! */
|
/* Success! */
|
||||||
retval = TRUE;
|
retval = TRUE;
|
||||||
leave:
|
leave:
|
||||||
/* Unlock PDEV */
|
/* Unlock PDEV */
|
||||||
EngReleaseSemaphore(ppdev->hsemDevLock);
|
EngReleaseSemaphore(ppdev->hsemDevLock);
|
||||||
|
EngReleaseSemaphore(ghsemPDEV);
|
||||||
|
|
||||||
DPRINT1("leave, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface);
|
DPRINT1("leave, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface);
|
||||||
ASSERT(ppdev->pSurface->BitsLock);
|
ASSERT(ppdev->pSurface->BitsLock);
|
||||||
|
@ -524,8 +549,8 @@ PDEVOBJ_vGetDeviceCaps(
|
||||||
pDevCaps->ulLogPixelsX = pGdiInfo->ulLogPixelsX;
|
pDevCaps->ulLogPixelsX = pGdiInfo->ulLogPixelsX;
|
||||||
pDevCaps->ulLogPixelsY = pGdiInfo->ulLogPixelsY;
|
pDevCaps->ulLogPixelsY = pGdiInfo->ulLogPixelsY;
|
||||||
pDevCaps->ulSizePalette = pGdiInfo->ulNumPalReg;
|
pDevCaps->ulSizePalette = pGdiInfo->ulNumPalReg;
|
||||||
pDevCaps->ulColorRes = pGdiInfo->ulDACRed +
|
pDevCaps->ulColorRes = pGdiInfo->ulDACRed +
|
||||||
pGdiInfo->ulDACGreen +
|
pGdiInfo->ulDACGreen +
|
||||||
pGdiInfo->ulDACBlue;
|
pGdiInfo->ulDACBlue;
|
||||||
pDevCaps->ulPhysicalWidth = pGdiInfo->szlPhysSize.cx;
|
pDevCaps->ulPhysicalWidth = pGdiInfo->szlPhysSize.cx;
|
||||||
pDevCaps->ulPhysicalHeight = pGdiInfo->szlPhysSize.cy;
|
pDevCaps->ulPhysicalHeight = pGdiInfo->szlPhysSize.cy;
|
||||||
|
|
Loading…
Reference in a new issue