/******************************Module*Header**********************************\
*
*                           ***********************
*                           * DIRECTX SAMPLE CODE *
*                           ***********************
*
* Module Name: directx.h
*
* Content:     useful constants and definitions for DirectDraw and Direct3d
*
* Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
* Copyright (c) 1995-1999 Microsoft Corporation.  All rights reserved.
\*****************************************************************************/

#ifndef __directx__
#define __directx__

//
//  switch to DirectDraw context if necessary.
//  must be used in any DDraw blt function

#define DDCONTEXT  if (ppdev->permediaInfo->pCurrentCtxt != (ppdev->pDDContext)) \
                   {     P2SwitchContext(ppdev, ppdev->pDDContext); }


//
// fourcc codes supported in the driver for blts
#define FOURCC_YUV422     0x32595559    

//  
//  constants for surface privatedata structure
#define P2_CANPATCH                1
#define P2_PPVALID                 2
#define P2_CKVALID                 4
#define P2_SURFACE_FORMAT_VALID    8
#define P2_SURFACE_PRIMARY        16
#define P2_EMULATED_16BITZ        32
#define P2_ISPATCHED              64
#define P2_SURFACE_FORMAT_PALETTE 256
#define P2_SURFACE_NEEDUPDATE   0x00000200  //indicating managed 
                                            //surface content is obsolete

//
//  this magic no. tells us if the surface has already been initialized
#define SURF_MAGIC_NO 0xd3d10110
#define CHECK_P2_SURFACEDATA_VALIDITY(ptr)    \
    ( ((ptr) != NULL) && ((ptr)->MagicNo == SURF_MAGIC_NO) )

// Permedia specific settings for surfaces.
// A pointer to this structure is stored in 
// each surface (in lpGbl->dwReserved1)
typedef struct _permedia_surface_type {
    int PixelSize;              // 
    int PixelShift;
    int PixelMask;
    int FBReadPixel;
    int logPixelSize;
    
    int Format;                 // format description according to 
                                // Permedia 2 manual
    int FormatExtension;        // format extension...
    int ColorComponents;
    int ColorOrder;             // BGR=0, RGB=1
    int Texture16BitMode;

    DWORD RedMask;              // masks of surface, copied from DDPIXELFORMAT
    DWORD GreenMask;
    DWORD BlueMask;
    DWORD AlphaMask;

    BOOL bAlpha;                // surface contains alpha pixels
    BOOL bPreMult;              // surface contains premultiplied alpha !!
} PERMEDIA_SURFACE;

//
//  complete private structure of a surface
typedef struct tagPermediaSurfaceData
{
    DWORD                       MagicNo;    // Magic number to ensure 
                                            // structure is valid
    DWORD                       dwFlags;    // Private flags

    ULONG                       ulPackedPP; // PP values for surface pitch
    
    PERMEDIA_SURFACE            SurfaceFormat;            
    FLATPTR                     fpVidMem;   // store the real vidmem 
                                            // for managed textures
    VIDEOMEMORY*                pvmHeap;    // heap pointer for the managed 
                                            // video texture
    DWORD                       dwPaletteHandle;    
                                            //for video memory surface use
} PermediaSurfaceData;

//
// these constants are used in the PERMEDIA_SURFACE structure,
// Format and FormatExtension
#define PERMEDIA_4BIT_PALETTEINDEX 15
#define PERMEDIA_4BIT_PALETTEINDEX_EXTENSION 0
#define PERMEDIA_8BIT_PALETTEINDEX 14
#define PERMEDIA_8BIT_PALETTEINDEX_EXTENSION 0
#define PERMEDIA_332_RGB 5
#define PERMEDIA_332_RGB_EXTENSION 0
#define PERMEDIA_2321_RGB 9
#define PERMEDIA_2321_RGB_EXTENSION 0
#define PERMEDIA_5551_RGB 1
#define PERMEDIA_5551_RGB_EXTENSION 0
#define PERMEDIA_565_RGB 0
#define PERMEDIA_565_RGB_EXTENSION 1
#define PERMEDIA_8888_RGB 0
#define PERMEDIA_8888_RGB_EXTENSION 0
#define PERMEDIA_888_RGB 4
#define PERMEDIA_888_RGB_EXTENSION 1
#define PERMEDIA_444_RGB 2
#define PERMEDIA_444_RGB_EXTENSION 0
#define PERMEDIA_YUV422 3
#define PERMEDIA_YUV422_EXTENSION 1
#define PERMEDIA_YUV411 2
#define PERMEDIA_YUV411_EXTENSION 1


// 
// Color formating helper defines
// they convert an RGB value in a certain format to a RGB 32 bit value
#define FORMAT_565_32BIT(val) \
( (((val & 0xF800) >> 8) << 16) |\
 (((val & 0x7E0) >> 3) << 8) |\
 ((val & 0x1F) << 3) )

#define FORMAT_565_32BIT_BGR(val)   \
    ( ((val & 0xF800) >> 8) |           \
      (((val & 0x7E0) >> 3) << 8) |     \
      ((val & 0x1F) << 19) )

#define FORMAT_5551_32BIT(val)      \
( (((val & 0x8000) >> 8) << 24) |\
 (((val & 0x7C00) >> 7) << 16) |\
 (((val & 0x3E0) >> 2) << 8) | ((val & 0x1F) << 3) )

#define FORMAT_5551_32BIT_BGR(val)  \
( (((val & 0x8000) >> 8) << 24) |       \
  ((val & 0x7C00) >> 7) |               \
  (((val & 0x3E0) >> 2) << 8) |         \
  ((val & 0x1F) << 19) )

#define FORMAT_4444_32BIT(val)          \
( ((val & 0xF000) << 16) |\
 (((val & 0xF00) >> 4) << 16) |\
 ((val & 0xF0) << 8) | ((val & 0xF) << 4) )

#define FORMAT_4444_32BIT_BGR(val)  \
( ((val & 0xF000) << 16) |              \
  ((val & 0xF00) >> 4) |                \
  ((val & 0xF0) << 8) |                 \
  ((val & 0xF) << 20) )

#define FORMAT_332_32BIT(val)           \
( ((val & 0xE0) << 16) |\
 (((val & 0x1C) << 3) << 8) |\
 ((val & 0x3) << 6) ) 

#define FORMAT_332_32BIT_BGR(val)   \
( (val & 0xE0) |                        \
  (((val & 0x1C) << 3) << 8) |          \
  ((val & 0x3) << 22) )

#define FORMAT_2321_32BIT(val)          \
( ((val & 0x80) << 24) | ((val & 0x60) << 17) |\
 (((val & 0x1C) << 3) << 8) | ((val & 0x3) << 6) ) 

#define FORMAT_2321_32BIT_BGR(val)      \
( ((val & 0x80) << 24) |                \
  ((val & 0x60) << 1) |                 \
  (((val & 0x1C) << 3) << 8) |          \
  ((val & 0x3) << 22) )

#define FORMAT_8888_32BIT_BGR(val)  \
( (val & 0xFF00FF00) | ( ((val & 0xFF0000) >> 16) | ((val & 0xFF) << 16) ) )

#define FORMAT_888_32BIT_BGR(val)   \
( (val & 0xFF00FF00) | ( ((val & 0xFF0000) >> 16) | ((val & 0xFF) << 16) ) )

#define CHROMA_UPPER_ALPHA(val) \
    (val | 0xFF000000)

#define CHROMA_LOWER_ALPHA(val) \
    (val & 0x00FFFFFF)

#define CHROMA_332_UPPER(val) \
    (val | 0x001F1F3F)

#define FORMAT_PALETTE_32BIT(val) \
    ( (val & 0xFF) | ((val & 0xFF) << 8) | ((val & 0xFF) << 16))


//
// Direct Draw related functions
//

VOID 
SetupPrivateSurfaceData(PPDev ppdev, 
                        PermediaSurfaceData* pPrivateData, 
                        LPDDRAWI_DDRAWSURFACE_LCL pSurface);


//-----------------------------------------------------------------------------
//                             AGP related declarations
//-----------------------------------------------------------------------------


#define P2_AGP_HEAPSIZE     8
#define DD_AGPSURFBASEOFFSET(psurf) \
        (psurf->fpHeapOffset - psurf->lpVidMemHeap->fpStart)

#define DD_AGPSURFACEPHYSICAL(psurf) \
        (ppdev->dwGARTDevBase + DD_AGPSURFBASEOFFSET(psurf))

#define DD_P2AGPCAPABLE(ppdev) \
        (ppdev->dwChipConfig & PM_CHIPCONFIG_AGPCAPABLE)

#endif


