
/* $Id: $
 *
 * COPYRIGHT:            See COPYING in the top level directory
 * PROJECT:              ReactOS kernel
 * FILE:                 
 * PURPOSE:              Directx headers
 * PROGRAMMER:           Magnus Olsen (greatlrd)
 *
 */

#ifndef __DMEMMGR_INCLUDED__
#define __DMEMMGR_INCLUDED__

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __NTDDKCOMP__
typedef ULONG_PTR FLATPTR;
typedef struct _VIDMEM *LPVIDMEM;
#else
typedef ULONG_PTR FLATPTR;
typedef struct _VIDEOMEMORY *LPVIDMEM;
#endif

#define SURFACEALIGN_DISCARDABLE 0x00000001
#define VMEMHEAP_LINEAR 0x00000001 
#define VMEMHEAP_RECTANGULAR 0x00000002
#define VMEMHEAP_ALIGNMENT 0x00000004

typedef struct _VMEML
{
  struct _VMEML *next;
  FLATPTR ptr;
  DWORD size;
  BOOL bDiscardable;
} VMEML, *LPVMEML, *LPLPVMEML;

typedef struct _VMEMR
{
  struct _VMEMR *next;
  struct _VMEMR *prev;
  
  struct _VMEMR *pUp;
  struct _VMEMR *pDown;
  struct _VMEMR *pLeft;
  struct _VMEMR *pRight;
  FLATPTR  ptr;
  DWORD size;
  DWORD x;
  DWORD y;
  DWORD cx;
  DWORD cy;
  DWORD flags;
  FLATPTR pBits;
  BOOL bDiscardable;
} VMEMR,  *LPVMEMR,  *LPLPVMEMR;

typedef struct _SURFACEALIGNMENT
{
  union
  {
    struct
    {
      DWORD dwStartAlignment;
      DWORD dwPitchAlignment;
      DWORD dwFlags;
      DWORD dwReserved2;
    } Linear;
    struct
    {
      DWORD dwXAlignment;
      DWORD dwYAlignment;
      DWORD dwFlags;
      DWORD dwReserved2;
    } Rectangular;
  };
} SURFACEALIGNMENT, *LPSURFACEALIGNMENT;

typedef struct _HEAPALIGNMENT
{
    DWORD dwSize;
    DDSCAPS ddsCaps;
    DWORD dwReserved;
    SURFACEALIGNMENT ExecuteBuffer;
    SURFACEALIGNMENT Overlay;
    SURFACEALIGNMENT Texture;
    SURFACEALIGNMENT ZBuffer;
    SURFACEALIGNMENT AlphaBuffer;
    SURFACEALIGNMENT Offscreen;
    SURFACEALIGNMENT FlipTarget;
} HEAPALIGNMENT, *LPHEAPALIGNMENT;

typedef struct _VMEMHEAP
{
    DWORD dwFlags;
    DWORD stride;
    LPVOID freeList;
    LPVOID allocList;
    DWORD dwTotalSize;
    FLATPTR fpGARTLin;
    FLATPTR fpGARTDev;
    DWORD dwCommitedSize;     
    DWORD dwCoalesceCount;
    HEAPALIGNMENT Alignment;
    DDSCAPSEX ddsCapsEx;
    DDSCAPSEX ddsCapsExAlt;
#ifndef IS_16
    LARGE_INTEGER liPhysAGPBase;
#endif
    HANDLE hdevAGP;
    LPVOID pvPhysRsrv;
    BYTE* pAgpCommitMask;
    DWORD dwAgpCommitMaskSize;
} VMEMHEAP, *LPVMEMHEAP;

typedef struct _DD_GETHEAPALIGNMENTDATA
{
    ULONG_PTR dwInstance; 
    DWORD dwHeap;
    HRESULT ddRVal;
    VOID* GetHeapAlignment;
    HEAPALIGNMENT Alignment;
} DD_GETHEAPALIGNMENTDATA, *PDD_GETHEAPALIGNMENTDATA;

extern void WINAPI VidMemFree( LPVMEMHEAP pvmh, FLATPTR ptr);
extern FLATPTR WINAPI VidMemAlloc( LPVMEMHEAP pvmh, DWORD width, DWORD height);

extern FLATPTR WINAPI 
       HeapVidMemAllocAligned(
                               LPVIDMEM lpVidMem,
                               DWORD dwWidth,
                               DWORD dwHeight,
                               LPSURFACEALIGNMENT lpAlignment ,
                               LPLONG lpNewPitch );






#ifdef __cplusplus
};
#endif

#endif
