DRVMGR.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:16k
源码类别:

Windows编程

开发平台:

Visual C++

  1. #ifndef DRVMGR_H
  2. #define DRVMGR_H
  3. /*
  4. **-----------------------------------------------------------------------------
  5. **  Name:       DrvMgr.h
  6. **  Purpose:    Creates and manages DD/D3D drivers static info
  7. **
  8. **  Copyright (c) 1995 - 1997 by Microsoft, all rights reserved
  9. **-----------------------------------------------------------------------------
  10. */
  11. /*
  12. **-----------------------------------------------------------------------------
  13. **  Includes
  14. **-----------------------------------------------------------------------------
  15. */
  16. #include "Common.h"
  17. /*
  18. **-----------------------------------------------------------------------------
  19. **  Defines
  20. **-----------------------------------------------------------------------------
  21. */
  22. // DD Driver Flags
  23. #define DDDRV_INIT 0x00000001L
  24. #define DDDRV_VALID 0x00000001L
  25. #define DDDRV_PRIMARY 0x00000002L
  26. #define DDDRV_D3D 0x00000004L
  27. #define DDDRV_MODES_LOADED 0x00000008L
  28. #define DDDRV_DEVICES_LOADED 0x00000010L
  29. // D3D Device Flags
  30. #define D3DDEV_VALID 0x00000001L
  31. #define D3DDEV_FORMATS_LOADED 0x00000002L
  32. /*
  33. **-----------------------------------------------------------------------------
  34. **  Typedefs
  35. **-----------------------------------------------------------------------------
  36. */
  37. // Forward declarations
  38. class DDModeInfo;
  39. typedef DDModeInfo * LPDDModeInfo;
  40. class D3DDevInfo;
  41. typedef D3DDevInfo * LPD3DDevInfo;
  42. class DDDrvInfo;
  43. typedef DDDrvInfo * LPDDDrvInfo;
  44. class DDDrvMgr;
  45. typedef DDDrvMgr * LPDDDrvMgr;
  46. // Enumeration Callback Info
  47. #define ENUM_STOP  0x80000000L
  48. typedef enum {
  49.     ENUM_ERROR    = 0,
  50.     ENUM_FAILURE  = 1,
  51.     ENUM_SUCCESS  = 2
  52. };
  53. // Callback function prototypes
  54. typedef DWORD (*ENUMDDDRVCALLBACK)(LPVOID lpDriver, LPVOID lpData, DWORD dwExtra);
  55. typedef DWORD (*ENUMD3DDEVCALLBACK)(LPVOID lpDevice, LPVOID lpData, DWORD dwExtra);
  56. // Enum Driver Callback Info
  57. typedef struct tagDDDRV_ENUMINFO
  58. {
  59.     void *              lpStart;        // Starting Node
  60.     ENUMDDDRVCALLBACK   fpcbEnum;       // Enumeration Callback function
  61.     DWORD               dwExtra;        // User defined extra data for callback
  62. } DDDRV_ENUMINFO;
  63. typedef DDDRV_ENUMINFO * LPDDDRV_ENUMINFO;
  64. // Enum D3D Device Callback Info
  65. typedef struct tagD3DDEV_ENUMINFO
  66. {
  67.     void *              lpStart;        // Starting Node
  68.     ENUMD3DDEVCALLBACK  fpcbEnum;       // Enumeration Callback function
  69.     DWORD               dwExtra;        // User defined extra data for callback
  70. } D3DDEV_ENUMINFO;
  71. typedef D3DDEV_ENUMINFO * LPD3DDEV_ENUMINFO;
  72. /*
  73. **-----------------------------------------------------------------------------
  74. **  Functions
  75. **-----------------------------------------------------------------------------
  76. */
  77. LPDDDrvInfo ValidateDriver (LPGUID lpDDGuid);
  78. LPDDModeInfo ValidateMode (LPDDDrvInfo lpDriver, DWORD w, DWORD h,
  79.    DWORD bpp, DWORD refresh, LPD3DDevInfo lpFilter);
  80. LPD3DDevInfo ValidateDevice (LPDDDrvInfo lpDriver, LPGUID lpD3DGuid,
  81.      LPDDModeInfo lpFilter);
  82. BOOL GetDesktopMode (LPDDDrvInfo lpDriver, LPGUID lpD3DGuid,
  83.  LPDDModeInfo * lpMode, LPD3DDevInfo * lpDev);
  84. BOOL GetFullscreenMode (LPDDDrvInfo lpDriver,  LPGUID lpD3DGuid,
  85. DWORD w, DWORD h, DWORD bpp, DWORD refresh,
  86.     LPDDModeInfo * lpMode, LPD3DDevInfo * lpDev);
  87. HRESULT ChooseDriverDefaults (LPGUID lpGuidDD, DWORD w, DWORD h,
  88.   DWORD bpp, DWORD refresh, LPGUID lpGuidD3D,
  89.   BOOL fFullScreen, LPDDDrvInfo * lpDriver,
  90.   LPDDModeInfo * lpMode, LPD3DDevInfo * lpDevice);
  91. DWORD FlagsToBitDepth (DWORD dwFlags);
  92. DWORD BitDepthToFlags (DWORD dwBPP);
  93. BOOL  isPalettized (LPDDPIXELFORMAT lpddpf);
  94. /*
  95. **-----------------------------------------------------------------------------
  96. **  Classes
  97. **-----------------------------------------------------------------------------
  98. */
  99. /*
  100. **-----------------------------------------------------------------------------
  101. **  Name:       DDModeInfo
  102. **  Purpose:    DirectDraw Mode info 
  103. **-----------------------------------------------------------------------------
  104. */
  105. class DDModeInfo
  106. {
  107. private:
  108. protected:
  109. public:
  110.     // Data
  111.     DDSURFACEDESC   ddSurfDesc;     // Complete Surface Description
  112. LPDDModeInfo lpPrev; // Prev Node in List
  113. LPDDModeInfo    lpNext; // Next Node In List
  114.     // Constructors
  115.     DDModeInfo (void)
  116.         { 
  117.             ZeroMemory (&ddSurfDesc, sizeof (ddSurfDesc)); 
  118.             ddSurfDesc.dwSize = sizeof (DDSURFACEDESC);
  119. lpPrev = NULL;
  120. lpNext = NULL;
  121.         }
  122.     DDModeInfo (const DDSURFACEDESC & ddDesc)
  123.         { 
  124.             CopyMemory (&ddSurfDesc, (const void *)&ddDesc, sizeof (ddSurfDesc)); 
  125.             ddSurfDesc.dwSize = sizeof (DDSURFACEDESC);
  126. lpPrev = NULL;
  127. lpNext = NULL;
  128.         }
  129.     ~DDModeInfo (void) 
  130. {
  131. lpPrev = NULL;
  132. lpNext = NULL;
  133. }
  134.     // Methods
  135. DWORD GetWidth (void);
  136. DWORD GetHeight (void);
  137. DWORD GetBPP (void);
  138. HRESULT GetMode (DWORD & dwWidth, DWORD & dwHeight, 
  139.  DWORD & dwBPP, DWORD & dwRefresh);
  140. BOOL ModeSupported (LPD3DDevInfo lpDevice);
  141.     BOOL Match (DWORD dwW, DWORD dwH, DWORD dwBPP);
  142.     BOOL Match (const DDSURFACEDESC & ddsd);
  143. BOOL Match (DWORD dwBPP);
  144. BOOL Match (const DDPIXELFORMAT & ddpf);
  145. }; // DDModeInfo
  146. /*
  147. **-----------------------------------------------------------------------------
  148. **  Name:       D3DDevInfo
  149. **  Purpose:    D3D Device/driver info for D3D Driver Manager
  150. ** Notes:
  151. **
  152. ** - The Texture Format is a Mode (both are DDSURFACEDESC wrappers)
  153. **
  154. **-----------------------------------------------------------------------------
  155. */
  156. class D3DDevInfo
  157. {
  158. private:
  159. protected:
  160. public:
  161.     // D3D Device Driver info
  162.     DWORD           fFlags;                 // Flags
  163.     // D3D Info
  164.     GUID            guid;                   // GUID
  165.     LPTSTR          szName; // Driver Name
  166.     LPTSTR          szDesc; // Driver Description
  167.     D3DDEVICEDESC   d3dHalDesc;             // HAL info
  168.     D3DDEVICEDESC   d3dHelDesc;             // HEL info
  169.     // Texture Formats
  170. DWORD cFormats; // Count of Texture Formats
  171.     LPDDModeInfo    lpFormatRoot; // List of Texture Formats (root)
  172. LPDDModeInfo lpFormatTail; // List of Texture Formats (tail)
  173. // Node Info
  174. LPD3DDevInfo lpPrev; // Prev Node
  175. LPD3DDevInfo lpNext; // Next Node
  176.     // Flags
  177.     BOOL isValid (void)     { return (fFlags & DDDRV_VALID); }
  178.     void validOn (void)     { fFlags |= DDDRV_VALID; }
  179.     void validOff (void)    { fFlags &= ~DDDRV_VALID; }
  180.     // Methods
  181.     HRESULT Create (LPGUID lpGuid, LPTSTR lpName, LPTSTR lpDesc,
  182.                     LPD3DDEVICEDESC lpHalDevice,
  183.                     LPD3DDEVICEDESC lpHelDevice);
  184.     void Destroy (void);
  185.     // Constructors 
  186.     D3DDevInfo (void) 
  187.         { 
  188. validOff ();
  189. turnFormatsLoadedOff ();
  190. szName = NULL;
  191. szDesc = NULL;
  192.         ZeroMemory (&d3dHalDesc, sizeof(D3DDEVICEDESC)); 
  193.         d3dHalDesc.dwSize = sizeof (D3DDEVICEDESC);
  194.         ZeroMemory (&d3dHelDesc, sizeof(D3DDEVICEDESC)); 
  195.         d3dHelDesc.dwSize = sizeof (D3DDEVICEDESC);
  196. cFormats = 0L;
  197. lpFormatRoot = NULL;
  198. lpFormatTail = NULL;
  199. lpPrev = NULL;
  200. lpNext = NULL;
  201.         }
  202.     ~D3DDevInfo (void) 
  203. Destroy (); 
  204. }
  205. // Texure Format Methods
  206. BOOL formatsLoaded (void) { return ((fFlags & D3DDEV_FORMATS_LOADED) ? TRUE : FALSE); }
  207. void turnFormatsLoadedOn (void) { fFlags |= D3DDEV_FORMATS_LOADED; }
  208. void turnFormatsLoadedOff (void) { fFlags &= ~D3DDEV_FORMATS_LOADED; }
  209. HRESULT LoadFormats (LPDIRECT3DDEVICE2 lpd3dDevice);
  210. HRESULT DestroyFormats (void);
  211. HRESULT AddFormat (LPDDModeInfo lpFormatNew);
  212. HRESULT DelFormat (LPDDModeInfo lpFormatDel);
  213. DWORD   countFormats (void) { return cFormats; }
  214.     LPDDModeInfo FindFormat (DWORD dwBPP, 
  215.      LPDDModeInfo * lpNextBest,
  216.      LPDDModeInfo lpStartFormat = NULL);
  217.     LPDDModeInfo FindFormat (LPDDPIXELFORMAT lpddsd, 
  218.      LPDDModeInfo * lpNextBest,
  219.      LPDDModeInfo lpStartFormat = NULL);
  220.     DWORD EnumFormats (const D3DDEV_ENUMINFO & eiInfo);
  221.     // Methods
  222.     BOOL isHardware (void);
  223.     BOOL Match (LPGUID lpGuid);
  224.     BOOL Match (LPD3DDEVICEDESC lpHalDesc, LPD3DDEVICEDESC lpHelDesc);
  225. }; // End D3DDevInfo
  226. /*
  227. **-----------------------------------------------------------------------------
  228. **  Name:       DDDrvInfo
  229. **  Purpose:    Encapsulates DD/D3D driver info
  230. **-----------------------------------------------------------------------------
  231. */
  232. class DDDrvInfo
  233. {
  234. private:
  235. protected:
  236. public:
  237.     // Structure info
  238.     DWORD           fFlags;                         // D3D Driver flags
  239.     // Driver Info
  240.     GUID            guid;                           // guid, if any
  241.     LPTSTR          szName; // name
  242.     LPTSTR          szDesc; // description
  243.     // Driver Caps
  244.     DDCAPS          ddHalCaps;                      // Hardware caps
  245.     DDCAPS          ddHelCaps;                      // Emulation caps
  246.     // Mode Info
  247. DWORD cModes; // Count of Modes
  248.     LPDDModeInfo    lpModeRoot; // List of Modes (root)
  249. LPDDModeInfo lpModeTail; // List of Modes (tail)
  250.     // D3D Info
  251. DWORD cDevices; // Count of D3D devices
  252.     LPD3DDevInfo    lpDeviceRoot; // List of D3D Devices (root)
  253. LPD3DDevInfo lpDeviceTail; // List of D3D Devices (tail)
  254. // Node Info
  255. LPDDDrvInfo lpPrev; // Previous node
  256. LPDDDrvInfo lpNext; // Next node
  257.     //
  258.     // Flag Methods
  259.     //
  260.     BOOL isValid (void)     { return (fFlags & DDDRV_VALID); }
  261.     void validOn (void)     { fFlags |= DDDRV_VALID; }
  262.     void validOff (void)    { fFlags &= ~DDDRV_VALID; }
  263.     BOOL isPrimary (void)   { return (fFlags & DDDRV_PRIMARY); }
  264.     void primaryOn (void)   { fFlags |= DDDRV_PRIMARY; }
  265.     void primaryOff (void)  { fFlags &= ~DDDRV_PRIMARY; }
  266.     BOOL isD3D (void)     { return (fFlags & DDDRV_D3D); }
  267.     void d3dOn (void)     { fFlags |= DDDRV_D3D; }
  268.     void d3dOff (void)    { fFlags &= ~DDDRV_D3D; }
  269.     // Methods
  270.     HRESULT Create (LPGUID lpGuid, LPTSTR lpszName, LPTSTR lpszDesc);
  271.     void    Destroy (void);
  272.     // Constructors
  273.     DDDrvInfo (void)
  274.         { 
  275. validOff ();
  276.         
  277. ZeroMemory (&ddHalCaps, sizeof (DDCAPS)); 
  278. ddHalCaps.dwSize = sizeof (DDCAPS);
  279. ZeroMemory (&ddHelCaps, sizeof (DDCAPS)); 
  280. ddHelCaps.dwSize = sizeof (DDCAPS);
  281. cModes  = 0L;
  282. lpModeRoot = NULL;
  283. lpModeTail = NULL;
  284. cDevices = 0L;
  285. lpDeviceRoot = NULL;
  286. lpDeviceTail = NULL;
  287. lpPrev = NULL;
  288. lpNext = NULL;
  289.         }
  290.     ~DDDrvInfo (void) 
  291. Destroy (); 
  292. }
  293. // Mode Methods
  294. BOOL modesLoaded (void) { return ((fFlags & DDDRV_MODES_LOADED) ? TRUE : FALSE); }
  295. void turnModesLoadedOn (void) { fFlags |= DDDRV_MODES_LOADED; }
  296. void turnModesLoadedOff (void) { fFlags &= ~DDDRV_MODES_LOADED; }
  297. HRESULT LoadModes (LPDIRECTDRAW2 lpDD2);
  298. HRESULT DestroyModes (void);
  299. HRESULT AddMode (LPDDModeInfo lpModeNew);
  300. HRESULT DelMode (LPDDModeInfo lpModeDel);
  301. DWORD countModes (void) { return cModes; }
  302.     LPDDModeInfo FindMode (DWORD dwW, DWORD dwH, 
  303.    DWORD dwBPP, DWORD dwRefresh,
  304.    LPDDModeInfo * lpNextBest,
  305.    LPDDModeInfo lpStartMode = NULL);
  306.     LPDDModeInfo FindMode (LPDDSURFACEDESC lpddsd, 
  307.    LPDDModeInfo * lpNextBest,
  308.    LPDDModeInfo lpStartMode = NULL);
  309.     DWORD EnumModes (const DDDRV_ENUMINFO & eiInfo);
  310. // D3D Device Methods
  311. BOOL devicesLoaded (void) { return ((fFlags & DDDRV_DEVICES_LOADED) ? TRUE : FALSE); }
  312. void turnDevicesLoadedOn (void) { fFlags |= DDDRV_DEVICES_LOADED; }
  313. void turnDevicesLoadedOff (void) { fFlags &= ~DDDRV_DEVICES_LOADED; }
  314. HRESULT LoadDevices (LPDIRECT3D2 lpD3D2);
  315. HRESULT DestroyDevices (void);
  316. HRESULT AddDevice (LPD3DDevInfo lpModeNew);
  317. HRESULT DelDevice (LPD3DDevInfo lpModeDel);
  318. DWORD countDevices (void) { return cDevices; }
  319.     LPD3DDevInfo FindDevice (LPGUID lpGuid, LPD3DDevInfo * lpNextBest,
  320.  LPD3DDevInfo lpStart = NULL);
  321.     LPD3DDevInfo FindDevice (LPD3DDEVICEDESC lpHal, LPD3DDEVICEDESC lpHel, 
  322.  LPD3DDevInfo * lpNextBest,
  323.  LPD3DDevInfo lpStart = NULL);
  324.     DWORD EnumDevices (const DDDRV_ENUMINFO & eiInfo);
  325. // Mode <=> Device compatible find functions 
  326.     LPD3DDevInfo FindDeviceSupportsMode (LPGUID lpGuid, 
  327.  LPDDModeInfo lpMode,
  328.      LPD3DDevInfo * lpNextBest,
  329.      LPD3DDevInfo lpStart = NULL);
  330. LPDDModeInfo FindModeSupportsDevice (DWORD dwW, DWORD dwH, 
  331.  DWORD dwBPP, DWORD dwRefresh,
  332.  LPD3DDevInfo lpDevice,
  333.  LPDDModeInfo * lpNextBest,
  334.  LPDDModeInfo lpStart = NULL);
  335.  
  336.     // Methods
  337.     BOOL  Match (LPGUID lpGuid);
  338.     BOOL  Match (LPDDCAPS lpHal, LPDDCAPS lpHel);
  339. LPGUID GetGuid (void);
  340. }; // End class DDDrvInfo
  341.    
  342. /*
  343. **-----------------------------------------------------------------------------
  344. **  Name:       DDDrvMgr
  345. **  Purpose:    Creates and Manages DD/D3D driver info
  346. **  Notes:
  347. **          1.  Modes and D3D Drivers may be incompatible with each other
  348. **              code needs to be added to detect and mark this
  349. **          2.  Need to add code for finding exact and nearest mode matches
  350. **              from requested width, height, pixel format, and refresh rate
  351. **          3.  Need to add code for finding D3D devices from
  352. **-----------------------------------------------------------------------------
  353. */
  354. class DDDrvMgr
  355. {
  356. private:
  357. protected:
  358. public:
  359.     // Static Data
  360.     static DWORD         g_fFlags;                  // Global flags
  361. static DWORD  g_cDrivers; // Count of DD Drivers
  362.     static LPDDDrvInfo  g_lpDriverRoot; // Global list of DD Device Drivers (root)
  363.     static LPDDDrvInfo  g_lpDriverTail; // Global list of DD Device Drivers (tail)
  364.             
  365.     // Data
  366.     LPDDDrvInfo lpCurrDriver; // Pointer to current DD Device driver
  367.     LPDDModeInfo lpCurrMode; // Pointer to current mode in DD driver
  368.     LPD3DDevInfo lpCurrDevice; // Pointer to current D3D device
  369. LPDDModeInfo lpCurrTextureFormat; // Pointer to current Texture Format
  370.     // Static Methods
  371.     static HRESULT Init (void);
  372.     static HRESULT Fini (void);
  373.     static BOOL isInitialized (void)    { return (g_fFlags & DDDRV_INIT); }
  374.     static void initOn (void)           { g_fFlags |= DDDRV_INIT; }
  375.     static void initOff (void)          { g_fFlags &= ~DDDRV_INIT; }
  376. // Driver Methods
  377. static HRESULT LoadDrivers (void);
  378. static HRESULT DestroyDrivers (void);
  379. static HRESULT AddDriver (LPDDDrvInfo lpDrvNew);
  380. static HRESULT DelDriver (LPDDDrvInfo lpDrvDel);
  381. static DWORD countDrivers (void) { return g_cDrivers; }
  382.     static DWORD EnumDrivers (const DDDRV_ENUMINFO & eiInfo);
  383.     static LPDDDrvInfo FindDriver (LPGUID lpGuidDD, LPDDDrvInfo * dwNextBest,
  384.    LPDDDrvInfo lpStart = NULL);
  385.     static LPDDDrvInfo FindDriver (LPDDCAPS lpHalCaps, LPDDCAPS lpHelCaps, 
  386.    LPDDDrvInfo * dwNextBest,
  387.    LPDDDrvInfo lpStart = NULL);
  388.     // Constructors
  389.     DDDrvMgr (void);
  390.     ~DDDrvMgr (void);
  391. // DD info methods
  392.     LPDDDrvInfo GetCurrDriver (void)             
  393. {
  394. return lpCurrDriver;
  395. }
  396.     // Mode Methods
  397.     DWORD countModes (void)              
  398. if (lpCurrDriver)
  399. return lpCurrDriver->countModes ();
  400. return 0L;
  401. }
  402.     LPDDModeInfo GetCurrMode (void)             
  403. {
  404. return lpCurrMode;
  405. }
  406.     // D3D info methods
  407.     DWORD countDevices (void)
  408. if (lpCurrDriver)
  409. return lpCurrDriver->countDevices ();
  410. return 0L;
  411. }    
  412.     LPD3DDevInfo GetCurrDevice (void)
  413. return lpCurrDevice;
  414. }
  415. // Texture Format methods
  416. DWORD countFormats (void)
  417. {
  418. if (lpCurrDevice)
  419. return lpCurrDevice->countFormats ();
  420. return 0L;
  421. }
  422. LPDDModeInfo GetCurrTextureFormat (void)
  423. {
  424. return lpCurrTextureFormat;
  425. }
  426.         
  427. }; // End class DDDrvMgr
  428. /*
  429. **-----------------------------------------------------------------------------
  430. **  End of File
  431. **-----------------------------------------------------------------------------
  432. */
  433. #endif // DRVMGR_H