366 lines
9.1 KiB
C
366 lines
9.1 KiB
C
/****************************************************************************
|
||
*****************************************************************************
|
||
*
|
||
* ******************************************
|
||
* * 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
|
||
|