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