/*==========================================================================;
 *
 *  Copyright (C) 1994-1999 Microsoft Corporation.  All Rights Reserved.
 *
 *  File:       D3D8ddi.h
 *  Content:    Defines the interface between DirectDraw / Direct3D and the
 *      OS specific layer (win32k.sys on NT and ddraw.dll on Win9X).
 *@@BEGIN_MSINTERNAL
 *  History:
 *   Date   By  Reason
 *   ====   ==  ======
 *   04-nov-99  smac    initial implementation
 *@@END_MSINTERNAL
 *
 ***************************************************************************/
#ifndef __D3D8DDI_INCLUDED__
#define __D3D8DDI_INCLUDED__


/*
 * These definitions are required to allow polymorphic structure members (i.e. those
 * that are referred to both as DWORDs and as pointers) to resolve into a type
 * of correct size to hold the largest of those two types (i.e. pointer) on 64 bit
 * systems. For 32 bit environments, ULONG_PTR resolves to a DWORD.
 */
#ifndef MAXULONG_PTR
#define ULONG_PTR    DWORD
#define PULONG_PTR   LPDWORD
#endif //MAXULONG_PTR


// Caps:

// Note this struct is identical in content to D3DHAL_GLOBALDRIVERDATA.
// The only thing that has changed is the name of the texture list, reflecting
// the fact that this struct holds a list of DX8-style pixel format operations.
typedef struct _D3DD8_GLOBALDRIVERDATA {
    DWORD                       dwSize;                 // Size of this structure
    D3DDEVICEDESC_V1            hwCaps;                 // Capabilities of the hardware
    DWORD                       dwNumVertices;          // see following comment
    DWORD                       dwNumClipVertices;      // see following comment
    DWORD                       GDD8NumSupportedFormatOps;
    DDSURFACEDESC              *pGDD8SupportedFormatOps;
} D3D8_GLOBALDRIVERDATA;

typedef struct _D3D8_DRIVERCAPS
{
    D3DCAPS8                    D3DCaps;
    DWORD                       DisplayWidth;           // Current display width
    DWORD                       DisplayHeight;          // Current display height
    D3DFORMAT                   DisplayFormatWithoutAlpha;     // Current display format
    D3DFORMAT                   DisplayFormatWithAlpha;     // Current display format
    DWORD                       DisplayFrequency;       // Current refresh rate
    DWORD                       NLVCaps;                // AGP->Video blt caps
    DWORD                       SVBCaps;                // Sys->Video blt caps
    DWORD                       VSBCaps;                // Video->Sys blt caps
    DWORD                       SVBCaps2;               // More Sys->Video blt caps
    DWORD                       dwFlags;
    DWORD                       GDD8NumSupportedFormatOps;
    DDSURFACEDESC              *pGDD8SupportedFormatOps;
    DWORD                       KnownDriverFlags;
} D3D8_DRIVERCAPS, * PD3D8_DRIVERCAPS;

// Flags
#define DDIFLAG_D3DCAPS8                    0x00000001

// Known driver flags
#define KNOWN_LIGHTWEIGHT                   0x00000001      // Device can support lightweight surfaces
#define KNOWN_HWCURSOR                      0x00000002      // Device can support hardware cursors in Hi-Res
#define KNOWN_MIPPEDCUBEMAPS                0x00000004      // Device can support mipped cubemaps
#define KNOWN_ZSTENCILDEPTH                 0x00000010      // Device cannot support Z/Stencil depths different than the render target
#define KNOWN_HWCURSORLOWRES                0x00000020      // Device can support hardware cursors in LowRes
#define KNOWN_NOTAWINDOWEDBLTQUEUER         0x00000040      // Device has no drivers known to over-queue windowed presentation blts
#define KNOWN_D16_LOCKABLE                  0x00000080      // Device supports lockable D16 format correctly
#define KNOWN_RTTEXTURE_R5G6B5              0x00000100      // RT+Tex formats that are supported
#define KNOWN_RTTEXTURE_X8R8G8B8            0x00000200
#define KNOWN_RTTEXTURE_A8R8G8B8            0x00000400
#define KNOWN_RTTEXTURE_A1R5G5B5            0x00000800
#define KNOWN_RTTEXTURE_A4R4G4B4            0x00001000
#define KNOWN_RTTEXTURE_X1R5G5B5            0x00002000     
#define KNOWN_CANMISMATCHRT                 0x00004000      // All given RT+Tex formats can be used regardless of current display depth.
                                                            //  (If this bit is not set, then any known RT+Tex formats must match bitdepth of display)


/****************************************************************************
 *
 * D3D8 structures for Surface Object callbacks
 *
 ***************************************************************************/

typedef struct _D3D8_BLTDATA
{
    HANDLE                      hDD;       // driver struct
    HANDLE                      hDestSurface;// dest surface
    RECTL                       rDest;      // dest rect
    HANDLE                      hSrcSurface; // src surface
    RECTL                       rSrc;       // src rect
    DWORD                       dwFlags;    // blt flags
    DWORD                       dwROPFlags; // ROP flags (valid for ROPS only)
    DDBLTFX                     bltFX;      // blt FX
    union
    {
    BOOL                        IsClipped;  // clipped blt?
    HWND                        hWnd;       // Window Handle to clip against
    };
    RECTL                       rOrigDest;  // unclipped dest rect
                                            // (only valid if IsClipped)
    RECTL                       rOrigSrc;   // unclipped src rect
                                            // (only valid if IsClipped)
    DWORD                       dwRectCnt;  // count of dest rects
                                            // (only valid if IsClipped)
    LPRECT                      prDestRects;    // array of dest rects
    DWORD                       dwAFlags;   // DDABLT_ flags (for AlphaBlt DDI)
    DDARGB                      ddargbScaleFactors;  // RGBA scaling factors (AlphaBlt)

    DWORD                       msLastPresent;      // Time of last blt with DDBLT_COPYVSYNC
    DWORD                       threshold;  // Display Frequency related for adapter need
                                            // for DDBLT_COPYVSYNC

    HRESULT                     ddRVal;     // return value
} D3D8_BLTDATA, * PD3D8_BLTDATA;

typedef struct _D3D8_LOCKDATA
{
    HANDLE                      hDD;        // driver struct
    HANDLE                      hSurface;   // surface struct
    DWORD                       bHasRange;  // range is valid
    D3DRANGE                    range;      // range for locking
    DWORD                       bHasRect;   // rArea is valid
    RECTL                       rArea;      // area being locked
    DWORD                       bHasBox;    // box is valid
    D3DBOX                      box;        // sub-box locking for volumes
    LPVOID                      lpSurfData; // pointer to screen memory (return value)
    long                        lPitch;     // row pitch
    long                        lSlicePitch;// slice pitch for volumes
    DWORD                       dwFlags;    // DDLOCK flags
} D3D8_LOCKDATA, * PD3D8_LOCKDATA;

typedef struct _D3D8_UNLOCKDATA
{
    HANDLE                      hDD;        // driver struct
    HANDLE                      hSurface;   // surface struct
} D3D8_UNLOCKDATA, * PD3D8_UNLOCKDATA;

typedef struct _D3D8_FLIPDATA
{
    HANDLE                      hDD;        // driver struct
    HANDLE                      hSurfCurr;  // current surface
    HANDLE                      hSurfTarg;  // target surface (to flip to)
    HANDLE                      hSurfCurrLeft; // current surface
    HANDLE                      hSurfTargLeft; // target surface (to flip to)
    DWORD                       dwFlags;    // flags
    HRESULT                     ddRVal;     // return value
} D3D8_FLIPDATA, * PD3D8_FLIPDATA;

typedef struct _D3D8_DESTROYSURFACEDATA
{
    HANDLE                      hDD;       // driver struct
    HANDLE                      hSurface;    // surface struct
    HRESULT                     ddRVal;     // return value
} D3D8_DESTROYSURFACEDATA, * PD3D8_DESTROYSURFACEDATA;

typedef struct _D3D8_ADDATTACHEDSURFACEDATA
{
    HANDLE                          hDD;       // driver struct
    HANDLE                          hSurface;    // surface struct
    HANDLE                          hSurfAttached; // surface to attach
    HRESULT                         ddRVal;     // return value
} D3D8_ADDATTACHEDSURFACEDATA, * PD3D8_ADDATTACHEDSURFACEDATA;

typedef struct _D3D8_GETBLTSTATUSDATA
{
    HANDLE                      hDD;       // driver struct
    HANDLE                      hSurface;    // surface struct
    DWORD                       dwFlags;    // flags
    HRESULT                     ddRVal;     // return value
} D3D8_GETBLTSTATUSDATA, * PD3D8_GETBLTSTATUSDATA;

typedef struct _D3D8_GETFLIPSTATUSDATA
{
    HANDLE                      hDD;       // driver struct
    HANDLE                      hSurface;    // surface struct
    DWORD                       dwFlags;    // flags
    HRESULT                     ddRVal;     // return value
} D3D8_GETFLIPSTATUSDATA, * PD3D8_GETFLIPSTATUSDATA;

typedef struct _DDSURFACEINFO
{
    DWORD               cpWidth;        // For linear, surface and volume
    DWORD               cpHeight;       // For surface and volume
    DWORD               cpDepth;        // For volumes
    BYTE               *pbPixels;       // Pointer to Memory for sys-mem surface
    LONG                iPitch;         // Row Pitch for sys-mem surface
    LONG                iSlicePitch;    // Slice Pitch for sys-mem volume
    HANDLE              hKernelHandle;  // Handle returned by the kernel
} DDSURFACEINFO, *LPDDSURFACEINFO;

typedef struct _D3D8_CREATESURFACEDATA
{
    HANDLE                      hDD;        // driver struct
    LPDDSURFACEINFO             pSList;     // list of created surface objects
    DWORD                       dwSCnt;     // number of surfaces in SList
    D3DRESOURCETYPE             Type;       // Type: MipMap, CubeMap, MipVolume, VertexBuffer, IndexBuffer, CommandBuffer
    DWORD                       dwUsage;    // Usage: Texture or RenderTarget
    D3DPOOL                     Pool;       // SysMem/VidMem/NonLocal
    D3DFORMAT                   Format;     // Format
    D3DMULTISAMPLE_TYPE         MultiSampleType;
    DWORD                       dwFVF;      // FVF format for vertex buffers
    BOOL                        bTreatAsVidMem; // Set if Sys-Mem object was created with POOL_DEFAULT by user.
    BOOL                        bReUse;     // Set if are trying to create driver managed surfaces marked deferred
} D3D8_CREATESURFACEDATA, * PD3D8_CREATESURFACEDATA;

#define DDWAITVB_I_TESTVB           0x80000006l

typedef struct _D3D8_WAITFORVERTICALBLANKDATA
{
    HANDLE                      hDD;       // driver struct
    DWORD                       dwFlags;    // flags
    DWORD                       bIsInVB;    // is in vertical blank
    HRESULT                     ddRVal;     // return value
} D3D8_WAITFORVERTICALBLANKDATA, * PD3D8_WAITFORVERTICALBLANKDATA;

typedef struct _D3D8_SETMODEDATA
{
    HANDLE                      hDD;       // driver struct
    DWORD                       dwWidth;
    DWORD                       dwHeight;
    D3DFORMAT                   Format;
    DWORD                       dwRefreshRate;
    BOOL                        bRestore;
    HRESULT                     ddRVal;     // return value
} D3D8_SETMODEDATA, * PD3D8_SETMODEDATA;

typedef struct _D3D8_GETSCANLINEDATA
{
    HANDLE                      hDD;       // driver struct
    DWORD                       dwScanLine; // returned scan line
    BOOL                        bInVerticalBlank;
    HRESULT                     ddRVal;     // return value
} D3D8_GETSCANLINEDATA, * PD3D8_GETSCANLINEDATA;

typedef struct _D3D8_SETEXCLUSIVEMODEDATA
{
    HANDLE                      hDD;             // driver struct
    DWORD                       dwEnterExcl;      // TRUE if entering exclusive mode, FALSE is leaving
    HRESULT                     ddRVal;           // return value
} D3D8_SETEXCLUSIVEMODEDATA, * PD3D8_SETEXCLUSIVEMODEDATA;

typedef struct _D3D8_FLIPTOGDISURFACEDATA
{
    HANDLE                      hDD;         // driver struct
    DWORD                       dwToGDI;          // TRUE if flipping to the GDI surface, FALSE if flipping away
    HRESULT                     ddRVal;       // return value
} D3D8_FLIPTOGDISURFACEDATA, * PD3D8_FLIPTOGDISURFACEDATA;

typedef struct _D3D8_SETCOLORKEYDATA
{
    HANDLE                      hDD;
    HANDLE                      hSurface;
    DWORD                       ColorValue;
    HRESULT                     ddRVal;
} D3D8_SETCOLORKEYDATA, * PD3D8_SETCOLORKEYDATA;

typedef struct _D3D8_GETAVAILDRIVERMEMORYDATA
{
    HANDLE                  hDD;        // driver struct
    D3DPOOL                Pool;       // Pool they are interested in
    DWORD                   dwUsage;    // What the pool is used for
    DWORD                   dwFree;      // free memory for this kind of surface
    HRESULT                 ddRVal;      // return value
} D3D8_GETAVAILDRIVERMEMORYDATA, * PD3D8_GETAVAILDRIVERMEMORYDATA;

typedef struct _D3D8_GETDRIVERSTATEDATA
{
    DWORD                       dwFlags;        // Flags to indicate the data
                                                // required
    ULONG_PTR                   dwhContext;     // d3d context
    LPDWORD                     lpdwStates;     // ptr to the state data
                                                // to be filled in by the
                                                // driver
    DWORD                       dwLength;
    HRESULT                     ddRVal;         // return value
} D3D8_GETDRIVERSTATEDATA, * PD3D8_GETDRIVERSTATEDATA;

typedef struct _D3D8_DESTROYDDLOCALDATA
{
    DWORD                       dwFlags;
    HANDLE                      hDD;
    HRESULT                     ddRVal;
} D3D8_DESTROYDDLOCALDATA, * PD3D8_DESTROYDDLOCALDATA;

typedef struct _D3D8_CONTEXTCREATEDATA
{
    HANDLE                      hDD;        // in:  Driver struct
    HANDLE                      hSurface;   // in:  Surface to be used as target
    HANDLE                      hDDSZ;      // in:  Surface to be used as Z
    DWORD                       dwPID;      // in:  Current process id
    ULONG_PTR                   dwhContext; // in/out: Context handle
    HRESULT                     ddrval;

    // Private buffer information. To make it similar to
    // D3DNTHAL_CONTEXTCREATEI
    PVOID pvBuffer;
    ULONG cjBuffer;
} D3D8_CONTEXTCREATEDATA, * PD3D8_CONTEXTCREATEDATA;

typedef struct _D3D8_CONTEXTDESTROYDATA
{
    ULONG_PTR                   dwhContext; // in:  Context handle
    HRESULT                     ddrval;     // out: Return value
} D3D8_CONTEXTDESTROYDATA, * PD3D8_CONTEXTDESTROYDATA;

typedef struct _D3D8_CONTEXTDESTROYALLDATA
{
    DWORD                       dwPID;      // in:  Process id to destroy contexts for
    HRESULT                     ddrval;     // out: Return value
} D3D8_CONTEXTDESTROYALLDATA, * PD3D8_CONTEXTDESTROYALLDATA;

typedef struct _D3D8_RENDERSTATEDATA
{
    ULONG_PTR       dwhContext; // in:  Context handle
    DWORD       dwOffset;   // in:  Where to find states in buffer
    DWORD       dwCount;    // in:  How many states to process
    HANDLE      hExeBuf;    // in:  Execute buffer containing data
    HRESULT     ddrval;     // out: Return value
} D3D8_RENDERSTATEDATA, *PD3D8_RENDERSTATEDATA;

typedef struct _D3D8_RENDERPRIMITIVEDATA
{
    ULONG_PTR   dwhContext; // in:  Context handle
    DWORD       dwOffset;   // in:  Where to find primitive data in buffer
    DWORD       dwStatus;   // in/out: Condition branch status
    HANDLE      hExeBuf;    // in:  Execute buffer containing data
    DWORD       dwTLOffset; // in:  Byte offset in lpTLBuf for start of vertex data
    HANDLE      hTLBuf;     // in:  Execute buffer containing TLVertex data
    D3DINSTRUCTION  diInstruction;  // in:  Primitive instruction
    HRESULT     ddrval;     // out: Return value
} D3D8_RENDERPRIMITIVEDATA, *PD3D8_RENDERPRIMITIVEDATA;

typedef struct _D3D8_DRAWPRIMITIVES2DATA
{
    ULONG_PTR  dwhContext;           // in: Context handle
    DWORD      dwFlags;              // in: flags
    DWORD      dwVertexType;         // in: vertex type
    HANDLE     hDDCommands;          // in: vertex buffer command data
    DWORD      dwCommandOffset;      // in: offset to start of vertex buffer commands
    DWORD      dwCommandLength;      // in: number of bytes of command data
    union
    { // based on D3DHALDP2_USERMEMVERTICES flag
       HANDLE  hDDVertex;            // in: surface containing vertex data
       LPVOID  lpVertices;           // in: User mode pointer to vertices
    };
    DWORD      dwVertexOffset;       // in: offset to start of vertex data
    DWORD      dwVertexLength;       // in: number of vertices of vertex data
    DWORD      dwReqVertexBufSize;   // in: number of bytes required for the next vertex buffer
    DWORD      dwReqCommandBufSize;  // in: number of bytes required for the next commnand buffer
    LPDWORD    lpdwRStates;          // in: Pointer to the array where render states are updated
    union
    {
       DWORD   dwVertexSize;         // in: Size of each vertex in bytes
       HRESULT ddrval;               // out: return value
    };
    DWORD      dwErrorOffset;        // out: offset in lpDDCommands to first D3DHAL_COMMAND not handled

    // Private data for the thunk
    ULONG_PTR  fpVidMem_CB;          // out: fpVidMem for the command buffer
    DWORD      dwLinearSize_CB;      // out: dwLinearSize for the command buffer

    ULONG_PTR  fpVidMem_VB;          // out: fpVidMem for the vertex buffer
    DWORD      dwLinearSize_VB;      // out: dwLinearSize for the vertex buffer
} D3D8_DRAWPRIMITIVES2DATA, *PD3D8_DRAWPRIMITIVES2DATA;

typedef struct _D3D8_VALIDATETEXTURESTAGESTATEDATA
{
    ULONG_PTR                   dwhContext;     // in:  Context handle
    DWORD                       dwFlags;        // in:  Flags, currently set to 0
    ULONG_PTR                   dwReserved;     //
    DWORD                       dwNumPasses;    // out: Number of passes the hardware
                                                //      can perform the operation in
    HRESULT                     ddrval;         // out: return value
} D3D8_VALIDATETEXTURESTAGESTATEDATA, * PD3D8_VALIDATETEXTURESTAGESTATEDATA;

typedef struct _D3D8_SCENECAPTUREDATA
{
    ULONG_PTR                   dwhContext; // in:  Context handle
    DWORD                       dwFlag;     // in:  Indicates beginning or end
    HRESULT                     ddrval;     // out: Return value
} D3D8_SCENECAPTUREDATA, * PD3D8_SCENECAPTUREDATA;

typedef struct _D3D8_CLEAR2DATA
{
    ULONG_PTR                   dwhContext;     // in:  Context handle

  // dwFlags can contain D3DCLEAR_TARGET, D3DCLEAR_ZBUFFER, and/or D3DCLEAR_STENCIL
    DWORD                       dwFlags;        // in:  surfaces to clear

    DWORD                       dwFillColor;    // in:  Color value for rtarget
    D3DVALUE                    dvFillDepth;    // in:  Depth value for Z buffer (0.0-1.0)
    DWORD                       dwFillStencil;  // in:  value used to clear stencil buffer

    LPD3DRECT                   lpRects;        // in:  Rectangles to clear
    DWORD                       dwNumRects;     // in:  Number of rectangles

    HRESULT                     ddrval;         // out: Return value

    // This is extra stuff passed down to the thunk layer for emulation
    // of Clear for those drivers (DX6) that cant do it themselves.
    HANDLE                  hDDS;       // in:  render target
    HANDLE                  hDDSZ;      // in:  Z buffer
} D3D8_CLEAR2DATA, * PD3D8_CLEAR2DATA;


typedef struct _D3D8_CLEARDATA
{
    ULONG_PTR               dwhContext;     // in:  Context handle

    // dwFlags can contain D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER
    DWORD               dwFlags;        // in:  surfaces to clear

    DWORD               dwFillColor;    // in:  Color value for rtarget
    DWORD               dwFillDepth;    // in:  Depth value for Z buffer

    LPD3DRECT           lpRects;        // in:  Rectangles to clear
    DWORD               dwNumRects;     // in:  Number of rectangles

    HRESULT             ddrval;         // out: Return value
} D3D8_CLEARDATA, * PD3D8_CLEARDATA;

typedef struct _D3D8_SETRENDERTARGETDATA
{
    ULONG_PTR               dwhContext; // in:  Context handle
    HANDLE                  hDDS;       // in:  new render target
    HANDLE                  hDDSZ;      // in:  new Z buffer
    HRESULT                 ddrval;     // out: Return value
    BOOL                    bNeedUpdate;// out: Does runtime need to update
                                        //      driver state.
} D3D8_SETRENDERTARGETDATA, * PD3D8_SETRENDERTARGETDATA;

typedef struct _D3D8_SETPALETTEDATA
{
    HANDLE                  hDD;        // in:  Driver struct
    HANDLE                  hSurface;   // in:  Surface to be used as target
    DWORD                   Palette;    // in:  Palette identifier
    HRESULT                 ddRVal;     // out: Return value
} D3D8_SETPALETTEDATA, * PD3D8_SETPALETTEDATA;

typedef struct _D3D8_UPDATEPALETTEDATA
{
    HANDLE                  hDD;        // in:  Driver struct
    DWORD                   Palette;    // in:  Palette identifier
    LPPALETTEENTRY          ColorTable; // in:  256 entry color table
    HRESULT                 ddRVal;     // out: Return value
} D3D8_UPDATEPALETTEDATA, * PD3D8_UPDATEPALETTEDATA;

//
// Driver callback table
//

DEFINE_GUID( GUID_D3D8Callbacks,    0xb497a1f3, 0x46cc, 0x4fc7, 0xb4, 0xf2, 0x32, 0xd8, 0x9e, 0xf9, 0xcc, 0x27);

typedef HRESULT     (FAR PASCAL *PD3D8DDI_CREATESURFACE)(PD3D8_CREATESURFACEDATA);
typedef HRESULT     (FAR PASCAL *PD3D8DDI_DESTROYSURFACE)(PD3D8_DESTROYSURFACEDATA);
typedef HRESULT     (FAR PASCAL *PD3D8DDI_LOCK)(PD3D8_LOCKDATA);
typedef HRESULT     (FAR PASCAL *PD3D8DDI_UNLOCK)(PD3D8_UNLOCKDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_CONTEXTCREATE)(PD3D8_CONTEXTCREATEDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_CONTEXTDESTROY)(PD3D8_CONTEXTDESTROYDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_CONTEXTDESTROYALL)(PD3D8_CONTEXTDESTROYALLDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_RENDERSTATE) (PD3D8_RENDERSTATEDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_RENDERPRIMITIVE) (PD3D8_RENDERPRIMITIVEDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_DRAWPRIM2)(PD3D8_DRAWPRIMITIVES2DATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_GETDRIVERSTATE)(PD3D8_GETDRIVERSTATEDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_VALIDATETEXTURESTAGESTATE)(PD3D8_VALIDATETEXTURESTAGESTATEDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_SCENECAPTURE)(PD3D8_SCENECAPTUREDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_CLEAR2)(PD3D8_CLEAR2DATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_BLT)(PD3D8_BLTDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_GETSCANLINE)(PD3D8_GETSCANLINEDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_WAITFORVERTICALBLANK)(PD3D8_WAITFORVERTICALBLANKDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_FLIP)(PD3D8_FLIPDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_GETBLTSTATUS)(PD3D8_GETBLTSTATUSDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_GETFLIPSTATUS)(PD3D8_GETFLIPSTATUSDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_GETAVAILDRIVERMEMORY)(PD3D8_GETAVAILDRIVERMEMORYDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_SETMODE)(PD3D8_SETMODEDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_FLIPTOGDISURFACE)(PD3D8_FLIPTOGDISURFACEDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_SETCOLORKEY)(PD3D8_SETCOLORKEYDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_SETEXCLUSIVEMODE)(PD3D8_SETEXCLUSIVEMODEDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_DESTROYDDLOCAL)(PD3D8_DESTROYDDLOCALDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_SETRENDERTARGET)(PD3D8_SETRENDERTARGETDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_CLEAR)(PD3D8_CLEARDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_SETPALETTE)(PD3D8_SETPALETTEDATA);
typedef DWORD       (FAR PASCAL *PD3D8DDI_UPDATEPALETTE)(PD3D8_UPDATEPALETTEDATA);

typedef struct _D3D8_CALLBACKS
{
    PD3D8DDI_CREATESURFACE                  CreateSurface;
    PD3D8DDI_DESTROYSURFACE                 DestroySurface;
    PD3D8DDI_LOCK                           Lock;
    PD3D8DDI_UNLOCK                         Unlock;
    PD3D8DDI_CONTEXTCREATE                  CreateContext;
    PD3D8DDI_CONTEXTDESTROY                 ContextDestroy;
    PD3D8DDI_CONTEXTDESTROYALL              ContextDestroyAll;
    PD3D8DDI_RENDERSTATE                    RenderState;
    PD3D8DDI_RENDERPRIMITIVE                RenderPrimitive;
    PD3D8DDI_DRAWPRIM2                      DrawPrimitives2;
    PD3D8DDI_GETDRIVERSTATE                 GetDriverState;
    PD3D8DDI_VALIDATETEXTURESTAGESTATE      ValidateTextureStageState;
    PD3D8DDI_SCENECAPTURE                   SceneCapture;
    PD3D8DDI_CLEAR2                         Clear2;
    PD3D8DDI_BLT                            Blt;
    PD3D8DDI_GETSCANLINE                    GetScanLine;
    PD3D8DDI_WAITFORVERTICALBLANK           WaitForVerticalBlank;
    PD3D8DDI_FLIP                           Flip;
    PD3D8DDI_GETBLTSTATUS                   GetBltStatus;
    PD3D8DDI_GETFLIPSTATUS                  GetFlipStatus;
    PD3D8DDI_GETAVAILDRIVERMEMORY           GetAvailDriverMemory;
    PD3D8DDI_GETBLTSTATUS                   GetSysmemBltStatus;
    PD3D8DDI_SETMODE                        SetMode;
    PD3D8DDI_SETEXCLUSIVEMODE               SetExclusiveMode;
    PD3D8DDI_FLIPTOGDISURFACE               FlipToGDISurface;
    PD3D8DDI_SETCOLORKEY                    SetColorkey;

    PD3D8DDI_DESTROYDDLOCAL                 DestroyDDLocal;
    PD3D8DDI_SETRENDERTARGET                SetRenderTarget;
    PD3D8DDI_CLEAR                          Clear;
    PD3D8DDI_SETPALETTE                     SetPalette;
    PD3D8DDI_UPDATEPALETTE                  UpdatePalette;
    LPVOID                                  Reserved1; // For device alignment
    LPVOID                                  Reserved2; // For device alignment
} D3D8_CALLBACKS, * PD3D8_CALLBACKS;


//
// D3D8xxx function prototypes to replace the NT Ddxxxx prototypes from GDI32.
// On NT, these are internal functions, but on Win9X DDRAW.DLL must export
// them, so we will change the export names
//

#ifdef WIN95
#define D3D8CreateDirectDrawObject          DdEntry1
#define D3D8QueryDirectDrawObject           DdEntry2
#define D3D8DeleteDirectDrawObject          DdEntry3
#define D3D8GetDC                           DdEntry4
#define D3D8ReleaseDC                       DdEntry5
#define D3D8ReenableDirectDrawObject        DdEntry6
#define D3D8SetGammaRamp                    DdEntry7
#define D3D8BuildModeTable                  DdEntry8
#define D3D8IsDeviceLost                    DdEntry9
#define D3D8CanRestoreNow                   DdEntry10
#define D3D8RestoreDevice                   DdEntry11
#define D3D8DoVidmemSurfacesExist           DdEntry12
#define D3D8SetMode                         DdEntry13
#define D3D8BeginProfile                    DdEntry14
#define D3D8EndProfile                      DdEntry15
#define D3D8GetMode                         DdEntry16
#define D3D8SetCooperativeLevel             DdEntry17
#define D3D8IsDummySurface                  DdEntry18
#define D3D8LoseDevice                      DdEntry19
#define D3D8GetHALName                      DdEntry20

#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef WIN95

VOID APIENTRY D3D8CreateDirectDrawObject(
    LPGUID          pGuid,
    char*           szDeviceName,
    HANDLE*         phDD,
    D3DDEVTYPE      Type,
    HINSTANCE*      phLibrary,
    VOID*           pInitFunction
    );

#else

VOID APIENTRY D3D8CreateDirectDrawObject(
    HDC             hdc,
    char*           szDeviceName,
    HANDLE*         phDD,
    D3DDEVTYPE      Type,
    HINSTANCE*      phLibrary,
    VOID*           pInitFunction
    );

#endif

BOOL APIENTRY D3D8QueryDirectDrawObject(
    HANDLE                      hDD,
    PD3D8_DRIVERCAPS            DriverCaps,
    PD3D8_CALLBACKS             Callbacks,
    char*                       DeviceName,
    HINSTANCE                   hLibrary,
    D3D8_GLOBALDRIVERDATA*      pGblDriverData,
    D3DHAL_D3DEXTENDEDCAPS*     pExtendedCaps,
    LPDDSURFACEDESC             pTextureFormats,
    LPDDPIXELFORMAT             pZStencilFormats,
    UINT*                       pcTextureFormats,
    UINT*                       pcZStencilFormats
    );

HDC APIENTRY D3D8GetDC(
    HANDLE                    hSurface,
    LPPALETTEENTRY            pPalette
    );

BOOL APIENTRY D3D8ReleaseDC(
    HANDLE                  hSurface,
    HDC                     hdc
    );

BOOL APIENTRY D3D8ReenableDirectDrawObject(
    HANDLE                  hDD,
    BOOL*                   pbNewMode
    );

BOOL APIENTRY D3D8SetGammaRamp(
    HANDLE      hDD,
    HDC         hdc,
    LPVOID      lpGammaRamp
    );

VOID APIENTRY D3D8BuildModeTable(
    char*               pDeviceName,
    D3DDISPLAYMODE*     pModeTable,
    DWORD*              pNumEntries,
    D3DFORMAT           Unknown16,
    HANDLE              hProfile,
    BOOL                b16bppSupported,
    BOOL                b32bppSupported
    );

BOOL APIENTRY D3D8IsDeviceLost(
    HANDLE              hDD
    );

BOOL APIENTRY D3D8CanRestoreNow(
    HANDLE              hDD
    );

VOID APIENTRY D3D8RestoreDevice(
    HANDLE hDD
    );

BOOL APIENTRY D3D8DoVidmemSurfacesExist(
    HANDLE hDD
    );

VOID APIENTRY D3D8DeleteDirectDrawObject(
    HANDLE hDD
   );

HANDLE APIENTRY D3D8BeginProfile(
    char* pDeviceName
    );

VOID APIENTRY D3D8EndProfile(
    HANDLE Handle
    );

DWORD APIENTRY D3D8GetMode(
    HANDLE          Handle,
    char*           pDeviceName,
    D3DDISPLAYMODE* pMode,
    D3DFORMAT       Unknown16
    );

DWORD APIENTRY D3D8SetMode(
    HANDLE  Handle,
    char*   pDeviceName,
    UINT    Width,
    UINT    Height,
    UINT    BPP,
    UINT    RefreshRate,
    BOOL    bRestore
    );

DWORD APIENTRY D3D8SetCooperativeLevel(
    HANDLE hDD,
    HWND hWnd,
    DWORD dwFlags );

VOID APIENTRY D3D8LoseDevice(
    HANDLE hDD);

__inline DWORD D3D8GetDrawPrimHandle(HANDLE hSurface)
{
    return *(DWORD *)(hSurface);
}

BOOL APIENTRY D3D8IsDummySurface(
    HANDLE hSurface );

VOID APIENTRY D3D8GetHALName(
    char* pDisplayName, 
    char *pDriverName );


#ifdef __cplusplus
}
#endif


typedef struct _D3D8_DEVICEDATA
{
    D3D8_DRIVERCAPS         DriverData;
    D3D8_CALLBACKS          Callbacks;
    DWORD                   dwFlags;
    char                    DriverName[MAX_DRIVER_NAME];
//    RECT                    DeviceRect;
    HDC                     hDC;
    GUID                    Guid;
    HANDLE                  hDD;
    D3DDEVTYPE              DeviceType;
    HINSTANCE               hLibrary;
    struct _D3D8_DEVICEDATA* pLink;
//    D3DDISPLAYMODE*       pModeTable;
//    DWORD                   dwNumModes;
} D3D8_DEVICEDATA, * PD3D8_DEVICEDATA;

#define DD_DISPLAYDRV       0x00000001
#define DD_GDIDRV           0x00000002

#endif