//-------------------------------------------------------------------------------------- // File: DXUTEnum.h // // Enumerates D3D adapters, devices, modes, etc. // // Copyright (c) Microsoft Corporation. All rights reserved. //-------------------------------------------------------------------------------------- #pragma once #ifndef DXUT_ENUM_H #define DXUT_ENUM_H //-------------------------------------------------------------------------------------- // Forward declarations //-------------------------------------------------------------------------------------- class CD3DEnumAdapterInfo; class CD3DEnumDeviceInfo; struct CD3DEnumDeviceSettingsCombo; struct CD3DEnumDSMSConflict; //-------------------------------------------------------------------------------------- // Enumerates available Direct3D adapters, devices, modes, etc. // Use DXUTGetEnumeration() to access global instance //-------------------------------------------------------------------------------------- class CD3DEnumeration { public: // These should be called before Enumerate(). // // Use these calls and the IsDeviceAcceptable to control the contents of // the enumeration object, which affects the device selection and the device settings dialog. void SetRequirePostPixelShaderBlending( bool bRequire ) { m_bRequirePostPixelShaderBlending = bRequire; } void SetResolutionMinMax( UINT nMinWidth, UINT nMinHeight, UINT nMaxWidth, UINT nMaxHeight ); void SetRefreshMinMax( UINT nMin, UINT nMax ); void SetMultisampleQualityMax( UINT nMax ); void GetPossibleVertexProcessingList( bool* pbSoftwareVP, bool* pbHardwareVP, bool* pbPureHarewareVP, bool* pbMixedVP ); void SetPossibleVertexProcessingList( bool bSoftwareVP, bool bHardwareVP, bool bPureHarewareVP, bool bMixedVP ); CGrowableArray* GetPossibleDepthStencilFormatList(); CGrowableArray* GetPossibleMultisampleTypeList(); CGrowableArray* GetPossiblePresentIntervalList(); void ResetPossibleDepthStencilFormats(); void ResetPossibleMultisampleTypeList(); void ResetPossiblePresentIntervalList(); // Call Enumerate() to enumerate available D3D adapters, devices, modes, etc. HRESULT Enumerate( IDirect3D9* pD3D = NULL, LPDXUTCALLBACKISDEVICEACCEPTABLE IsDeviceAcceptableFunc = NULL, void* pIsDeviceAcceptableFuncUserContext = NULL ); // These should be called after Enumerate() is called CGrowableArray* GetAdapterInfoList(); CD3DEnumAdapterInfo* GetAdapterInfo( UINT AdapterOrdinal ); CD3DEnumDeviceInfo* GetDeviceInfo( UINT AdapterOrdinal, D3DDEVTYPE DeviceType ); CD3DEnumDeviceSettingsCombo* GetDeviceSettingsCombo( DXUTDeviceSettings* pDeviceSettings ) { return GetDeviceSettingsCombo( pDeviceSettings->AdapterOrdinal, pDeviceSettings->DeviceType, pDeviceSettings->AdapterFormat, pDeviceSettings->pp.BackBufferFormat, pDeviceSettings->pp.Windowed ); } CD3DEnumDeviceSettingsCombo* GetDeviceSettingsCombo( UINT AdapterOrdinal, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL Windowed ); ~CD3DEnumeration(); private: friend CD3DEnumeration* DXUTGetEnumeration(); // Use DXUTGetEnumeration() to access global instance CD3DEnumeration(); IDirect3D9* m_pD3D; LPDXUTCALLBACKISDEVICEACCEPTABLE m_IsDeviceAcceptableFunc; void* m_pIsDeviceAcceptableFuncUserContext; bool m_bRequirePostPixelShaderBlending; CGrowableArray m_DepthStecilPossibleList; CGrowableArray m_MultiSampleTypeList; CGrowableArray m_PresentIntervalList; bool m_bSoftwareVP; bool m_bHardwareVP; bool m_bPureHarewareVP; bool m_bMixedVP; UINT m_nMinWidth; UINT m_nMaxWidth; UINT m_nMinHeight; UINT m_nMaxHeight; UINT m_nRefreshMin; UINT m_nRefreshMax; UINT m_nMultisampleQualityMax; // Array of CD3DEnumAdapterInfo* with unique AdapterOrdinals CGrowableArray m_AdapterInfoList; HRESULT EnumerateDevices( CD3DEnumAdapterInfo* pAdapterInfo, CGrowableArray* pAdapterFormatList ); HRESULT EnumerateDeviceCombos( CD3DEnumAdapterInfo* pAdapterInfo, CD3DEnumDeviceInfo* pDeviceInfo, CGrowableArray* pAdapterFormatList ); void BuildDepthStencilFormatList( CD3DEnumDeviceSettingsCombo* pDeviceCombo ); void BuildMultiSampleTypeList( CD3DEnumDeviceSettingsCombo* pDeviceCombo ); void BuildDSMSConflictList( CD3DEnumDeviceSettingsCombo* pDeviceCombo ); void BuildPresentIntervalList( CD3DEnumDeviceInfo* pDeviceInfo, CD3DEnumDeviceSettingsCombo* pDeviceCombo ); void ClearAdapterInfoList(); }; CD3DEnumeration* DXUTGetEnumeration(); //-------------------------------------------------------------------------------------- // A class describing an adapter which contains a unique adapter ordinal // that is installed on the system //-------------------------------------------------------------------------------------- class CD3DEnumAdapterInfo { public: ~CD3DEnumAdapterInfo(); UINT AdapterOrdinal; D3DADAPTER_IDENTIFIER9 AdapterIdentifier; WCHAR szUniqueDescription[256]; CGrowableArray displayModeList; // Array of supported D3DDISPLAYMODEs CGrowableArray deviceInfoList; // Array of CD3DEnumDeviceInfo* with unique supported DeviceTypes }; //-------------------------------------------------------------------------------------- // A class describing a Direct3D device that contains a // unique supported device type //-------------------------------------------------------------------------------------- class CD3DEnumDeviceInfo { public: ~CD3DEnumDeviceInfo(); UINT AdapterOrdinal; D3DDEVTYPE DeviceType; D3DCAPS9 Caps; // List of CD3DEnumDeviceSettingsCombo* with a unique set // of AdapterFormat, BackBufferFormat, and Windowed CGrowableArray deviceSettingsComboList; }; //-------------------------------------------------------------------------------------- // A struct describing device settings that contains a unique combination of // adapter format, back buffer format, and windowed that is compatible with a // particular Direct3D device and the app. //-------------------------------------------------------------------------------------- struct CD3DEnumDeviceSettingsCombo { UINT AdapterOrdinal; D3DDEVTYPE DeviceType; D3DFORMAT AdapterFormat; D3DFORMAT BackBufferFormat; BOOL Windowed; CGrowableArray depthStencilFormatList; // List of D3DFORMATs CGrowableArray multiSampleTypeList; // List of D3DMULTISAMPLE_TYPEs CGrowableArray multiSampleQualityList; // List of number of quality levels for each multisample type CGrowableArray presentIntervalList; // List of D3DPRESENT flags CGrowableArray DSMSConflictList; // List of CD3DEnumDSMSConflict CD3DEnumAdapterInfo* pAdapterInfo; CD3DEnumDeviceInfo* pDeviceInfo; }; //-------------------------------------------------------------------------------------- // A depth/stencil buffer format that is incompatible with a // multisample type. //-------------------------------------------------------------------------------------- struct CD3DEnumDSMSConflict { D3DFORMAT DSFormat; D3DMULTISAMPLE_TYPE MSType; }; #endif