- EngAcquireSemaphoreShared: update dwEngAcquireCount
- DC_LockDc/DC_UnlockDc: Acquire PDEV lock only for direct DCs, in that case also update the pSurface pointer
- When copying DC states, copy the surface only for memory dcs
- after switching the mode, update system metrics and redraw the desktop window.
- Remove testdraw code.

svn path=/branches/reactos-yarotows/; revision=46658
This commit is contained in:
Timo Kreuzer 2010-04-01 22:36:40 +00:00
parent 5fa6a416ca
commit 705ea2a9c3
6 changed files with 52 additions and 38 deletions

View file

@ -329,37 +329,6 @@ PDEVOBJ_vSwitchPdev(
ppdev2->pfn.CompletePDEV(ppdev2->dhpdev, (HDEV)ppdev2); ppdev2->pfn.CompletePDEV(ppdev2->dhpdev, (HDEV)ppdev2);
} }
void
TestDraw()
{
RECTL rclTrg;
PPDEVOBJ ppdev;
PDC pdc;
ppdev = EngpGetPDEV(0);
pdc = DC_AllocDcWithHandle();
DC_vInitDc(pdc, 0, ppdev);
rclTrg.left = rclTrg.top = 0;
rclTrg.right = rclTrg.bottom = 400;
IntEngBitBltEx(&ppdev->pSurface->SurfObj,
NULL,
NULL,
NULL,
NULL,
&rclTrg,
NULL,
NULL,
&pdc->eboFill.BrushObject,
NULL,
ROP3_TO_ROP4(PATCOPY),
FALSE);
ASSERT(FALSE);
}
BOOL BOOL
NTAPI NTAPI
@ -430,8 +399,6 @@ leave:
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);
TestDraw();
return retval; return retval;
} }

View file

@ -74,8 +74,12 @@ NTAPI
EngAcquireSemaphoreShared( EngAcquireSemaphoreShared(
IN HSEMAPHORE hsem) IN HSEMAPHORE hsem)
{ {
PTHREADINFO pti;
ASSERT(hsem); ASSERT(hsem);
ExEnterCriticalRegionAndAcquireResourceShared((PERESOURCE)hsem); ExEnterCriticalRegionAndAcquireResourceShared((PERESOURCE)hsem);
pti = PsGetThreadWin32Thread(PsGetCurrentThread());
if (pti) ++pti->dwEngAcquireCount;
} }
/* /*

View file

@ -169,7 +169,16 @@ DC_LockDc(HDC hdc)
{ {
PDC pdc; PDC pdc;
pdc = GDIOBJ_LockObj(hdc, GDILoObjType_LO_DC_TYPE); pdc = GDIOBJ_LockObj(hdc, GDILoObjType_LO_DC_TYPE);
if(pdc) EngAcquireSemaphoreShared(pdc->ppdev->hsemDevLock);
/* Direct DC's need PDEV locking */
if(pdc && pdc->dctype == DCTYPE_DIRECT)
{
/* Acquire shared PDEV lock */
EngAcquireSemaphoreShared(pdc->ppdev->hsemDevLock);
/* Get the current surface */
pdc->dclevel.pSurface = pdc->ppdev->pSurface;
}
return pdc; return pdc;
} }
@ -177,7 +186,12 @@ void
FORCEINLINE FORCEINLINE
DC_UnlockDc(PDC pdc) DC_UnlockDc(PDC pdc)
{ {
if(pdc->dctype == DCTYPE_DIRECT)
{
/* Release PDEV lock */
EngReleaseSemaphore(pdc->ppdev->hsemDevLock); EngReleaseSemaphore(pdc->ppdev->hsemDevLock);
}
GDIOBJ_UnlockObjByPtr(&pdc->BaseObject); GDIOBJ_UnlockObjByPtr(&pdc->BaseObject);
} }

View file

@ -710,6 +710,8 @@ NtUserEnumDisplaySettings(
return Status; return Status;
} }
BOOL APIENTRY UserClipCursor(RECTL *prcl);
VOID APIENTRY UserRedrawDesktop();
LONG LONG
APIENTRY APIENTRY
@ -725,6 +727,7 @@ UserChangeDisplaySettings(
HKEY hkey; HKEY hkey;
NTSTATUS Status; NTSTATUS Status;
PPDEVOBJ ppdev; PPDEVOBJ ppdev;
PDESKTOP pdesk;
/* If no DEVMODE is given, use registry settings */ /* If no DEVMODE is given, use registry settings */
if (!pdm) if (!pdm)
@ -793,6 +796,19 @@ UserChangeDisplaySettings(
DISP_CHANGE_FAILED : DISP_CHANGE_RESTART; DISP_CHANGE_FAILED : DISP_CHANGE_RESTART;
} }
/* Update the system metrics */
InitMetrics();
/* Remove all cursor clipping */
UserClipCursor(NULL);
pdesk = IntGetActiveDesktop();
IntHideDesktop(pdesk);
co_IntShowDesktop(pdesk, ppdev->gdiinfo.ulHorzRes, ppdev->gdiinfo.ulVertRes);
//UserRedrawDesktop();
//IntvGetDeviceCaps(&PrimarySurface, &GdiHandleTable->DevCaps);
/* Send message */ /* Send message */
} }
@ -883,10 +899,13 @@ NtUserChangeDisplaySettings(
} }
// FIXME: Copy videoparameters // FIXME: Copy videoparameters
UserEnterExclusive();
/* Call internal function */ /* Call internal function */
Ret = UserChangeDisplaySettings(pustrDevice, lpDevMode, hwnd, dwflags, NULL); Ret = UserChangeDisplaySettings(pustrDevice, lpDevMode, hwnd, dwflags, NULL);
UserLeave();
return Ret; return Ret;
} }

View file

@ -117,8 +117,11 @@ DC_vInitDc(
DCTYPE dctype, DCTYPE dctype,
PPDEVOBJ ppdev) PPDEVOBJ ppdev)
{ {
if (dctype == DCTYPE_DIRECT)
{
/* Lock ppdev */ /* Lock ppdev */
EngAcquireSemaphoreShared(ppdev->hsemDevLock); EngAcquireSemaphoreShared(ppdev->hsemDevLock);
}
/* Setup some basic fields */ /* Setup some basic fields */
pdc->dctype = dctype; pdc->dctype = dctype;

View file

@ -41,7 +41,6 @@ DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL To)
pdcDst->dclevel.hpal = pdcSrc->dclevel.hpal; pdcDst->dclevel.hpal = pdcSrc->dclevel.hpal;
/* Handle references here correctly */ /* Handle references here correctly */
DC_vSelectSurface(pdcDst, pdcSrc->dclevel.pSurface);
DC_vSelectFillBrush(pdcDst, pdcSrc->dclevel.pbrFill); DC_vSelectFillBrush(pdcDst, pdcSrc->dclevel.pbrFill);
DC_vSelectLineBrush(pdcDst, pdcSrc->dclevel.pbrLine); DC_vSelectLineBrush(pdcDst, pdcSrc->dclevel.pbrLine);
DC_vSelectPalette(pdcDst, pdcSrc->dclevel.ppal); DC_vSelectPalette(pdcDst, pdcSrc->dclevel.ppal);
@ -160,6 +159,10 @@ DC_vRestoreDC(
/* Copy the state back */ /* Copy the state back */
DC_vCopyState(pdcSave, pdc, FALSE); DC_vCopyState(pdcSave, pdc, FALSE);
/* Only memory DC's change their surface */
if (pdcSave->dctype == DCTYPE_MEMORY)
DC_vSelectSurface(pdc, pdcSave->dclevel.pSurface);
// Restore Path by removing it, if the Save flag is set. // Restore Path by removing it, if the Save flag is set.
// BeginPath will takecare of the rest. // BeginPath will takecare of the rest.
if (pdc->dclevel.hPath && pdc->dclevel.flPath & DCPATH_SAVE) if (pdc->dclevel.hPath && pdc->dclevel.flPath & DCPATH_SAVE)
@ -274,6 +277,10 @@ NtGdiSaveDC(
/* Copy the current state */ /* Copy the current state */
DC_vCopyState(pdc, pdcSave, TRUE); DC_vCopyState(pdc, pdcSave, TRUE);
/* Only memory DC's change their surface */
if (pdc->dctype == DCTYPE_MEMORY)
DC_vSelectSurface(pdcSave, pdc->dclevel.pSurface);
/* Copy path. FIXME: why this way? */ /* Copy path. FIXME: why this way? */
pdcSave->dclevel.hPath = pdc->dclevel.hPath; pdcSave->dclevel.hPath = pdc->dclevel.hPath;
pdcSave->dclevel.flPath = pdc->dclevel.flPath | DCPATH_SAVESTATE; pdcSave->dclevel.flPath = pdc->dclevel.flPath | DCPATH_SAVESTATE;