Cygwin/X: DirectDraw engines shouldn't try to blit if the surface wasn't allocated
Fix winShadowUpdateDD(|NL) so we don't try to blit to primary surface if it didn't get allocated (Intel drivers, in particular, seem to like to issue a WM_DISPLAYCHANGE during a suspend/resume cycle, but not allow surface to be allocated right then) Also: Use winReleasePrimarySurfaceShadowDD(|NL) in winFreeFBShadowDD(|NL) rather than open coding it Don't mess about recreating surface if we're going to resize it anyhow Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk> Reviewed-by: Colin Harrison <colin.harrison@virgin.net> Tested-by: Colin Harrison <colin.harrison@virgin.net>
This commit is contained in:
parent
625ab9701f
commit
09fd010902
|
@ -514,25 +514,16 @@ winFreeFBShadowDD (ScreenPtr pScreen)
|
|||
pScreenPriv->pddsShadow = NULL;
|
||||
}
|
||||
|
||||
/* Detach the clipper from the primary surface and release the clipper. */
|
||||
/* Detach the clipper from the primary surface and release the primary surface, if there is one */
|
||||
winReleasePrimarySurfaceShadowDD(pScreen);
|
||||
|
||||
/* Release the clipper object */
|
||||
if (pScreenPriv->pddcPrimary)
|
||||
{
|
||||
/* Detach the clipper */
|
||||
IDirectDrawSurface2_SetClipper (pScreenPriv->pddsPrimary,
|
||||
NULL);
|
||||
|
||||
/* Release the clipper object */
|
||||
IDirectDrawClipper_Release (pScreenPriv->pddcPrimary);
|
||||
pScreenPriv->pddcPrimary = NULL;
|
||||
}
|
||||
|
||||
/* Release the primary surface, if there is one */
|
||||
if (pScreenPriv->pddsPrimary)
|
||||
{
|
||||
IDirectDrawSurface2_Release (pScreenPriv->pddsPrimary);
|
||||
pScreenPriv->pddsPrimary = NULL;
|
||||
}
|
||||
|
||||
/* Free the DirectDraw2 object, if there is one */
|
||||
if (pScreenPriv->pdd2)
|
||||
{
|
||||
|
@ -577,6 +568,10 @@ winShadowUpdateDD (ScreenPtr pScreen,
|
|||
if ((!pScreenPriv->fActive && pScreenInfo->fFullScreen)
|
||||
|| pScreenPriv->fBadDepth) return;
|
||||
|
||||
/* Return immediately if we didn't get needed surfaces */
|
||||
if (!pScreenPriv->pddsPrimary || !pScreenPriv->pddsShadow)
|
||||
return;
|
||||
|
||||
/* Get the origin of the window in the screen coords */
|
||||
ptOrigin.x = pScreenInfo->dwXOffset;
|
||||
ptOrigin.y = pScreenInfo->dwYOffset;
|
||||
|
|
|
@ -546,25 +546,16 @@ winFreeFBShadowDDNL(ScreenPtr pScreen)
|
|||
pScreenPriv->pddsShadow4 = NULL;
|
||||
}
|
||||
|
||||
/* Detach the clipper from the primary surface and release the clipper. */
|
||||
/* Detach the clipper from the primary surface and release the primary surface, if there is one */
|
||||
winReleasePrimarySurfaceShadowDDNL(pScreen);
|
||||
|
||||
/* Release the clipper object */
|
||||
if (pScreenPriv->pddcPrimary)
|
||||
{
|
||||
/* Detach the clipper */
|
||||
IDirectDrawSurface4_SetClipper (pScreenPriv->pddsPrimary4,
|
||||
NULL);
|
||||
|
||||
/* Release the clipper object */
|
||||
IDirectDrawClipper_Release (pScreenPriv->pddcPrimary);
|
||||
pScreenPriv->pddcPrimary = NULL;
|
||||
}
|
||||
|
||||
/* Release the primary surface, if there is one */
|
||||
if (pScreenPriv->pddsPrimary4)
|
||||
{
|
||||
IDirectDrawSurface4_Release (pScreenPriv->pddsPrimary4);
|
||||
pScreenPriv->pddsPrimary4 = NULL;
|
||||
}
|
||||
|
||||
/* Free the DirectDraw4 object, if there is one */
|
||||
if (pScreenPriv->pdd4)
|
||||
{
|
||||
|
@ -658,6 +649,10 @@ winShadowUpdateDDNL (ScreenPtr pScreen,
|
|||
if ((!pScreenPriv->fActive && pScreenInfo->fFullScreen)
|
||||
|| pScreenPriv->fBadDepth) return;
|
||||
|
||||
/* Return immediately if we didn't get needed surfaces */
|
||||
if (!pScreenPriv->pddsPrimary4 || !pScreenPriv->pddsShadow4)
|
||||
return;
|
||||
|
||||
/* Get the origin of the window in the screen coords */
|
||||
ptOrigin.x = pScreenInfo->dwXOffset;
|
||||
ptOrigin.y = pScreenInfo->dwYOffset;
|
||||
|
|
|
@ -231,18 +231,7 @@ winWindowProc (HWND hwnd, UINT message,
|
|||
(this is probably usually the case so that might be an
|
||||
overoptimization)
|
||||
*/
|
||||
|
||||
/*
|
||||
* We can simply recreate the same-sized primary surface when
|
||||
* the display dimensions change.
|
||||
*/
|
||||
{
|
||||
|
||||
#if CYGDEBUG
|
||||
winDebug ("winWindowProc - WM_DISPLAYCHANGE - Recreated "
|
||||
"primary surface\n");
|
||||
#endif
|
||||
|
||||
/*
|
||||
In rootless modes which are monitor or virtual desktop size
|
||||
use RandR to resize the X screen
|
||||
|
@ -311,13 +300,8 @@ winWindowProc (HWND hwnd, UINT message,
|
|||
else
|
||||
{
|
||||
/*
|
||||
If we get here, we are either windowed and using the GDI engine
|
||||
or windowed and non-fullscreen using any engine
|
||||
*/
|
||||
|
||||
/*
|
||||
* For ddraw engines, we need to (try to) recreate the same-sized primary surface
|
||||
* when display dimensions change (but not depth, that is disruptive)
|
||||
* We can simply recreate the same-sized primary surface when
|
||||
* the display dimensions change.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue
Block a user