Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

365 lines
9.1 KiB

/****************************************************************************
*****************************************************************************
*
* ******************************************
* * Copyright (c) 1995, Cirrus Logic, Inc. *
* * All Rights Reserved *
* ******************************************
*
* PROJECT: Laguna I (CL-GD5462) -
*
* FILE: ssbits.c
*
* AUTHOR: Benny Ng
*
* DESCRIPTION:
* This module implements the DrvSaveScreenBits() for
* Laguna NT driver.
*
* MODULES:
* DrvSaveScreenBits()
*
* REVISION HISTORY:
* 6/20/95 Benny Ng Initial version
*
* $Log: X:/log/laguna/nt35/displays/cl546x/SSBITS.C $
*
* Rev 1.18 Apr 28 1998 12:51:44 frido
* PDR#11389. I have disabled DrvSaveScreenBits on 2MB boards. We
* seem to run out of memory and the memory manager moves the blocks
* to a different place causing corruption.
*
* Rev 1.17 Mar 04 1998 15:34:18 frido
* Added new shadow macros.
*
* Rev 1.16 Nov 03 1997 11:18:10 frido
* Added REQUIRE macros.
*
* Rev 1.15 08 Aug 1997 17:24:22 FRIDO
* Added support for new memory manager.
*
* Rev 1.14 09 Apr 1997 10:49:28 SueS
* Changed sw_test_flag to pointer_switch.
*
* Rev 1.13 08 Apr 1997 12:27:40 einkauf
*
* add SYNC_W_3D to coordinate MCD/2D hw access
*
* Rev 1.12 26 Nov 1996 10:44:02 SueS
* Changed WriteLogFile parameters for buffering.
*
* Rev 1.11 13 Nov 1996 17:08:46 SueS
* Changed WriteFile calls to WriteLogFile.
*
* Rev 1.10 07 Nov 1996 16:09:08 bennyn
*
* Added no offscn allocation if DD enabled
*
* Rev 1.9 23 Aug 1996 09:10:38 noelv
* Save unders are now discardable.
*
* Rev 1.2 22 Aug 1996 17:07:14 frido
* #ss - Added validation of saved area before restoring or freeing it.
*
* Rev 1.1 15 Aug 1996 11:39:54 frido
* Added precompiled header.
*
* Rev 1.0 14 Aug 1996 17:16:30 frido
* Initial revision.
*
* Rev 1.7 18 Jun 1996 12:39:34 noelv
* added debug information.
*
* Rev 1.6 28 May 1996 15:11:30 noelv
* Updated data logging.
*
* Rev 1.5 16 May 1996 15:01:02 bennyn
*
* Add PIXEL_ALIGN to allocoffscnmen()
*
* Rev 1.4 20 Mar 1996 16:09:42 noelv
*
* Updated data logging
*
* Rev 1.3 05 Mar 1996 12:01:46 noelv
* Frido version 19
*
* Rev 1.1 20 Jan 1996 01:16:48 frido
*
*
* Rev 1.4 15 Jan 1996 17:00:08 NOELV
* AB workaround reductions
*
* Rev 1.3 20 Oct 1995 11:21:50 NOELV
*
* Was leaking offscreen memory. Now it releases its memory after resoring.
*
* Rev 1.2 04 Oct 1995 10:17:36 NOELV
*
* Used updated write macros.
*
* Rev 1.1 21 Aug 1995 13:52:44 NOELV
* Initial port to real hardware.
* Converted all 32 bit register writes to 2 16 bit regiser writes.
*
* Rev 1.0 25 Jul 1995 11:23:20 NOELV
* Initial revision.
*
* Rev 1.2 06 Jul 1995 09:59:10 BENNYN
*
*
* Rev 1.1 05 Jul 1995 08:39:44 BENNYN
* Initial version
*
* Rev 1.0 29 Jun 1995 14:20:44 BENNYN
* Initial revision.
*
****************************************************************************
****************************************************************************/
/*----------------------------- INCLUDES ----------------------------------*/
#include "precomp.h"
#include "SWAT.h"
#if MEMMGR
POFMHDL FindHandle(PPDEV ppdev, POFMHDL hdl);
#endif
/*----------------------------- DEFINES -----------------------------------*/
#define SSB_DBG_LEVEL 1
/*--------------------- STATIC FUNCTION PROTOTYPES ------------------------*/
/*--------------------------- ENUMERATIONS --------------------------------*/
/*----------------------------- TYPEDEFS ----------------------------------*/
/*-------------------------- STATIC VARIABLES -----------------------------*/
/*-------------------------- GLOBAL FUNCTIONS -----------------------------*/
//
// If data logging is enabled, Prototype the logging files.
//
#if LOG_CALLS
void LogSaveScreenBits(
int acc,
PPDEV ppdev);
//
// If data logging is not enabled, compile out the calls.
//
#else
#define LogSaveScreenBits(acc, ppdev)
#endif
/****************************************************************************
* FUNCTION NAME: DrvSaveScreenBits()
*
* DESCRIPTION: Do the save and restore of a given rectange of the
* displayed image
*
* REVISION HISTORY:
* 7/05/95 Benny Ng Initial version
****************************************************************************/
ULONG DrvSaveScreenBits(
SURFOBJ* pso,
ULONG iMode,
ULONG ident,
RECTL* prcl)
{
POFMHDL Handle;
SIZEL reqsz;
LONG szx, szy;
PPDEV ppdev = (PPDEV) pso->dhpdev;
#if 1 //#ss
POFMHDL pofm;
#endif
SYNC_W_3D(ppdev);
DISPDBG((SSB_DBG_LEVEL, "DrvSaveScreenBits - (%d)\n", iMode));
switch (iMode)
{
case SS_SAVE: // -----------------------------------------------------------
#ifdef ALLOC_IN_CREATESURFACE
if (ppdev->bDirectDrawInUse)
return (0);
#ifdef WINNT_VER40 // WINNT_VER40
// MCD should be active only when DDraw is active, but after mode change,
// it seems that DDraw is disabled and not re-enabled. Since MCD uses
// off screen memory like DDraw, we should punt SS_SAVE as if DDraw was alive
if (ppdev->NumMCDContexts > 0) \
return (0);
#endif
#endif
#if 1 // PDR#11389
if (ppdev->lTotalMem < 4096 * 1024)
{
DISPDBG((SSB_DBG_LEVEL, "DrvSaveScreenBits - Not enough memory\n"));
return (ULONG)NULL;
}
#endif
ASSERTMSG((prcl != NULL),
"NULL rectangle in SaveScreenBits. Mode=SS_SAVE.\n");
szx = prcl->right - prcl->left;
szy = prcl->bottom - prcl->top;
reqsz.cx = szx;
reqsz.cy = szy;
Handle = AllocOffScnMem(ppdev, &reqsz, PIXEL_AlIGN, NULL);
if (Handle != NULL)
{
// Save the image to offscreen memory
REQUIRE(9);
LL_DRAWBLTDEF(0x101000CC, 0);
LL_OP1(prcl->left, prcl->top);
LL_OP0(Handle->aligned_x / ppdev->iBytesPerPixel,
Handle->aligned_y);
LL_BLTEXT(szx, szy);
LogSaveScreenBits(0, ppdev);
#if 1 //#ss
Handle->alignflag |= SAVESCREEN_FLAG;
#endif
}
else
{
LogSaveScreenBits(9, ppdev);
}
DISPDBG((SSB_DBG_LEVEL, "DrvSaveScreenBits - Exit\n", iMode));
return((ULONG) Handle);
case SS_RESTORE: // --------------------------------------------------------
ASSERTMSG((prcl != NULL),
"NULL rectangle in SaveScreenBits. Mode=SS_RESTORE.\n");
Handle = (POFMHDL) ident;
#if 1 //#ss
#if MEMMGR
pofm = FindHandle(ppdev, Handle);
#else
for (pofm = ppdev->OFM_UsedQ; pofm; pofm = pofm->nexthdl)
{
if (Handle == pofm)
{
break;
}
}
#endif
if (pofm == NULL)
{
DISPDBG((SSB_DBG_LEVEL,
"DrvSaveScreenBits - Unable to restore.\n"));
return(FALSE);
}
#endif
// Restore the image using the BLT operation
REQUIRE(9);
LL_DRAWBLTDEF(0x101000CC, 0);
LL_OP1(Handle->aligned_x / ppdev->iBytesPerPixel, Handle->aligned_y);
LL_OP0(prcl->left, prcl->top);
LL_BLTEXT(prcl->right - prcl->left, prcl->bottom - prcl->top);
//
// After doing a restore we automatically do a free, So fall through to
// SS_FREE.
//
LogSaveScreenBits(1, ppdev);
case SS_FREE: // -----------------------------------------------------------
Handle = (POFMHDL) ident;
#if MEMMGR
pofm = FindHandle(ppdev, Handle);
#else
for (pofm = ppdev->OFM_UsedQ; pofm; pofm = pofm->nexthdl)
{
if (Handle == pofm)
{
break;
}
}
#endif
if (pofm != NULL)
{
FreeOffScnMem(ppdev, Handle);
LogSaveScreenBits(2, ppdev);
}
DISPDBG((SSB_DBG_LEVEL, "DrvSaveScreenBits - Exit\n", iMode));
return(TRUE);
} // end switch
//
// We shouldn't ever get here.
//
DISPDBG((SSB_DBG_LEVEL, "DrvSaveScreenBits - PANIC\n", iMode));
RIP(("Panic! SaveScreenBits got an invalid command.\n"));
LogSaveScreenBits(2, ppdev);
return(FALSE);
}
#if LOG_CALLS
void LogSaveScreenBits(
int acc,
PPDEV ppdev)
{
char buf[256];
int i;
#if ENABLE_LOG_SWITCH
if (pointer_switch == 0) return;
#endif
i = sprintf(buf,"DrvSaveScreenBits: ");
WriteLogFile(ppdev->pmfile, buf, i, ppdev->TxtBuff, &ppdev->TxtBuffIndex);
switch(acc)
{
case 0:
i = sprintf(buf, "SAVE (success)");
break;
case 1:
i = sprintf(buf,"RESTORE ");
break;
case 2:
i = sprintf(buf, "DELETE ");
break;
case 3:
i = sprintf(buf, "INVALID ");
break;
case 9:
i = sprintf(buf, "SAVE (fail) ");
break;
default:
i = sprintf(buf, "PUNT unknown ");
break;
}
WriteLogFile(ppdev->pmfile, buf, i, ppdev->TxtBuff, &ppdev->TxtBuffIndex);
i = sprintf(buf,"\r\n");
WriteLogFile(ppdev->pmfile, buf, i, ppdev->TxtBuff, &ppdev->TxtBuffIndex);
}
#endif