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
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
|
|
|