text: #pragma once
  
  #include "d3d8types.h"
  
  /****************************************************************************
  * Flags for SetPrivateData method on all D3D8 interfaces
  *
  * The passed pointer is an IUnknown ptr. The SizeOfData argument to SetPrivateData
  * must be set to sizeof(IUnknown*). Direct3D will call AddRef through this
  * pointer and Release when the private data is destroyed. The data will be
  * destroyed when another SetPrivateData with the same GUID is set, when
  * FreePrivateData is called, or when the D3D8 object is freed.
  ****************************************************************************/
  #define D3DSPD_IUNKNOWN                         0x00000001L
  
  /****************************************************************************
  *
  * Parameter for IDirect3D8 Enum and GetCaps8 functions to get the info for
  * the current mode only.
  *
  ****************************************************************************/
  
  #define D3DCURRENT_DISPLAY_MODE                 0x00EFFFFFL
  
  /****************************************************************************
  *
  * Flags for IDirect3D8::CreateDevice's BehaviorFlags
  *
  ****************************************************************************/
  
  #define D3DCREATE_FPU_PRESERVE                  0x00000002L
  #define D3DCREATE_MULTITHREADED                 0x00000004L
  
  #define D3DCREATE_PUREDEVICE                    0x00000010L
  #define D3DCREATE_SOFTWARE_VERTEXPROCESSING     0x00000020L
  #define D3DCREATE_HARDWARE_VERTEXPROCESSING     0x00000040L
  #define D3DCREATE_MIXED_VERTEXPROCESSING        0x00000080L
  
  #define D3DCREATE_DISABLE_DRIVER_MANAGEMENT     0x00000100L
  
  
  /****************************************************************************
  *
  * Parameter for IDirect3D8::CreateDevice's iAdapter
  *
  ****************************************************************************/
  
  #define D3DADAPTER_DEFAULT                     0
  
  /****************************************************************************
  *
  * Flags for IDirect3D8::EnumAdapters
  *
  ****************************************************************************/
  
  #define D3DENUM_NO_WHQL_LEVEL                   0x00000002L
  
  /****************************************************************************
  *
  * Maximum number of back-buffers supported in DX8
  *
  ****************************************************************************/
  
  #define D3DPRESENT_BACK_BUFFERS_MAX             3L
  
  /****************************************************************************
  *
  * Flags for IDirect3DDevice8::SetGammaRamp
  *
  ****************************************************************************/
  
  #define D3DSGR_NO_CALIBRATION                  0x00000000L
  #define D3DSGR_CALIBRATE                       0x00000001L
  
  /****************************************************************************
  *
  * Flags for IDirect3DDevice8::SetCursorPosition
  *
  ****************************************************************************/
  
  #define D3DCURSOR_IMMEDIATE_UPDATE             0x00000001L
  
  /****************************************************************************
  *
  * Flags for DrawPrimitive/DrawIndexedPrimitive
  *   Also valid for Begin/BeginIndexed
  *   Also valid for VertexBuffer::CreateVertexBuffer
  ****************************************************************************/
  
  
  /*
  *  DirectDraw error codes
  */
  #define _FACD3D  0x876
  #define MAKE_D3DHRESULT( code )  MAKE_HRESULT( 1, _FACD3D, code )
  
  /*
  * Direct3D Errors
  */
  #define D3D_OK                              S_OK
  
  #define D3DERR_WRONGTEXTUREFORMAT               MAKE_D3DHRESULT(2072)
  #define D3DERR_UNSUPPORTEDCOLOROPERATION        MAKE_D3DHRESULT(2073)
  #define D3DERR_UNSUPPORTEDCOLORARG              MAKE_D3DHRESULT(2074)
  #define D3DERR_UNSUPPORTEDALPHAOPERATION        MAKE_D3DHRESULT(2075)
  #define D3DERR_UNSUPPORTEDALPHAARG              MAKE_D3DHRESULT(2076)
  #define D3DERR_TOOMANYOPERATIONS                MAKE_D3DHRESULT(2077)
  #define D3DERR_CONFLICTINGTEXTUREFILTER         MAKE_D3DHRESULT(2078)
  #define D3DERR_UNSUPPORTEDFACTORVALUE           MAKE_D3DHRESULT(2079)
  #define D3DERR_CONFLICTINGRENDERSTATE           MAKE_D3DHRESULT(2081)
  #define D3DERR_UNSUPPORTEDTEXTUREFILTER         MAKE_D3DHRESULT(2082)
  #define D3DERR_CONFLICTINGTEXTUREPALETTE        MAKE_D3DHRESULT(2086)
  #define D3DERR_DRIVERINTERNALERROR              MAKE_D3DHRESULT(2087)
  
  #define D3DERR_NOTFOUND                         MAKE_D3DHRESULT(2150)
  #define D3DERR_MOREDATA                         MAKE_D3DHRESULT(2151)
  #define D3DERR_DEVICELOST                       MAKE_D3DHRESULT(2152)
  #define D3DERR_DEVICENOTRESET                   MAKE_D3DHRESULT(2153)
  #define D3DERR_NOTAVAILABLE                     MAKE_D3DHRESULT(2154)
  #define D3DERR_OUTOFVIDEOMEMORY                 MAKE_D3DHRESULT(380)
  #define D3DERR_INVALIDDEVICE                    MAKE_D3DHRESULT(2155)
  #define D3DERR_INVALIDCALL                      MAKE_D3DHRESULT(2156)
  #define D3DERR_DRIVERINVALIDCALL                MAKE_D3DHRESULT(2157)
  
  #define D3DFMT_W11V11U10 65
  
  #define D3DRS_LINEPATTERN 10
  #define D3DRS_ZVISIBLE 30
  #define D3DRS_EDGEANTIALIAS 40
  #define D3DRS_ZBIAS 47
  #define D3DRS_SOFTWAREVERTEXPROCESSING 153
  #define D3DRS_PATCHSEGMENTS 164
  
  /*#define D3DTSS_ADDRESSU 13
  #define D3DTSS_ADDRESSV 14
  #define D3DTSS_ADDRESSW 25
  #define D3DTSS_BORDERCOLOR 15
  #define D3DTSS_MAGFILTER 16
  #define D3DTSS_MINFILTER 17
  #define D3DTSS_MIPFILTER 18
  #define D3DTSS_MIPMAPLODBIAS 19
  #define D3DTSS_MAXMIPLEVEL 20
  #define D3DTSS_MAXANISOTROPY 21*/
  
  #define D3DVSD_TOKEN_STREAM 1
  #define D3DVSD_TOKEN_STREAMDATA 2
  #define D3DVSD_TOKEN_TESSELLATOR 3
  #define D3DVSD_TOKEN_CONSTMEM 4
  #define D3DVSD_TOKENTYPESHIFT 29
  //#define D3DVSD_TOKENTYPEMASK (0x7 << D3DVSD_TOKENTYPESHIFT)
  #define D3DVSD_STREAMNUMBERSHIFT 0
  #define D3DVSD_STREAMNUMBERMASK (0xF << D3DVSD_STREAMNUMBERSHIFT)
  #define D3DVSD_VERTEXREGSHIFT 0
  #define D3DVSD_VERTEXREGMASK (0x1F << D3DVSD_VERTEXREGSHIFT)
  #define D3DVSD_VERTEXREGINSHIFT 20
  #define D3DVSD_VERTEXREGINMASK (0xF << D3DVSD_VERTEXREGINSHIFT)
  #define D3DVSD_DATATYPESHIFT 16
  #define D3DVSD_DATATYPEMASK (0xF << D3DVSD_DATATYPESHIFT)
  #define D3DVSD_SKIPCOUNTSHIFT 16
  #define D3DVSD_SKIPCOUNTMASK (0xF << D3DVSD_SKIPCOUNTSHIFT)
  #define D3DVSD_CONSTCOUNTSHIFT 25
  #define D3DVSD_CONSTCOUNTMASK (0xF << D3DVSD_CONSTCOUNTSHIFT)
  #define D3DVSD_CONSTADDRESSSHIFT 0
  #define D3DVSD_CONSTADDRESSMASK (0x7F << D3DVSD_CONSTADDRESSSHIFT)
  #define D3DVSD_END() 0xFFFFFFFF
  
  #define D3DENUM_NO_WHQL_LEVEL 0x00000002L
  #define D3DSWAPEFFECT_COPY_VSYNC 4
  //#define D3DPRESENT_RATE_UNLIMITED 0x7FFFFFFF
  
  //
  // BIT DEFINES FOR D3DCAPS8 DWORD MEMBERS
  //
  
  //
  // Caps
  //
  #define D3DCAPS_READ_SCANLINE           0x00020000L
  
  //
  // Caps2
  //
  #define D3DCAPS2_NO2DDURING3DSCENE      0x00000002L
  #define D3DCAPS2_FULLSCREENGAMMA        0x00020000L
  #define D3DCAPS2_CANRENDERWINDOWED      0x00080000L
  #define D3DCAPS2_CANCALIBRATEGAMMA      0x00100000L
  #define D3DCAPS2_RESERVED               0x02000000L
  #define D3DCAPS2_CANMANAGERESOURCE      0x10000000L
  #define D3DCAPS2_DYNAMICTEXTURES        0x20000000L
  
  //
  // Caps3
  //
  #define D3DCAPS3_RESERVED               0x8000001fL
  
  // Indicates that the device can respect the ALPHABLENDENABLE render state
  // when fullscreen while using the FLIP or DISCARD swap effect.
  // COPY and COPYVSYNC swap effects work whether or not this flag is set.
  #define D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD   0x00000020L
  
  //
  // PresentationIntervals
  //
  #define D3DPRESENT_INTERVAL_DEFAULT     0x00000000L
  #define D3DPRESENT_INTERVAL_ONE         0x00000001L
  #define D3DPRESENT_INTERVAL_TWO         0x00000002L
  #define D3DPRESENT_INTERVAL_THREE       0x00000004L
  #define D3DPRESENT_INTERVAL_FOUR        0x00000008L
  #define D3DPRESENT_INTERVAL_IMMEDIATE   0x80000000L
  
  //
  // CursorCaps
  //
  // Driver supports HW color cursor in at least hi-res modes(height >=400)
  #define D3DCURSORCAPS_COLOR             0x00000001L
  // Driver supports HW cursor also in low-res modes(height < 400)
  #define D3DCURSORCAPS_LOWRES            0x00000002L
  
  //
  // DevCaps
  //
  #define D3DDEVCAPS_EXECUTESYSTEMMEMORY  0x00000010L /* Device can use execute buffers from system memory */
  #define D3DDEVCAPS_EXECUTEVIDEOMEMORY   0x00000020L /* Device can use execute buffers from video memory */
  #define D3DDEVCAPS_TLVERTEXSYSTEMMEMORY 0x00000040L /* Device can use TL buffers from system memory */
  #define D3DDEVCAPS_TLVERTEXVIDEOMEMORY  0x00000080L /* Device can use TL buffers from video memory */
  #define D3DDEVCAPS_TEXTURESYSTEMMEMORY  0x00000100L /* Device can texture from system memory */
  #define D3DDEVCAPS_TEXTUREVIDEOMEMORY   0x00000200L /* Device can texture from device memory */
  #define D3DDEVCAPS_DRAWPRIMTLVERTEX     0x00000400L /* Device can draw TLVERTEX primitives */
  #define D3DDEVCAPS_CANRENDERAFTERFLIP   0x00000800L /* Device can render without waiting for flip to complete */
  #define D3DDEVCAPS_TEXTURENONLOCALVIDMEM 0x00001000L /* Device can texture from nonlocal video memory */
  #define D3DDEVCAPS_DRAWPRIMITIVES2      0x00002000L /* Device can support DrawPrimitives2 */
  #define D3DDEVCAPS_SEPARATETEXTUREMEMORIES 0x00004000L /* Device is texturing from separate memory pools */
  #define D3DDEVCAPS_DRAWPRIMITIVES2EX    0x00008000L /* Device can support Extended DrawPrimitives2 i.e. DX7 compliant driver*/
  #define D3DDEVCAPS_HWTRANSFORMANDLIGHT  0x00010000L /* Device can support transformation and lighting in hardware and DRAWPRIMITIVES2EX must be also */
  #define D3DDEVCAPS_CANBLTSYSTONONLOCAL  0x00020000L /* Device supports a Tex Blt from system memory to non-local vidmem */
  #define D3DDEVCAPS_HWRASTERIZATION      0x00080000L /* Device has HW acceleration for rasterization */
  #define D3DDEVCAPS_PUREDEVICE           0x00100000L /* Device supports D3DCREATE_PUREDEVICE */
  #define D3DDEVCAPS_QUINTICRTPATCHES     0x00200000L /* Device supports quintic Beziers and BSplines */
  #define D3DDEVCAPS_RTPATCHES            0x00400000L /* Device supports Rect and Tri patches */
  #define D3DDEVCAPS_RTPATCHHANDLEZERO    0x00800000L /* Indicates that RT Patches may be drawn efficiently using handle 0 */
  #define D3DDEVCAPS_NPATCHES             0x01000000L /* Device supports N-Patches */
  
  //
  // PrimitiveMiscCaps
  //
  #define D3DPMISCCAPS_MASKZ              0x00000002L
  #define D3DPMISCCAPS_LINEPATTERNREP     0x00000004L
  #define D3DPMISCCAPS_CULLNONE           0x00000010L
  #define D3DPMISCCAPS_CULLCW             0x00000020L
  #define D3DPMISCCAPS_CULLCCW            0x00000040L
  #define D3DPMISCCAPS_COLORWRITEENABLE   0x00000080L
  #define D3DPMISCCAPS_CLIPPLANESCALEDPOINTS 0x00000100L /* Device correctly clips scaled points to clip planes */
  #define D3DPMISCCAPS_CLIPTLVERTS        0x00000200L /* device will clip post-transformed vertex primitives */
  #define D3DPMISCCAPS_TSSARGTEMP         0x00000400L /* device supports D3DTA_TEMP for temporary register */
  #define D3DPMISCCAPS_BLENDOP            0x00000800L /* device supports D3DRS_BLENDOP */
  #define D3DPMISCCAPS_NULLREFERENCE      0x00001000L /* Reference Device that doesnt render */
  
  //
  // LineCaps
  //
  #define D3DLINECAPS_TEXTURE             0x00000001L
  #define D3DLINECAPS_ZTEST               0x00000002L
  #define D3DLINECAPS_BLEND               0x00000004L
  #define D3DLINECAPS_ALPHACMP            0x00000008L
  #define D3DLINECAPS_FOG                 0x00000010L
  
  //
  // RasterCaps
  //
  #define D3DPRASTERCAPS_DITHER           0x00000001L
  #define D3DPRASTERCAPS_PAT              0x00000008L
  #define D3DPRASTERCAPS_ZTEST            0x00000010L
  #define D3DPRASTERCAPS_FOGVERTEX        0x00000080L
  #define D3DPRASTERCAPS_FOGTABLE         0x00000100L
  #define D3DPRASTERCAPS_ANTIALIASEDGES   0x00001000L
  #define D3DPRASTERCAPS_MIPMAPLODBIAS    0x00002000L
  #define D3DPRASTERCAPS_ZBIAS            0x00004000L
  #define D3DPRASTERCAPS_ZBUFFERLESSHSR   0x00008000L
  #define D3DPRASTERCAPS_FOGRANGE         0x00010000L
  #define D3DPRASTERCAPS_ANISOTROPY       0x00020000L
  #define D3DPRASTERCAPS_WBUFFER          0x00040000L
  #define D3DPRASTERCAPS_WFOG             0x00100000L
  #define D3DPRASTERCAPS_ZFOG             0x00200000L
  #define D3DPRASTERCAPS_COLORPERSPECTIVE 0x00400000L /* Device iterates colors perspective correct */
  #define D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE  0x00800000L
  
  //
  // ZCmpCaps, AlphaCmpCaps
  //
  #define D3DPCMPCAPS_NEVER               0x00000001L
  #define D3DPCMPCAPS_LESS                0x00000002L
  #define D3DPCMPCAPS_EQUAL               0x00000004L
  #define D3DPCMPCAPS_LESSEQUAL           0x00000008L
  #define D3DPCMPCAPS_GREATER             0x00000010L
  #define D3DPCMPCAPS_NOTEQUAL            0x00000020L
  #define D3DPCMPCAPS_GREATEREQUAL        0x00000040L
  #define D3DPCMPCAPS_ALWAYS              0x00000080L
  
  //
  // SourceBlendCaps, DestBlendCaps
  //
  #define D3DPBLENDCAPS_ZERO              0x00000001L
  #define D3DPBLENDCAPS_ONE               0x00000002L
  #define D3DPBLENDCAPS_SRCCOLOR          0x00000004L
  #define D3DPBLENDCAPS_INVSRCCOLOR       0x00000008L
  #define D3DPBLENDCAPS_SRCALPHA          0x00000010L
  #define D3DPBLENDCAPS_INVSRCALPHA       0x00000020L
  #define D3DPBLENDCAPS_DESTALPHA         0x00000040L
  #define D3DPBLENDCAPS_INVDESTALPHA      0x00000080L
  #define D3DPBLENDCAPS_DESTCOLOR         0x00000100L
  #define D3DPBLENDCAPS_INVDESTCOLOR      0x00000200L
  #define D3DPBLENDCAPS_SRCALPHASAT       0x00000400L
  #define D3DPBLENDCAPS_BOTHSRCALPHA      0x00000800L
  #define D3DPBLENDCAPS_BOTHINVSRCALPHA   0x00001000L
  
  //
  // ShadeCaps
  //
  #define D3DPSHADECAPS_COLORGOURAUDRGB       0x00000008L
  #define D3DPSHADECAPS_SPECULARGOURAUDRGB    0x00000200L
  #define D3DPSHADECAPS_ALPHAGOURAUDBLEND     0x00004000L
  #define D3DPSHADECAPS_FOGGOURAUD            0x00080000L
  
  //
  // TextureCaps
  //
  #define D3DPTEXTURECAPS_PERSPECTIVE         0x00000001L /* Perspective-correct texturing is supported */
  #define D3DPTEXTURECAPS_POW2                0x00000002L /* Power-of-2 texture dimensions are required - applies to non-Cube/Volume textures only. */
  #define D3DPTEXTURECAPS_ALPHA               0x00000004L /* Alpha in texture pixels is supported */
  #define D3DPTEXTURECAPS_SQUAREONLY          0x00000020L /* Only square textures are supported */
  #define D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE 0x00000040L /* Texture indices are not scaled by the texture size prior to interpolation */
  #define D3DPTEXTURECAPS_ALPHAPALETTE        0x00000080L /* Device can draw alpha from texture palettes */
  // Device can use non-POW2 textures if:
  //  1) D3DTEXTURE_ADDRESS is set to CLAMP for this texture's stage
  //  2) D3DRS_WRAP(N) is zero for this texture's coordinates
  //  3) mip mapping is not enabled (use magnification filter only)
  #define D3DPTEXTURECAPS_NONPOW2CONDITIONAL  0x00000100L
  #define D3DPTEXTURECAPS_PROJECTED           0x00000400L /* Device can do D3DTTFF_PROJECTED */
  #define D3DPTEXTURECAPS_CUBEMAP             0x00000800L /* Device can do cubemap textures */
  #define D3DPTEXTURECAPS_VOLUMEMAP           0x00002000L /* Device can do volume textures */
  #define D3DPTEXTURECAPS_MIPMAP              0x00004000L /* Device can do mipmapped textures */
  #define D3DPTEXTURECAPS_MIPVOLUMEMAP        0x00008000L /* Device can do mipmapped volume textures */
  #define D3DPTEXTURECAPS_MIPCUBEMAP          0x00010000L /* Device can do mipmapped cube maps */
  #define D3DPTEXTURECAPS_CUBEMAP_POW2        0x00020000L /* Device requires that cubemaps be power-of-2 dimension */
  #define D3DPTEXTURECAPS_VOLUMEMAP_POW2      0x00040000L /* Device requires that volume maps be power-of-2 dimension */
  
  //
  // TextureFilterCaps
  //
  #define D3DPTFILTERCAPS_MINFPOINT           0x00000100L /* Min Filter */
  #define D3DPTFILTERCAPS_MINFLINEAR          0x00000200L
  #define D3DPTFILTERCAPS_MINFANISOTROPIC     0x00000400L
  #define D3DPTFILTERCAPS_MIPFPOINT           0x00010000L /* Mip Filter */
  #define D3DPTFILTERCAPS_MIPFLINEAR          0x00020000L
  #define D3DPTFILTERCAPS_MAGFPOINT           0x01000000L /* Mag Filter */
  #define D3DPTFILTERCAPS_MAGFLINEAR          0x02000000L
  #define D3DPTFILTERCAPS_MAGFANISOTROPIC     0x04000000L
  #define D3DPTFILTERCAPS_MAGFAFLATCUBIC      0x08000000L
  #define D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC   0x10000000L
  
  //
  // TextureAddressCaps
  //
  #define D3DPTADDRESSCAPS_WRAP           0x00000001L
  #define D3DPTADDRESSCAPS_MIRROR         0x00000002L
  #define D3DPTADDRESSCAPS_CLAMP          0x00000004L
  #define D3DPTADDRESSCAPS_BORDER         0x00000008L
  #define D3DPTADDRESSCAPS_INDEPENDENTUV  0x00000010L
  #define D3DPTADDRESSCAPS_MIRRORONCE     0x00000020L
  
  //
  // StencilCaps
  //
  #define D3DSTENCILCAPS_KEEP             0x00000001L
  #define D3DSTENCILCAPS_ZERO             0x00000002L
  #define D3DSTENCILCAPS_REPLACE          0x00000004L
  #define D3DSTENCILCAPS_INCRSAT          0x00000008L
  #define D3DSTENCILCAPS_DECRSAT          0x00000010L
  #define D3DSTENCILCAPS_INVERT           0x00000020L
  #define D3DSTENCILCAPS_INCR             0x00000040L
  #define D3DSTENCILCAPS_DECR             0x00000080L
  
  //
  // TextureOpCaps
  //
  #define D3DTEXOPCAPS_DISABLE                    0x00000001L
  #define D3DTEXOPCAPS_SELECTARG1                 0x00000002L
  #define D3DTEXOPCAPS_SELECTARG2                 0x00000004L
  #define D3DTEXOPCAPS_MODULATE                   0x00000008L
  #define D3DTEXOPCAPS_MODULATE2X                 0x00000010L
  #define D3DTEXOPCAPS_MODULATE4X                 0x00000020L
  #define D3DTEXOPCAPS_ADD                        0x00000040L
  #define D3DTEXOPCAPS_ADDSIGNED                  0x00000080L
  #define D3DTEXOPCAPS_ADDSIGNED2X                0x00000100L
  #define D3DTEXOPCAPS_SUBTRACT                   0x00000200L
  #define D3DTEXOPCAPS_ADDSMOOTH                  0x00000400L
  #define D3DTEXOPCAPS_BLENDDIFFUSEALPHA          0x00000800L
  #define D3DTEXOPCAPS_BLENDTEXTUREALPHA          0x00001000L
  #define D3DTEXOPCAPS_BLENDFACTORALPHA           0x00002000L
  #define D3DTEXOPCAPS_BLENDTEXTUREALPHAPM        0x00004000L
  #define D3DTEXOPCAPS_BLENDCURRENTALPHA          0x00008000L
  #define D3DTEXOPCAPS_PREMODULATE                0x00010000L
  #define D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR     0x00020000L
  #define D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA     0x00040000L
  #define D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR  0x00080000L
  #define D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA  0x00100000L
  #define D3DTEXOPCAPS_BUMPENVMAP                 0x00200000L
  #define D3DTEXOPCAPS_BUMPENVMAPLUMINANCE        0x00400000L
  #define D3DTEXOPCAPS_DOTPRODUCT3                0x00800000L
  #define D3DTEXOPCAPS_MULTIPLYADD                0x01000000L
  #define D3DTEXOPCAPS_LERP                       0x02000000L
  
  //
  // FVFCaps
  //
  #define D3DFVFCAPS_TEXCOORDCOUNTMASK    0x0000ffffL /* mask for texture coordinate count field */
  #define D3DFVFCAPS_DONOTSTRIPELEMENTS   0x00080000L /* Device prefers that vertex elements not be stripped */
  #define D3DFVFCAPS_PSIZE                0x00100000L /* Device can receive point size */
  
  //
  // VertexProcessingCaps
  //
  #define D3DVTXPCAPS_TEXGEN              0x00000001L /* device can do texgen */
  #define D3DVTXPCAPS_MATERIALSOURCE7     0x00000002L /* device can do DX7-level colormaterialsource ops */
  #define D3DVTXPCAPS_DIRECTIONALLIGHTS   0x00000008L /* device can do directional lights */
  #define D3DVTXPCAPS_POSITIONALLIGHTS    0x00000010L /* device can do positional lights (includes point and spot) */
  #define D3DVTXPCAPS_LOCALVIEWER         0x00000020L /* device can do local viewer */
  #define D3DVTXPCAPS_TWEENING            0x00000040L /* device can do vertex tweening */
  #define D3DVTXPCAPS_NO_VSDT_UBYTE4      0x00000080L /* device does not support D3DVSDT_UBYTE4 */
  
  struct D3DCAPS8
  {
  	D3DDEVTYPE DeviceType;
  	UINT AdapterOrdinal;
  	DWORD Caps, Caps2, Caps3;
  	DWORD PresentationIntervals;
  	DWORD CursorCaps;
  	DWORD DevCaps;
  	DWORD PrimitiveMiscCaps;
  	DWORD RasterCaps;
  	DWORD ZCmpCaps;
  	DWORD SrcBlendCaps;
  	DWORD DestBlendCaps;
  	DWORD AlphaCmpCaps;
  	DWORD ShadeCaps;
  	DWORD TextureCaps;
  	DWORD TextureFilterCaps;
  	DWORD CubeTextureFilterCaps;
  	DWORD VolumeTextureFilterCaps;
  	DWORD TextureAddressCaps;
  	DWORD VolumeTextureAddressCaps;
  	DWORD LineCaps;
  	DWORD MaxTextureWidth, MaxTextureHeight;
  	DWORD MaxVolumeExtent;
  	DWORD MaxTextureRepeat;
  	DWORD MaxTextureAspectRatio;
  	DWORD MaxAnisotropy;
  	float MaxVertexW;
  	float GuardBandLeft, GuardBandTop, GuardBandRight, GuardBandBottom;
  	float ExtentsAdjust;
  	DWORD StencilCaps;
  	DWORD FVFCaps;
  	DWORD TextureOpCaps;
  	DWORD MaxTextureBlendStages;
  	DWORD MaxSimultaneousTextures;
  	DWORD VertexProcessingCaps;
  	DWORD MaxActiveLights;
  	DWORD MaxUserClipPlanes;
  	DWORD MaxVertexBlendMatrices;
  	DWORD MaxVertexBlendMatrixIndex;
  	float MaxPointSize;
  	DWORD MaxPrimitiveCount;
  	DWORD MaxVertexIndex;
  	DWORD MaxStreams;
  	DWORD MaxStreamStride;
  	DWORD VertexShaderVersion;
  	DWORD MaxVertexShaderConst;
  	DWORD PixelShaderVersion;
  	float MaxPixelShaderValue;
  };
  
  struct D3DVOLUME_DESC8
  {
  	D3DFORMAT Format;
  	D3DRESOURCETYPE Type;
  	DWORD Usage;
  	D3DPOOL Pool;
  	UINT Size;
  	UINT Width, Height, Depth;
  };
  
  struct D3DSURFACE_DESC8
  {
  	D3DFORMAT Format;
  	D3DRESOURCETYPE Type;
  	DWORD Usage;
  	D3DPOOL Pool;
  	UINT Size;
  	D3DMULTISAMPLE_TYPE MultiSampleType;
  	UINT Width, Height;
  };
  
  struct D3DPRESENT_PARAMETERS8
  {
  	UINT BackBufferWidth, BackBufferHeight;
  	D3DFORMAT BackBufferFormat;
  	UINT BackBufferCount;
  	D3DMULTISAMPLE_TYPE MultiSampleType;
  	D3DSWAPEFFECT SwapEffect;
  	HWND hDeviceWindow;
  	BOOL Windowed;
  	BOOL EnableAutoDepthStencil;
  	D3DFORMAT AutoDepthStencilFormat;
  	DWORD Flags;
  	UINT FullScreen_RefreshRateInHz, FullScreen_PresentationInterval;
  };
  
  UINT calc_texture_size(UINT Width, UINT Height, UINT Depth, D3DFORMAT Format);
  bool supports_palettes();
  