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