00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 #ifndef DXGSGBASE_H
00020 #define DXGSGBASE_H
00021 
00022 
00023 
00024 #define _WIN32_WINNT 0x0502
00025 
00026 #define WIN32_LEAN_AND_MEAN   // get rid of mfc win32 hdr stuff
00027 #ifndef STRICT
00028 
00029 #define STRICT
00030 #endif
00031 
00032 #include <windows.h>
00033 #include <ddraw.h>
00034 
00035 #define D3D_OVERLOADS   //  get D3DVECTOR '+' operator, etc from d3dtypes.h
00036 #include <d3d.h>
00037 #undef WIN32_LEAN_AND_MEAN
00038 
00039 #if DIRECT3D_VERSION != 0x0700
00040 #error DX7 headers not available, you need to install MS Platform SDK or DirectX 8+ SDK!
00041 #endif
00042 
00043 #include "pandabase.h"
00044 
00045 
00046 #pragma warning (disable : 4201)
00047 
00048 
00049 
00050 
00051 #ifdef USE_TEXFMTVEC
00052 typedef pvector<DDPIXELFORMAT> DDPixelFormatVec;
00053 #else
00054 #define MAX_DX_TEXPIXFMTS 20    // should be enough for any card
00055 #endif
00056 
00057 #define ISPOW2(X) (((X) & ((X)-1))==0)
00058 
00059 #define DX_DECLARE_CLEAN(type, var) \
00060     type var;                       \
00061     ZeroMemory(&var, sizeof(type)); \
00062     var.dwSize = sizeof(type);
00063 
00064 #define SAFE_DELETE(p)       { if(p) { delete (p);     (p)=NULL; } }
00065 #define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p);   (p)=NULL; } }
00066 #define SAFE_FREELIB(hDLL)   { if(hDLL!=NULL) { FreeLibrary(hDLL); hDLL = NULL; } }
00067 #define IS_VALID_PTR(PTR)  (!IsBadWritePtr(PTR,sizeof(void*)))
00068 
00069 
00070 #define RELEASE_DOWN_TO_ZERO true
00071 #define RELEASE_ONCE false
00072 
00073 #define DEBUG_RELEASES
00074 
00075 #ifdef DEBUG_RELEASES
00076 #define RELEASE(OBJECT,MODULE,DBGSTR,bDoDownToZero)             \
00077    if(((OBJECT)!=NULL)&&(!IsBadWritePtr((OBJECT),4))) {         \
00078         refcnt = (OBJECT)->Release();                           \
00079         MODULE##_cat.debug() << DBGSTR << " released, refcnt = " << refcnt << endl;  \
00080         if((bDoDownToZero) && (refcnt>0)) {                     \
00081               MODULE##_cat.warning() << DBGSTR << " released but still has a non-zero refcnt(" << refcnt << "), multi-releasing it down to zero!\n"; \
00082               do {                                \
00083                 refcnt = (OBJECT)->Release();     \
00084               } while(refcnt>0);                  \
00085         }                                         \
00086         (OBJECT) = NULL;                          \
00087       } else {                                    \
00088         MODULE##_cat.debug() << DBGSTR << " not released, ptr == NULL" << endl;  \
00089       } 
00090 
00091 #define PRINTREFCNT(OBJECT,STR)  {  (OBJECT)->AddRef();  dxgsg7_cat.debug() << STR << " refcnt = " << (OBJECT)->Release() << endl; }
00092 #else
00093 #define RELEASE(OBJECT,MODULE,DBGSTR,bDoDownToZero)     \
00094    if(((OBJECT)!=NULL)&&(!IsBadWritePtr((OBJECT),4))) { \
00095         refcnt=(OBJECT)->Release();                     \
00096         if((bDoDownToZero) && (refcnt>0)) {             \
00097               MODULE##_cat.warning() << DBGSTR << " released but still has a non-zero refcnt(" << refcnt << "), multi-releasing it down to zero!\n"; \
00098               do {                                \
00099                 refcnt = (OBJECT)->Release();     \
00100               } while(refcnt>0);                  \
00101         }                                         \
00102         (OBJECT) = NULL;                          \
00103    }
00104 
00105 #define PRINTREFCNT(OBJECT,STR)  
00106 #endif    
00107 
00108 #ifdef DO_PSTATS
00109 #define DO_PSTATS_STUFF(XX) XX;
00110 #else
00111 #define DO_PSTATS_STUFF(XX)
00112 #endif
00113 
00114 const char *ConvD3DErrorToString(HRESULT error);
00115 
00116 typedef struct {
00117       LPDIRECT3DDEVICE7 pD3DDevice;
00118       LPDIRECTDRAW7     pDD;
00119       LPDIRECT3D7       pD3D;
00120       LPDIRECTDRAWSURFACE7 pddsPrimary,pddsBack,pddsZBuf;
00121       HWND              hWnd;
00122       HMONITOR          hMon;
00123       DWORD             dwRenderWidth,dwRenderHeight,dwFullScreenBitDepth;
00124       RECT              view_rect,clip_rect;
00125       DWORD             MaxAvailVidMem;
00126       bool              bIsLowVidMemCard;
00127       bool              bIsTNLDevice;
00128       bool              bIsSWRast;
00129       bool              bIsFullScreen;
00130       WORD              depth_buffer_bitdepth;  
00131       WORD              CardIDNum;  
00132       DDDEVICEIDENTIFIER2 DXDeviceID;
00133       D3DDEVICEDESC7    D3DDevDesc;
00134 #ifdef USE_TEXFMTVEC
00135       DDPixelFormatVec  TexPixFmts;
00136 #endif
00137 } DXScreenData;
00138 #endif
00139