Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cDXEnumeration.h
Go to the documentation of this file.
1 //
5 //
6 
7 #ifndef _INC_cDXEnumeration_H
8 #define _INC_cDXEnumeration_H
9 #ifndef NO_PRAGMA_ONCE
10 #pragma once
11 #endif
12 
13 #include "cDXBase.h"
18 #include "GrayCore/include/cPair.h"
19 
20 #ifdef USE_DX9
21 
22 namespace Gray
23 {
24  template <>
25  COMPARE_t cValT::Compare<D3DDISPLAYMODE>(const D3DDISPLAYMODE& dm1, const D3DDISPLAYMODE& dm2);
26 };
27 
28 namespace Gray3D
29 {
30  class cDXEnumDevice;
31  class cDXEnumAdapter;
32  class cDXEnumeration;
33 
34  enum VertexProcessing_TYPE
35  {
38  VertexProcessing_SOFTWARE,
39  VertexProcessing_MIXED,
40  VertexProcessing_HARDWARE,
41  VertexProcessing_PURE_HARDWARE,
42  VertexProcessing_QTY
43  };
44 
45  struct GRAY3D_LINK cDXEnumBase // static
46  {
50  static UINT GRAYCALL GetColorChannelBits(D3DFORMAT eFormat);
51  static UINT GRAYCALL GetAlphaChannelBits(D3DFORMAT eFormat);
52  static UINT GRAYCALL GetDepthBits(D3DFORMAT eFormat);
53  static UINT GRAYCALL GetStencilBits(D3DFORMAT eFormat);
54  static DWORD GRAYCALL GetDeviceCreateFlags(VertexProcessing_TYPE eVertexProcessingType);
55 
56  static const D3DDEVTYPE k_aeDevTypes[];
57  static const D3DFORMAT k_aeFormatAllowedAdapterList[]; // the formats i like. ignore devices that don't support one of these.
58  };
59 
60  //**********************************************************************************************
61  typedef cPair<D3DFORMAT, D3DMULTISAMPLE_TYPE> cDXEnumDSMSConflict;
62 
63  //**********************************************************************************************
64  class GRAY3D_LINK cDXEnumCombo : public cRefBase, public cDXEnumBase
65  {
69 
70  public:
71  cDXEnumDevice* const m_pDevice;
72  D3DFORMAT m_eFormatAdapter;
73  D3DFORMAT m_eFormatBackBuffer;
74  bool m_bFullScreenMode;
75 
76  cArrayVal<D3DFORMAT> m_aDepthStencilFormatList;
77  cArrayVal<D3DMULTISAMPLE_TYPE> m_aMultiSampleTypeList;
78  cArrayVal<DWORD> m_aMultiSampleQualityList;
79  cArrayVal<cDXEnumDSMSConflict> m_aDSMSConflictList;
80  cArrayVal<VertexProcessing_TYPE> m_aVertexProcessingTypeList;
81  cArrayVal<UINT> m_aPresentIntervalList;
82 
83  public:
84  cDXEnumCombo(cDXEnumDevice* pDevice, D3DFORMAT eFormatAdapter, D3DFORMAT eFormatBackBuffer, bool bFullScreenMode);
85  ~cDXEnumCombo(void);
86 
87  cDXEnumDevice* get_Device() const noexcept
88  {
89  return m_pDevice;
90  }
91  cDXEnumAdapter* get_Adapter() const;
92  UINT get_AdapterOrdinal() const;
93 
94  bool isFullscreen() const noexcept
95  {
96  return m_bFullScreenMode;
97  }
98 
99  void BuildDSMSConflictList(IDirect3D9* pD3D);
100  void BuildMultiSampleTypeList(IDirect3D9* pD3D);
101  void BuildDepthStencilFormatList(const cDXEnumeration& rEnum);
102 
103  void BuildVertexProcessingTypeList(const cDXEnumeration& rEnum, const D3DCAPS9& Caps);
104  void BuildPresentIntervalList(const D3DCAPS9& Caps);
105  };
106 
107  typedef cRefPtr<cDXEnumCombo> cDXEnumComboPtr;
108 
109  //**********************************************************************************************
110  class GRAY3D_LINK cDXEnumDevice : public cRefBase, public cDXEnumBase
111  {
114 
115  public:
116  cDXEnumAdapter* const m_pAdapter;
117  const D3DDEVTYPE m_eDevType;
118  D3DCAPS9 m_Caps;
119  cArrayRef<cDXEnumCombo> m_aDeviceComboList;
120 
121  public:
122  cDXEnumDevice(cDXEnumAdapter* pAdapter, D3DDEVTYPE eDevType, const D3DCAPS9& Caps);
123  ~cDXEnumDevice(void);
124 
125  cDXEnumAdapter* get_Adapter() const noexcept
126  {
127  return m_pAdapter;
128  }
129 
130  UINT get_AdapterOrdinal() const;
131  bool isPureHardware() const;
132  HRESULT EnumerateDeviceCombos(const cDXEnumeration& rEnum, const cArrayVal<D3DFORMAT>& aAdapterFormats);
133  };
134 
135  typedef cRefPtr<cDXEnumDevice> cDXEnumDevicePtr;
136 
137  //**********************************************************************************************
138  class GRAY3D_LINK cDXEnumAdapter : public cRefBase, public cDXEnumBase
139  {
142 
143  public:
144  const UINT m_nAdapterOrdinal;
145  D3DADAPTER_IDENTIFIER9 m_AdapterIdentifier;
146  cArraySortVal<D3DDISPLAYMODE> m_aDisplayModes;
147  cRefPtr<cDXEnumDevice> m_aDeviceInfoList[VertexProcessing_QTY];
148 
149  public:
150  cDXEnumAdapter(UINT nAdapterOrdinal, const D3DADAPTER_IDENTIFIER9& AdapterIdentifier);
151  ~cDXEnumAdapter(void);
152 
153  void EnumerateAdapterFormats(const cDXEnumeration& rEnum, cArrayVal<D3DFORMAT>& aAdapterFormats);
154  HRESULT EnumerateDevices(const cDXEnumeration& rEnum, const cArrayVal<D3DFORMAT>& aAdapterFormats);
155 
156  cString get_Desc() const
157  {
158  return cString(this->m_AdapterIdentifier.Description, STRMAX(this->m_AdapterIdentifier.Description));
159  }
160  };
161 
162  typedef cRefPtr<cDXEnumAdapter> cDXEnumAdapterPtr;
163 
164  //**********************************************************************************************
165  class GRAY3D_LINK cDXEnumeration
166  {
169 
170  public:
171  cIUnkPtr<IDirect3D9> m_pD3D;
172 
173  public:
174  // Filters
175  // The following variables can be used to limit what modes, formats, etc. are enumerated.
176 
177  UINT m_AppMinDepthBits;
178  UINT m_AppMinStencilBits;
179  bool m_bEnableAutoDepthStencil;
180  bool m_AppUsesMixedVP;
181 
182  bool m_AppRequiresWindowed;
183  bool m_AppRequiresFullScreen;
184 
185  UINT m_AppMinFullScreenWidth;
186  UINT m_AppMinFullScreenHeight;
187  UINT m_AppMinColorChannelBits;
188  UINT m_AppMinAlphaChannelBits;
189 
190  // results
191  cArrayRef<cDXEnumAdapter> m_aAdapterInfoList;
192  bool m_bDetectedNVidia;
193  bool m_bDetectedNVidiaDebug; // NVPerfHUD
194 
195  public:
196  cDXEnumeration(IDirect3D9* pD3D = nullptr);
197  ~cDXEnumeration();
198 
199  cDXEnumComboPtr FindWindowedCombo(const D3DDISPLAYMODE& DisplayMode, bool bRequireREF = false) const;
200 
201  virtual bool IsVertexProcessingAllowed(VertexProcessing_TYPE eVertexProcessingType, const D3DCAPS9& Caps, const cDXEnumCombo* pDeviceCombo) const;
202 
203  HRESULT EnumerateAdapter(UINT nAdapterOrdinal = 0);
204  HRESULT EnumerateAdapters();
205 
206  UNITTEST_FRIEND(cDXEnumeration);
207  };
208 }
209 
210 #endif
211 #endif // cDXEnumeration
#define GRAY3D_LINK
Definition: Gray3D.h:15
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define STRMAX(x)
Get Max size of static string space. minus the '\0' terminator character.
Definition: StrConst.h:33
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
D3DDEVTYPE
Definition: UseDX.h:318
enum _D3DFORMAT D3DFORMAT
int COMPARE_t
Definition: cKernel.h:38
#define UNITTEST_FRIEND(n)
Define this in the class body to be unit tested. Allow the unit test to access private/protected stuf...
Definition: cUnitTestDecl.h:17
Definition: Gray3D.cpp:12
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
cStringT< GChar_t > cString
Definition: cString.h:636
Definition: UseDX.h:263