/******************************Module*Header*******************************\
* Module Name: mcd.h
*
* Common data structures for MCD driver interface.
*
* Copyright (c) 1996 Microsoft Corporation
*
\**************************************************************************/

#ifndef _MCD_H
#define _MCD_H

//
// Maximum MCD scanline size assumed by OpenGL generic implementation.
//
#define MCD_MAX_SCANLINE    4096

#define MCD_MEM_READY   0x0001
#define MCD_MEM_BUSY    0x0002
#define MCD_MEM_INVALID 0x0003

#define MCD_MAXMIPMAPLEVEL 12

typedef struct _MCDCONTEXT {
    HDC hdc;
    MCDHANDLE hMCDContext;
    LONG ipfd;
    LONG iLayer;
    ULONG_PTR dwMcdWindow;
} MCDCONTEXT;

typedef struct _MCDRCINFOPRIV {
    MCDRCINFO mri;
    ULONG_PTR dwMcdWindow;
} MCDRCINFOPRIV;

typedef struct _GENMCDSWAP
{
    struct GLGENwindowRec *pwnd;
    WGLSWAP *pwswap;
} GENMCDSWAP;

typedef struct _GENMCDSTATE_ GENMCDSTATE;

//
// Shared memory allocated/freed via MCDAlloc and MCDFree, respectively.
//

typedef struct _GENMCDBUF_ {
    PVOID pv;
    ULONG size;
    HANDLE hmem;
} GENMCDBUF;

//
// The GENMCDSURFACE retains information about the state of the MCD buffers
// or surface.  It exists per-WNDOBJ (window).
//

typedef struct _GENMCDSURFACE_ {
    GENMCDBUF  McdColorBuf;     // Color and depth span buffers used to
    GENMCDBUF  McdDepthBuf;     // read/write MCD buffers if not directly
                                // accessible.

    ULONG *pDepthSpan;          // Interchange buffer to present z-span in
                                // generic format.  If McdDepthBuf is 32-bit,
                                // then this points to it (reformatted in
                                // place).  If 16-bit, then the interchange
                                // buffer is allocated separately.

    ULONG      depthBitMask;

    struct GLGENwindowRec *pwnd;          // WNDOBJ this surface is bound to.

} GENMCDSURFACE;

//
// The GENMCDSTATE retains information about the state of the MCD context.
// It exists per-context.
//

typedef struct _GENMCDSTATE_ {
    MCDCONTEXT McdContext;      // Created via MCDCreateContext.
                                // NOTE: This must be the first field.

    GENMCDSURFACE *pMcdSurf;    // pointer to MCD surface

    GENMCDBUF  *pMcdPrimBatch;  // Current shared memory window for batching
                                // primitives

    GENMCDBUF  McdCmdBatch;     // Used to pass state to MCD driver.

    ULONG      mcdDirtyState;   // Set of flags that tracks when MCD state
                                // is out of sync (i.e., "dirty") with respect
                                // to generic state.

    ULONG *pDepthSpan;          // Cached copy of the one in GENMCDSURFACE.

                                // Fallback z-test span function.
    void *softZSpanFuncPtr;

    GENMCDBUF  McdBuf1;         // If using DMA, we swap pMcdPrimBatch
    GENMCDBUF  McdBuf2;         // between these two buffers.  Otherwise,
                                // only McdBuf1 is initialized.

    MCDRCINFO McdRcInfo;        // Cache a copy of the MCD RC info structure.

    MCDRECTBUFFERS McdBuffers;  // Describes accessibility of MCD buffers.

    ULONG mcdFlags;             // Misc. other state flags.

    MCDPIXELFORMAT McdPixelFmt; // Cache a copy of the MCD pixel format.

    HANDLE hDdColor;            // Kernel-mode handles for DirectDraw
    HANDLE hDdDepth;
} GENMCDSTATE;

//
// Misc. flags for GENMCDSTATE.mcdFlags:
//

#define MCD_STATE_FORCEPICK     0x00000001
#define MCD_STATE_FORCERESIZE   0x00000002

//
// Dirty state flags for GENMCDSTATE.mcdDirtyState:
//

#define MCD_DIRTY_ENABLES               0x00000001
#define MCD_DIRTY_TEXTURE               0x00000002
#define MCD_DIRTY_FOG                   0x00000004
#define MCD_DIRTY_SHADEMODEL            0x00000008
#define MCD_DIRTY_POINTDRAW             0x00000010
#define MCD_DIRTY_LINEDRAW              0x00000020
#define MCD_DIRTY_POLYDRAW              0x00000040
#define MCD_DIRTY_ALPHATEST             0x00000080
#define MCD_DIRTY_DEPTHTEST             0x00000100
#define MCD_DIRTY_BLEND                 0x00000200
#define MCD_DIRTY_LOGICOP               0x00000400
#define MCD_DIRTY_FBUFCTRL              0x00000800
#define MCD_DIRTY_LIGHTMODEL            0x00001000
#define MCD_DIRTY_HINTS                 0x00002000
#define MCD_DIRTY_VIEWPORT              0x00004000
#define MCD_DIRTY_SCISSOR               0x00008000
#define MCD_DIRTY_CLIPCTRL              0x00010000
#define MCD_DIRTY_STENCILTEST           0x00020000
#define MCD_DIRTY_PIXELSTATE            0x00040000
#define MCD_DIRTY_TEXENV                0x00080000
#define MCD_DIRTY_TEXTRANSFORM          0x00100000
#define MCD_DIRTY_TEXGEN                0x00200000
#define MCD_DIRTY_MATERIAL              0x00400000
#define MCD_DIRTY_LIGHTS                0x00800000
#define MCD_DIRTY_COLORMATERIAL         0x01000000

#define MCD_DIRTY_RENDERSTATE           0x0003ffff
#define MCD_DIRTY_ALL                   0x01ffffff


// Internal driver information structure
typedef struct _MCDDRIVERINFOI {
    MCDDRIVERINFO mcdDriverInfo;
    MCDDRIVER mcdDriver;
} MCDDRIVERINFOI;


//
// Return values for MCDLock.
// Zero must be used for the system error because it may be returned
// from ExtEscape if the system is unable to make the escape call.
//
#define MCD_LOCK_SYSTEM_ERROR   0
#define MCD_LOCK_BUSY           1
#define MCD_LOCK_TAKEN          2

BOOL APIENTRY MCDGetDriverInfo(HDC hdc, struct _MCDDRIVERINFOI *pMCDDriverInfo);
LONG APIENTRY MCDDescribeMcdPixelFormat(HDC hdc, LONG iPixelFormat,
                                        MCDPIXELFORMAT *pMcdPixelFmt);
LONG APIENTRY MCDDescribePixelFormat(HDC hdc, LONG iPixelFormat,
                                     LPPIXELFORMATDESCRIPTOR ppfd);
BOOL APIENTRY MCDCreateContext(MCDCONTEXT *pMCDContext,
                               MCDRCINFOPRIV *pDrvRcInfo,
                               struct _GLSURF *pgsurf,
                               int ipfd,
                               ULONG flags);
BOOL APIENTRY MCDDeleteContext(MCDCONTEXT *pMCDContext);
UCHAR * APIENTRY MCDAlloc(MCDCONTEXT *pMCDContext, ULONG numBytes, MCDHANDLE *pMCDHandle, 
                          ULONG flags);
BOOL APIENTRY MCDFree(MCDCONTEXT *pMCDContext, VOID *pMCDMem);
VOID APIENTRY MCDBeginState(MCDCONTEXT *pMCDContext, VOID *pMCDMem);
BOOL APIENTRY MCDFlushState(VOID *pMCDMem);
BOOL APIENTRY MCDAddState(VOID *pMCDMem, ULONG stateToChange,
                          ULONG stateValue);
BOOL APIENTRY MCDAddStateStruct(VOID *pMCDMem, ULONG stateToChange,
                                VOID *pStateValue, ULONG stateValueSize);
BOOL APIENTRY MCDSetViewport(MCDCONTEXT *pMCDContext, VOID *pMCDMem,
                             MCDVIEWPORT *pMCDViewport);
BOOL APIENTRY MCDSetScissorRect(MCDCONTEXT *pMCDContext, RECTL *pRect,
                                BOOL bEnabled);
ULONG APIENTRY MCDQueryMemStatus(VOID *pMCDMem);
PVOID APIENTRY MCDProcessBatch(MCDCONTEXT *pMCDContext, VOID *pMCDMem,
                               ULONG batchSize, VOID *pMCDFirstCmd,
                               int cExtraSurfaces,
                               struct IDirectDrawSurface **pddsExtra);
BOOL APIENTRY MCDReadSpan(MCDCONTEXT *pMCDContext, VOID *pMCDMem,
                          ULONG x, ULONG y, ULONG numPixels, ULONG type);
BOOL APIENTRY MCDWriteSpan(MCDCONTEXT *pMCDContext, VOID *pMCDMem,
                           ULONG x, ULONG y, ULONG numPixels, ULONG type);
BOOL APIENTRY MCDClear(MCDCONTEXT *pMCDContext, RECTL rect, ULONG buffers);
BOOL APIENTRY MCDSwap(MCDCONTEXT *pMCDContext, ULONG flags);
BOOL APIENTRY MCDGetBuffers(MCDCONTEXT *pMCDContext,
                            MCDRECTBUFFERS *pMCDBuffers);
BOOL APIENTRY MCDAllocBuffers(MCDCONTEXT *pMCDContext, RECTL *pWndRect);
BOOL APIENTRY MCDBindContext(MCDCONTEXT *pMCDContext, HDC hdc,
                             struct GLGENwindowRec *pwnd);
BOOL APIENTRY MCDSync(MCDCONTEXT *pMCDContext);
MCDHANDLE APIENTRY MCDCreateTexture(MCDCONTEXT *pMCDContext, 
                                    MCDTEXTUREDATA *pTexData,
                                    ULONG flags,
                                    VOID *pSurface);
BOOL APIENTRY MCDDeleteTexture(MCDCONTEXT *pMCDContext, MCDHANDLE hTex);
BOOL APIENTRY MCDUpdateSubTexture(MCDCONTEXT *pMCDContext,
                                  MCDTEXTUREDATA *pTexData, MCDHANDLE hTex, 
                                  ULONG lod, RECTL *pRect);
BOOL APIENTRY MCDUpdateTexturePalette(MCDCONTEXT *pMCDContext, 
                                      MCDTEXTUREDATA *pTexData, MCDHANDLE hTex,
                                      ULONG start, ULONG numEntries);
BOOL APIENTRY MCDUpdateTexturePriority(MCDCONTEXT *pMCDContext, 
                                       MCDTEXTUREDATA *pTexData,
                                       MCDHANDLE hTex);
BOOL APIENTRY MCDUpdateTextureState(MCDCONTEXT *pMCDContext, 
                                    MCDTEXTUREDATA *pTexData,
                                    MCDHANDLE hTex);
ULONG APIENTRY MCDTextureStatus(MCDCONTEXT *pMCDContext, MCDHANDLE hTex);
ULONG APIENTRY MCDTextureKey(MCDCONTEXT *pMCDContext, MCDHANDLE hTex);
BOOL APIENTRY MCDDescribeMcdLayerPlane(HDC hdc, LONG iPixelFormat,
                                       LONG iLayerPlane,
                                       MCDLAYERPLANE *pMcdPixelFmt);
BOOL APIENTRY MCDDescribeLayerPlane(HDC hdc, LONG iPixelFormat,
                                    LONG iLayerPlane,
                                    LPLAYERPLANEDESCRIPTOR ppfd);
LONG APIENTRY MCDSetLayerPalette(HDC hdc, LONG iLayerPlane, BOOL bRealize,
                                 LONG cEntries, COLORREF *pcr);
ULONG APIENTRY MCDDrawPixels(MCDCONTEXT *pMCDContext, ULONG width, ULONG height,
                             ULONG format, ULONG type, VOID *pPixels, BOOL packed);
ULONG APIENTRY MCDReadPixels(MCDCONTEXT *pMCDContext, LONG x, LONG y, ULONG width, ULONG height,
                             ULONG format, ULONG type, VOID *pPixels);
ULONG APIENTRY MCDCopyPixels(MCDCONTEXT *pMCDContext, LONG x, LONG y, ULONG width, ULONG height,
                             ULONG type);
ULONG APIENTRY MCDPixelMap(MCDCONTEXT *pMCDContext, ULONG mapType, ULONG mapSize,
                           VOID *pMap);
void APIENTRY MCDDestroyWindow(HDC hdc, ULONG_PTR dwMcdWindow);
int APIENTRY MCDGetTextureFormats(MCDCONTEXT *pMCDContext, int nFmts,
                                  struct _DDSURFACEDESC *pddsd);
ULONG APIENTRY MCDLock(MCDCONTEXT *pMCDContext);
VOID APIENTRY MCDUnlock(MCDCONTEXT *pMCDContext);

#ifdef MCD95
typedef LPCRITICAL_SECTION (APIENTRY *MCDGETMCDCRITSECTFUNC)(void);
#endif

#endif