mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 10:33:11 +00:00
[WIN32K]
- 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:
parent
5fa6a416ca
commit
705ea2a9c3
6 changed files with 52 additions and 38 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue