|
|
/**************************************************************************
*************************************************************************** * * Copyright (c) 1997, Cirrus Logic, Inc. * All Rights Reserved * * FILE: overlay.h * * DESCRIPTION: * * REVISION HISTORY: * * $Log: X:/log/laguna/ddraw/inc/overlay.h $ * * Rev 1.13 Mar 26 1998 09:52:50 frido * Fixed a hangup in overlays when switching from DOS and Overfly. * * Rev 1.12 06 Jan 1998 13:26:50 xcong * Access pDriverData locally for multi-monitor support. * * Rev 1.11 18 Sep 1997 16:10:42 bennyn * * Fixed NT 3.51 compile/link problem * * Rev 1.10 12 Sep 1997 12:12:48 bennyn * * Modified for NT DD overlay support * * Rev 1.9 29 Aug 1997 16:11:52 RUSSL * Added support for NT * * Rev 1.8 28 Jul 1997 09:13:06 RUSSL * Added arg passed to pfnGetFlipStatus * Added GetVideoWidowIndex inline function * Added dwNumVideoWindows global var * * Rev 1.7 20 Jun 1997 11:24:54 RUSSL * Added CLPL fourcc code, added a linear bit flag in surface flags, and * changed OVERLAYTABLE pfnCreateSurface function to return an HRESULT * * Rev 1.6 15 May 1997 10:50:58 RUSSL * Changed OVERLAYTABLE pfnCanCreateSurface function to return an HRESULT * * Rev 1.5 14 May 1997 14:51:30 KENTL * Added #define for FLG_PANNING * * Rev 1.4 13 May 1997 10:33:54 RUSSL * Added gsOverlayFlip to global vars * * Rev 1.3 21 Feb 1997 11:30:46 RUSSL * Added FLG_YUY2 define * * Rev 1.2 27 Jan 1997 18:33:54 RUSSL * Removed SetCaps from OVERLAYTABLE structure * Added Set5465FlipDuration function prototype * Moved GetFormatInfo function prototype to surface.h * * Rev 1.1 21 Jan 1997 14:35:42 RUSSL * Added FLG_VWx defines, etc. * Added 5465 function prototypes * * Rev 1.0 15 Jan 1997 11:01:50 RUSSL * Initial revision. * *************************************************************************** ***************************************************************************/
// If WinNT 3.5 skip all the source code
#if defined WINNT_VER35 // WINNT_VER35
#else
#ifndef _OVERLAY_H_
#define _OVERLAY_H_
/***************************************************************************
* D E F I N E S ****************************************************************************/
/* surface flags -----------------------------------------*/
#define FLG_BEGIN_ACCESS (DWORD)0x00000001
#define FLG_ENABLED (DWORD)0x00000002
//#define FLG_CONVERT_PACKJR (DWORD)0x00000004
#define FLG_MUST_RASTER (DWORD)0x00000008
#define FLG_TWO_MEG (DWORD)0x00000010
#define FLG_CHECK (DWORD)0x00000020
#define FLG_COLOR_KEY (DWORD)0x00000040
#define FLG_INTERPOLATE (DWORD)0x00000080
#define FLG_OVERLAY (DWORD)0x00000100
#define FLG_YUV422 (DWORD)0x00000200
//#define FLG_PACKJR (DWORD)0x00000400
#define FLG_USE_OFFSET (DWORD)0x00000800
#define FLG_YUVPLANAR (DWORD)0x00001000
#define FLG_SRC_COLOR_KEY (DWORD)0x00002000
#define FLG_DECIMATE (DWORD)0x00004000
#define FLG_CAPTURE (DWORD)0x00008000
#define FLG_VW0 (DWORD)0x00010000
#define FLG_VW1 (DWORD)0x00020000
#define FLG_VW2 (DWORD)0x00040000
#define FLG_VW3 (DWORD)0x00080000
#define FLG_VW4 (DWORD)0x00100000
#define FLG_VW5 (DWORD)0x00200000
#define FLG_VW6 (DWORD)0x00400000
#define FLG_VW7 (DWORD)0x00800000
#define FLG_PANNING (DWORD)0x01000000
#define FLG_VW_MASK (DWORD)0x00FF0000
#define FLG_VW_SHIFT 16
#define FLG_UYVY FLG_YUV422
#define FLG_YUY2 (DWORD)0x40000000
#define FLG_DECIMATE4 (DWORD)0x80000000
#define FLG_LINEAR (DWORD)0x10000000
#define MIN_OLAY_WIDTH 4
#define FOURCC_YUVPLANAR mmioFOURCC('C','L','P','L')
/***************************************************************************
* T Y P E D E F S ****************************************************************************/
#ifdef WINNT_VER40
#include <memmgr.h>
typedef struct _PDEV PDEV;
// Be sure to synchronize the following structures with the one
// in i386\Laguna.inc!
//
typedef struct tagOVERLAYTABLE { HRESULT (*pfnCanCreateSurface)(PDEV*, DWORD, DWORD); HRESULT (*pfnCreateSurface)(PDEV*, PDD_SURFACE_LOCAL, DWORD); VOID (*pfnDestroySurface)(PDEV*, PDD_DESTROYSURFACEDATA); DWORD (*pfnLock)(PDEV*, PDD_LOCKDATA); VOID (*pfnUnlock)(PDEV*, PDD_UNLOCKDATA); VOID (*pfnSetColorKey)(PDEV*, PDD_SETCOLORKEYDATA); DWORD (*pfnFlip)(PDEV*, PDD_FLIPDATA); DWORD (*pfnUpdateOverlay)(PDEV*, PDD_UPDATEOVERLAYDATA); DWORD (*pfnSetOverlayPos)(PDEV*, PDD_SETOVERLAYPOSITIONDATA); DWORD (*pfnGetFlipStatus)(PDEV*, FLATPTR,DWORD); } OVERLAYTABLE, *LPOVERLAYTABLE;
// Be sure to synchronize the following structures with the one
// in i386\Laguna.inc!
//
typedef struct { FLATPTR fpFlipFrom; LONGLONG liFlipTime;
DWORD dwFlipDuration; DWORD dwFlipScanline; BOOL bFlipFlag; BOOL bHaveEverCrossedVBlank; BOOL bWasEverInDisplay; } OVERLAYFLIPRECORD;
#else
typedef struct tagOVERLAYTABLE { HRESULT (*pfnCanCreateSurface)(GLOBALDATA *,DWORD, DWORD); HRESULT (*pfnCreateSurface)(LPDDRAWI_DIRECTDRAWSURFACE, DWORD, LPGLOBALDATA); VOID (*pfnDestroySurface)(LPDDHAL_DESTROYSURFACEDATA); DWORD (*pfnLock)(LPDDHAL_LOCKDATA); VOID (*pfnUnlock)(LPDDHAL_UNLOCKDATA); VOID (*pfnSetColorKey)(LPDDHAL_SETCOLORKEYDATA); DWORD (*pfnFlip)(LPDDHAL_FLIPDATA); DWORD (*pfnUpdateOverlay)(LPDDHAL_UPDATEOVERLAYDATA); DWORD (*pfnSetOverlayPos)(LPDDHAL_SETOVERLAYPOSITIONDATA); DWORD (*pfnGetFlipStatus)(LPGLOBALDATA,FLATPTR,DWORD); } OVERLAYTABLE, *LPOVERLAYTABLE;
typedef struct { FLATPTR fpFlipFrom; __int64 liFlipTime; DWORD dwFlipDuration; DWORD dwFlipScanline; BOOL bFlipFlag; BOOL bHaveEverCrossedVBlank; BOOL bWasEverInDisplay; } OVERLAYFLIPRECORD; #endif
#ifdef WINNT_VER40
#if DRIVER_5465 && defined(OVERLAY)
#define DDOFM SURFACE_DATA
#define PDDOFM LP_SURFACE_DATA
#endif
//this structure is used to store information per surface
typedef struct surface_data { // This is the inclusion of DDOFM structure.
// When OVERLAY is defined, DDOFM structure will be map to this structure
struct surface_data *prevhdl; struct surface_data *nexthdl; POFMHDL phdl;
//
// Note: Not all fields will get used/set for all types of surfaces!
//
// PMEMBLK pMemblk;
// VOID* pLinearAddr; // Linear address of memory block if linear
// // memory allocated via dmAllocLinear.
// LPVOID lpTextureData;
LPVOID lpCLPLData; // DWORD dwFlags;
DWORD dwOverlayFlags; // WORD wMemtype; // Memory type (if we allocated surface).
// DWORD dwBitsPerPixel;
// DWORD dwBytesPerPixel; // Rounded to nearest byte!
// DWORD dwBaseLinearAddr; // Linear address of memory heap.
// DWORD dwBasePhysAddr; // Physical address of memory heap.
// DWORD dwBaseOffset; // Offset of surface from base of memory heap.
DWORD dwOverlayOffset; // Offset of overlay surface by clipping
#if DDRAW_COMPAT >= 50
DWORD dwAutoBaseAddr1; //Auto flip Vport surface 1 address
DWORD dwAutoBaseAddr2; //Auto flip Vport surface 2 address
DDPIXELFORMAT ddpfAltPixelFormat; // if pixel fmt is different than
// we lead DDraw to believe it is
#endif
}SURFACE_DATA, *LP_SURFACE_DATA; #endif
/***************************************************************************
* G L O B A L V A R I A B L E S ****************************************************************************/
#ifndef WINNT_VER40
extern OVERLAYTABLE OverlayTable; extern OVERLAYFLIPRECORD gsOverlayFlip; extern DWORD dwNumVideoWindows; #endif
/***************************************************************************
* I N L I N E F U N C T I O N S ****************************************************************************/
/***************************************************************************
* * FUNCTION: GetVideoWindowIndex * * DESCRIPTION: * ****************************************************************************/
static __inline DWORD GetVideoWindowIndex ( DWORD dwOverlayFlags ) { DWORD dwVWIndex; DWORD dwTemp;
// Isn't there a better way to count the number of zeros to the right of
// the FLG_VWx bit?
dwTemp = (dwOverlayFlags & FLG_VW_MASK) >> FLG_VW_SHIFT; dwVWIndex = 0; if (dwTemp != 0) // Only do the next loop if there is any bit set.
while (0 == (dwTemp & 0x00000001)) { dwTemp >>= 1; dwVWIndex++; } // if the video window index is larger than or equal to the number of video
// windows implemented in the hardware, then this surface was assigned an
// invalid video window!
// ASSERT(dwNumVideoWindows > dwVWIndex);
return dwVWIndex; }
/***************************************************************************
* F U N C T I O N P R O T O T Y P E S ****************************************************************************/
#ifdef WINNT_VER40
DWORD __stdcall UpdateOverlay32 ( PDD_UPDATEOVERLAYDATA ); DWORD __stdcall SetOverlayPosition32 ( PDD_SETOVERLAYPOSITIONDATA ); DWORD __stdcall SetColorKey32 ( PDD_SETCOLORKEYDATA );
BOOL QueryOverlaySupport ( PDEV*, DWORD ); VOID OverlayInit ( PDEV*, DWORD, PDD_SURFACECALLBACKS, PDD_HALINFO ); VOID OverlayReInit ( PDEV*, DWORD, PDD_HALINFO );
// 5465 function prototypes
VOID Init5465Overlay ( PDEV*, DWORD, PDD_HALINFO, LPOVERLAYTABLE ); VOID Init5465Info ( PDEV*, PDD_HALINFO ); VOID Set5465FlipDuration ( PDEV*, DWORD ); #else
DWORD __stdcall UpdateOverlay32 ( LPDDHAL_UPDATEOVERLAYDATA ); DWORD __stdcall SetOverlayPosition32 ( LPDDHAL_SETOVERLAYPOSITIONDATA ); DWORD __stdcall SetColorKey32 ( LPDDHAL_SETCOLORKEYDATA );
BOOL QueryOverlaySupport ( LPGLOBALDATA, DWORD); VOID OverlayInit ( DWORD, LPDDHAL_DDSURFACECALLBACKS, LPDDHALINFO, GLOBALDATA * ); VOID OverlayReInit ( DWORD, LPDDHALINFO ,GLOBALDATA * );
// 5465 function prototypes
VOID Init5465Overlay ( DWORD, LPDDHALINFO, LPOVERLAYTABLE, GLOBALDATA * ); VOID Init5465Info ( LPDDHALINFO, GLOBALDATA * ); VOID Set5465FlipDuration ( DWORD ); #endif
#endif /* _OVERLAY_H_ */
#endif // WINNT_VER35
/* Don't write below this endif */
|