//----------------------------------------------------------------------------- // File: D3DSettings.cpp // // Desc: Settings class and change-settings dialog class for the Direct3D // samples framework library. //----------------------------------------------------------------------------- #define STRICT #include #include #include #include #include #include "DXUtil.h" #include "D3DUtil.h" #include "D3DEnumeration.h" #include "D3DSettings.h" #include "resource.h" CD3DSettingsDialog* s_pSettingsDialog = NULL; //----------------------------------------------------------------------------- // Name: D3DDevTypeToString // Desc: Returns the string for the given D3DDEVTYPE. //----------------------------------------------------------------------------- TCHAR* D3DDevTypeToString(D3DDEVTYPE devType) { switch (devType) { case D3DDEVTYPE_HAL: return TEXT("D3DDEVTYPE_HAL"); case D3DDEVTYPE_SW: return TEXT("D3DDEVTYPE_SW"); case D3DDEVTYPE_REF: return TEXT("D3DDEVTYPE_REF"); default: return TEXT("Unknown devType"); } } //----------------------------------------------------------------------------- // Name: MultisampleTypeToString // Desc: Returns the string for the given D3DMULTISAMPLE_TYPE. //----------------------------------------------------------------------------- TCHAR* MultisampleTypeToString(D3DMULTISAMPLE_TYPE MultiSampleType) { switch (MultiSampleType) { case D3DMULTISAMPLE_NONE: return TEXT("D3DMULTISAMPLE_NONE"); case D3DMULTISAMPLE_NONMASKABLE: return TEXT("D3DMULTISAMPLE_NONMASKABLE"); case D3DMULTISAMPLE_2_SAMPLES: return TEXT("D3DMULTISAMPLE_2_SAMPLES"); case D3DMULTISAMPLE_3_SAMPLES: return TEXT("D3DMULTISAMPLE_3_SAMPLES"); case D3DMULTISAMPLE_4_SAMPLES: return TEXT("D3DMULTISAMPLE_4_SAMPLES"); case D3DMULTISAMPLE_5_SAMPLES: return TEXT("D3DMULTISAMPLE_5_SAMPLES"); case D3DMULTISAMPLE_6_SAMPLES: return TEXT("D3DMULTISAMPLE_6_SAMPLES"); case D3DMULTISAMPLE_7_SAMPLES: return TEXT("D3DMULTISAMPLE_7_SAMPLES"); case D3DMULTISAMPLE_8_SAMPLES: return TEXT("D3DMULTISAMPLE_8_SAMPLES"); case D3DMULTISAMPLE_9_SAMPLES: return TEXT("D3DMULTISAMPLE_9_SAMPLES"); case D3DMULTISAMPLE_10_SAMPLES: return TEXT("D3DMULTISAMPLE_10_SAMPLES"); case D3DMULTISAMPLE_11_SAMPLES: return TEXT("D3DMULTISAMPLE_11_SAMPLES"); case D3DMULTISAMPLE_12_SAMPLES: return TEXT("D3DMULTISAMPLE_12_SAMPLES"); case D3DMULTISAMPLE_13_SAMPLES: return TEXT("D3DMULTISAMPLE_13_SAMPLES"); case D3DMULTISAMPLE_14_SAMPLES: return TEXT("D3DMULTISAMPLE_14_SAMPLES"); case D3DMULTISAMPLE_15_SAMPLES: return TEXT("D3DMULTISAMPLE_15_SAMPLES"); case D3DMULTISAMPLE_16_SAMPLES: return TEXT("D3DMULTISAMPLE_16_SAMPLES"); default: return TEXT("Unknown Multisample Type"); } } //----------------------------------------------------------------------------- // Name: VertexProcessingTypeToString // Desc: Returns the string for the given VertexProcessingType. //----------------------------------------------------------------------------- TCHAR* VertexProcessingTypeToString(VertexProcessingType vpt) { switch (vpt) { case SOFTWARE_VP: return TEXT("SOFTWARE_VP"); case MIXED_VP: return TEXT("MIXED_VP"); case HARDWARE_VP: return TEXT("HARDWARE_VP"); case PURE_HARDWARE_VP: return TEXT("PURE_HARDWARE_VP"); default: return TEXT("Unknown VertexProcessingType"); } } //----------------------------------------------------------------------------- // Name: PresentIntervalToString // Desc: Returns the string for the given present interval. //----------------------------------------------------------------------------- TCHAR* PresentIntervalToString( UINT pi ) { switch( pi ) { case D3DPRESENT_INTERVAL_IMMEDIATE: return TEXT("D3DPRESENT_INTERVAL_IMMEDIATE"); case D3DPRESENT_INTERVAL_DEFAULT: return TEXT("D3DPRESENT_INTERVAL_DEFAULT"); case D3DPRESENT_INTERVAL_ONE: return TEXT("D3DPRESENT_INTERVAL_ONE"); case D3DPRESENT_INTERVAL_TWO: return TEXT("D3DPRESENT_INTERVAL_TWO"); case D3DPRESENT_INTERVAL_THREE: return TEXT("D3DPRESENT_INTERVAL_THREE"); case D3DPRESENT_INTERVAL_FOUR: return TEXT("D3DPRESENT_INTERVAL_FOUR"); default: return TEXT("Unknown PresentInterval"); } } //----------------------------------------------------------------------------- // Name: DialogProcHelper // Desc: //----------------------------------------------------------------------------- INT_PTR CALLBACK DialogProcHelper( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { return s_pSettingsDialog->DialogProc( hDlg, msg, wParam, lParam ); } //----------------------------------------------------------------------------- // Name: CD3DSettingsDialog constructor // Desc: //----------------------------------------------------------------------------- CD3DSettingsDialog::CD3DSettingsDialog( CD3DEnumeration* pEnumeration, CD3DSettings* pSettings) { s_pSettingsDialog = this; m_pEnumeration = pEnumeration; m_d3dSettings = *pSettings; } //----------------------------------------------------------------------------- // Name: ComboBoxAdd // Desc: Adds an entry to the combo box. //----------------------------------------------------------------------------- void CD3DSettingsDialog::ComboBoxAdd( int id, void* pData, TCHAR* pstrDesc ) { HWND hwndCtrl = GetDlgItem( m_hDlg, id ); DWORD dwItem = ComboBox_AddString( hwndCtrl, pstrDesc ); ComboBox_SetItemData( hwndCtrl, dwItem, pData ); } //----------------------------------------------------------------------------- // Name: ComboBoxSelect // Desc: Selects an entry in the combo box. //----------------------------------------------------------------------------- void CD3DSettingsDialog::ComboBoxSelect( int id, void* pData ) { HWND hwndCtrl = GetDlgItem( m_hDlg, id ); UINT count = ComboBoxCount( id ); for( UINT iItem = 0; iItem < count; iItem++ ) { if( (void*)ComboBox_GetItemData( hwndCtrl, iItem ) == pData ) { ComboBox_SetCurSel( hwndCtrl, iItem ); PostMessage( m_hDlg, WM_COMMAND, MAKEWPARAM( id, CBN_SELCHANGE ), (LPARAM)hwndCtrl ); return; } } } //----------------------------------------------------------------------------- // Name: ComboBoxSelectIndex // Desc: Selects an entry in the combo box. //----------------------------------------------------------------------------- void CD3DSettingsDialog::ComboBoxSelectIndex( int id, int index ) { HWND hwndCtrl = GetDlgItem( m_hDlg, id ); ComboBox_SetCurSel( hwndCtrl, index ); PostMessage( m_hDlg, WM_COMMAND, MAKEWPARAM( id, CBN_SELCHANGE ), (LPARAM)hwndCtrl ); } //----------------------------------------------------------------------------- // Name: ComboBoxSelected // Desc: Returns the data for the selected entry in the combo box. //----------------------------------------------------------------------------- void* CD3DSettingsDialog::ComboBoxSelected( int id ) { HWND hwndCtrl = GetDlgItem( m_hDlg, id ); int index = ComboBox_GetCurSel( hwndCtrl ); if( index < 0 ) return NULL; return (void*)ComboBox_GetItemData( hwndCtrl, index ); } //----------------------------------------------------------------------------- // Name: ComboBoxSomethingSelected // Desc: Returns whether any entry in the combo box is selected. This is // more useful than ComboBoxSelected() when you need to distinguish // between having no item selected vs. having an item selected whose // itemData is NULL. //----------------------------------------------------------------------------- bool CD3DSettingsDialog::ComboBoxSomethingSelected( int id ) { HWND hwndCtrl = GetDlgItem( m_hDlg, id ); int index = ComboBox_GetCurSel( hwndCtrl ); return ( index >= 0 ); } //----------------------------------------------------------------------------- // Name: ComboBoxCount // Desc: Returns the number of entries in the combo box. //----------------------------------------------------------------------------- UINT CD3DSettingsDialog::ComboBoxCount( int id ) { HWND hwndCtrl = GetDlgItem( m_hDlg, id ); return ComboBox_GetCount( hwndCtrl ); } //----------------------------------------------------------------------------- // Name: ComboBoxClear // Desc: Clears the entries in the combo box. //----------------------------------------------------------------------------- void CD3DSettingsDialog::ComboBoxClear( int id ) { HWND hwndCtrl = GetDlgItem( m_hDlg, id ); ComboBox_ResetContent( hwndCtrl ); } //----------------------------------------------------------------------------- // Name: ComboBoxContainsText // Desc: Returns whether the combo box contains the given text. //----------------------------------------------------------------------------- bool CD3DSettingsDialog::ComboBoxContainsText( int id, TCHAR* pstrText ) { TCHAR strItem[200]; HWND hwndCtrl = GetDlgItem( m_hDlg, id ); UINT count = ComboBoxCount( id ); for( UINT iItem = 0; iItem < count; iItem++ ) { if( ComboBox_GetLBTextLen( hwndCtrl, iItem ) >= 200 ) continue; // shouldn't happen, but don't overwrite buffer if it does ComboBox_GetLBText( hwndCtrl, iItem, strItem ); if( lstrcmp( strItem, pstrText ) == 0 ) return true; } return false; } //----------------------------------------------------------------------------- // Name: ShowDialog // Desc: Show the D3D settings dialog. //----------------------------------------------------------------------------- INT_PTR CD3DSettingsDialog::ShowDialog( HWND hwndParent ) { return DialogBox( NULL, MAKEINTRESOURCE( IDD_SELECTDEVICE ), hwndParent, DialogProcHelper ); } //----------------------------------------------------------------------------- // Name: DialogProc // Desc: Handle window messages in the dialog. //----------------------------------------------------------------------------- INT_PTR CD3DSettingsDialog::DialogProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { UNREFERENCED_PARAMETER( lParam ); switch( msg ) { case WM_INITDIALOG: { m_hDlg = hDlg; // Fill adapter combo box. Updating the selected adapter will trigger // updates of the rest of the dialog. for( UINT iai = 0; iai < m_pEnumeration->m_pAdapterInfoList->Count(); iai++ ) { D3DAdapterInfo* pAdapterInfo; pAdapterInfo = (D3DAdapterInfo*)m_pEnumeration->m_pAdapterInfoList->GetPtr(iai); TCHAR strDescription[512]; DXUtil_ConvertAnsiStringToGenericCch( strDescription, pAdapterInfo->AdapterIdentifier.Description, 512 ); ComboBoxAdd( IDC_ADAPTER_COMBO, pAdapterInfo, strDescription ); if( pAdapterInfo->AdapterOrdinal == m_d3dSettings.AdapterOrdinal() ) ComboBoxSelect( IDC_ADAPTER_COMBO, pAdapterInfo ); } if( !ComboBoxSomethingSelected( IDC_ADAPTER_COMBO ) && ComboBoxCount( IDC_ADAPTER_COMBO ) > 0 ) { ComboBoxSelectIndex( IDC_ADAPTER_COMBO, 0 ); } } return TRUE; case WM_COMMAND: switch( LOWORD(wParam) ) { case IDOK: EndDialog( hDlg, IDOK ); break; case IDCANCEL: EndDialog( hDlg, IDCANCEL ); break; case IDC_ADAPTER_COMBO: if( CBN_SELCHANGE == HIWORD(wParam) ) AdapterChanged(); break; case IDC_DEVICE_COMBO: if( CBN_SELCHANGE == HIWORD(wParam) ) DeviceChanged(); break; case IDC_ADAPTERFORMAT_COMBO: if( CBN_SELCHANGE == HIWORD(wParam) ) AdapterFormatChanged(); break; case IDC_RESOLUTION_COMBO: if( CBN_SELCHANGE == HIWORD(wParam) ) ResolutionChanged(); break; case IDC_REFRESHRATE_COMBO: if( CBN_SELCHANGE == HIWORD(wParam) ) RefreshRateChanged(); break; case IDC_BACKBUFFERFORMAT_COMBO: if( CBN_SELCHANGE == HIWORD(wParam) ) BackBufferFormatChanged(); break; case IDC_DEPTHSTENCILBUFFERFORMAT_COMBO: if( CBN_SELCHANGE == HIWORD(wParam) ) DepthStencilBufferFormatChanged(); break; case IDC_MULTISAMPLE_COMBO: if( CBN_SELCHANGE == HIWORD(wParam) ) MultisampleTypeChanged(); break; case IDC_MULTISAMPLE_QUALITY_COMBO: if( CBN_SELCHANGE == HIWORD(wParam) ) MultisampleQualityChanged(); break; case IDC_VERTEXPROCESSING_COMBO: if( CBN_SELCHANGE == HIWORD(wParam) ) VertexProcessingChanged(); break; case IDC_PRESENTINTERVAL_COMBO: if( CBN_SELCHANGE == HIWORD(wParam) ) PresentIntervalChanged(); break; case IDC_WINDOW: case IDC_FULLSCREEN: WindowedFullscreenChanged(); break; } return TRUE; default: return FALSE; } } //----------------------------------------------------------------------------- // Name: AdapterChanged // Desc: Respond to a change of selected adapter. //----------------------------------------------------------------------------- void CD3DSettingsDialog::AdapterChanged( void ) { D3DAdapterInfo* pAdapterInfo = (D3DAdapterInfo*)ComboBoxSelected( IDC_ADAPTER_COMBO ); if( pAdapterInfo == NULL ) return; if( m_d3dSettings.IsWindowed ) m_d3dSettings.pWindowed_AdapterInfo = pAdapterInfo; else m_d3dSettings.pFullscreen_AdapterInfo = pAdapterInfo; // Update device combo box ComboBoxClear( IDC_DEVICE_COMBO ); for( UINT idi = 0; idi < pAdapterInfo->pDeviceInfoList->Count(); idi++ ) { D3DDeviceInfo* pDeviceInfo = (D3DDeviceInfo*)pAdapterInfo->pDeviceInfoList->GetPtr(idi); ComboBoxAdd( IDC_DEVICE_COMBO, pDeviceInfo, D3DDevTypeToString( pDeviceInfo->DevType ) ); if( pDeviceInfo->DevType == m_d3dSettings.DevType() ) ComboBoxSelect( IDC_DEVICE_COMBO, pDeviceInfo ); } if( !ComboBoxSomethingSelected( IDC_DEVICE_COMBO ) && ComboBoxCount( IDC_DEVICE_COMBO ) > 0 ) { ComboBoxSelectIndex( IDC_DEVICE_COMBO, 0 ); } } //----------------------------------------------------------------------------- // Name: DeviceChanged // Desc: Respond to a change of selected device by resetting the // fullscreen/windowed radio buttons. Updating these buttons will // trigger updates of the rest of the dialog. //----------------------------------------------------------------------------- void CD3DSettingsDialog::DeviceChanged( void ) { D3DDeviceInfo* pDeviceInfo = (D3DDeviceInfo*)ComboBoxSelected( IDC_DEVICE_COMBO ); if( pDeviceInfo == NULL ) return; if( m_d3dSettings.IsWindowed ) m_d3dSettings.pWindowed_DeviceInfo = pDeviceInfo; else m_d3dSettings.pFullscreen_DeviceInfo = pDeviceInfo; // Update fullscreen/windowed radio buttons bool HasWindowedDeviceCombo = false; bool HasFullscreenDeviceCombo = false; for( UINT idc = 0; idc < pDeviceInfo->pDeviceComboList->Count(); idc++ ) { D3DDeviceCombo* pDeviceCombo = (D3DDeviceCombo*)pDeviceInfo->pDeviceComboList->GetPtr(idc); if( pDeviceCombo->IsWindowed ) HasWindowedDeviceCombo = true; else HasFullscreenDeviceCombo = true; } EnableWindow( GetDlgItem( m_hDlg, IDC_WINDOW ), HasWindowedDeviceCombo ); EnableWindow( GetDlgItem( m_hDlg, IDC_FULLSCREEN ), HasFullscreenDeviceCombo ); if (m_d3dSettings.IsWindowed && HasWindowedDeviceCombo) { CheckRadioButton( m_hDlg, IDC_WINDOW, IDC_FULLSCREEN, IDC_WINDOW ); } else { CheckRadioButton( m_hDlg, IDC_WINDOW, IDC_FULLSCREEN, IDC_FULLSCREEN ); } WindowedFullscreenChanged(); } //----------------------------------------------------------------------------- // Name: WindowedFullscreenChanged // Desc: Respond to a change of windowed/fullscreen state by rebuilding the // adapter format list, resolution list, and refresh rate list. // Updating the selected adapter format will trigger updates of the // rest of the dialog. //----------------------------------------------------------------------------- void CD3DSettingsDialog::WindowedFullscreenChanged( void ) { D3DAdapterInfo* pAdapterInfo = (D3DAdapterInfo*)ComboBoxSelected( IDC_ADAPTER_COMBO ); D3DDeviceInfo* pDeviceInfo = (D3DDeviceInfo*)ComboBoxSelected( IDC_DEVICE_COMBO ); if( pAdapterInfo == NULL || pDeviceInfo == NULL ) return; if( IsDlgButtonChecked( m_hDlg, IDC_WINDOW ) ) { m_d3dSettings.IsWindowed = true; m_d3dSettings.pWindowed_AdapterInfo = pAdapterInfo; m_d3dSettings.pWindowed_DeviceInfo = pDeviceInfo; // Update adapter format combo box ComboBoxClear( IDC_ADAPTERFORMAT_COMBO ); ComboBoxAdd( IDC_ADAPTERFORMAT_COMBO, (void*)m_d3dSettings.Windowed_DisplayMode.Format, D3DUtil_D3DFormatToString( m_d3dSettings.Windowed_DisplayMode.Format ) ); ComboBoxSelectIndex( IDC_ADAPTERFORMAT_COMBO, 0 ); EnableWindow( GetDlgItem( m_hDlg, IDC_ADAPTERFORMAT_COMBO ), false ); // Update resolution combo box DWORD dwResolutionData; TCHAR strResolution[50]; dwResolutionData = MAKELONG( m_d3dSettings.Windowed_DisplayMode.Width, m_d3dSettings.Windowed_DisplayMode.Height ); _sntprintf( strResolution, 50, TEXT("%d by %d"), m_d3dSettings.Windowed_DisplayMode.Width, m_d3dSettings.Windowed_DisplayMode.Height ); strResolution[49] = 0; ComboBoxClear( IDC_RESOLUTION_COMBO ); ComboBoxAdd( IDC_RESOLUTION_COMBO, ULongToPtr(dwResolutionData), strResolution ); ComboBoxSelectIndex( IDC_RESOLUTION_COMBO, 0 ); EnableWindow( GetDlgItem( m_hDlg, IDC_RESOLUTION_COMBO ), false ); // Update refresh rate combo box TCHAR strRefreshRate[50]; if( m_d3dSettings.Windowed_DisplayMode.RefreshRate == 0 ) lstrcpy( strRefreshRate, TEXT("Default Rate") ); else _sntprintf( strRefreshRate, 50, TEXT("%d Hz"), m_d3dSettings.Windowed_DisplayMode.RefreshRate ); strRefreshRate[49] = 0; ComboBoxClear( IDC_REFRESHRATE_COMBO ); ComboBoxAdd( IDC_REFRESHRATE_COMBO, ULongToPtr(m_d3dSettings.Windowed_DisplayMode.RefreshRate), strRefreshRate ); ComboBoxSelectIndex( IDC_REFRESHRATE_COMBO, 0 ); EnableWindow( GetDlgItem( m_hDlg, IDC_REFRESHRATE_COMBO ), false ); } else { m_d3dSettings.IsWindowed = false; m_d3dSettings.pFullscreen_AdapterInfo = pAdapterInfo; m_d3dSettings.pFullscreen_DeviceInfo = pDeviceInfo; // Update adapter format combo box ComboBoxClear( IDC_ADAPTERFORMAT_COMBO ); for( UINT idc = 0; idc < pDeviceInfo->pDeviceComboList->Count(); idc++ ) { D3DDeviceCombo* pDeviceCombo = (D3DDeviceCombo*)pDeviceInfo->pDeviceComboList->GetPtr(idc); D3DFORMAT adapterFormat = pDeviceCombo->AdapterFormat; if( !ComboBoxContainsText( IDC_ADAPTERFORMAT_COMBO, D3DUtil_D3DFormatToString( adapterFormat ) ) ) { ComboBoxAdd( IDC_ADAPTERFORMAT_COMBO, (void*)adapterFormat, D3DUtil_D3DFormatToString( adapterFormat ) ); if( adapterFormat == m_d3dSettings.Fullscreen_DisplayMode.Format ) { ComboBoxSelect( IDC_ADAPTERFORMAT_COMBO, (void*)adapterFormat ); } } } if( !ComboBoxSomethingSelected( IDC_ADAPTERFORMAT_COMBO ) && ComboBoxCount( IDC_ADAPTERFORMAT_COMBO ) > 0 ) { ComboBoxSelectIndex( IDC_ADAPTERFORMAT_COMBO, 0 ); } EnableWindow( GetDlgItem( m_hDlg, IDC_ADAPTERFORMAT_COMBO), true ); // Update resolution combo box EnableWindow( GetDlgItem( m_hDlg, IDC_RESOLUTION_COMBO), true ); // Update refresh rate combo box EnableWindow( GetDlgItem( m_hDlg, IDC_REFRESHRATE_COMBO), true ); } } //----------------------------------------------------------------------------- // Name: AdapterFormatChanged // Desc: Respond to a change of selected adapter format by rebuilding the // resolution list and back buffer format list. Updating the selected // resolution and back buffer format will trigger updates of the rest // of the dialog. //----------------------------------------------------------------------------- void CD3DSettingsDialog::AdapterFormatChanged( void ) { if( !IsDlgButtonChecked( m_hDlg, IDC_WINDOW ) ) { D3DAdapterInfo* pAdapterInfo = (D3DAdapterInfo*)ComboBoxSelected( IDC_ADAPTER_COMBO ); D3DFORMAT adapterFormat = (D3DFORMAT)PtrToUlong( ComboBoxSelected( IDC_ADAPTERFORMAT_COMBO ) ); m_d3dSettings.Fullscreen_DisplayMode.Format = adapterFormat; ComboBoxClear( IDC_RESOLUTION_COMBO ); for( UINT idm = 0; idm < pAdapterInfo->pDisplayModeList->Count(); idm++ ) { D3DDISPLAYMODE displayMode = *(D3DDISPLAYMODE*)pAdapterInfo->pDisplayModeList->GetPtr(idm); if (displayMode.Format == adapterFormat) { DWORD dwResolutionData; TCHAR strResolution[50]; dwResolutionData = MAKELONG( displayMode.Width, displayMode.Height ); _sntprintf( strResolution, 50, TEXT("%d by %d"), displayMode.Width, displayMode.Height ); strResolution[49] = 0; if (!ComboBoxContainsText( IDC_RESOLUTION_COMBO, strResolution ) ) { ComboBoxAdd( IDC_RESOLUTION_COMBO, ULongToPtr( dwResolutionData ), strResolution ); if (m_d3dSettings.Fullscreen_DisplayMode.Width == displayMode.Width && m_d3dSettings.Fullscreen_DisplayMode.Height == displayMode.Height) { ComboBoxSelect( IDC_RESOLUTION_COMBO, ULongToPtr( dwResolutionData ) ); } } } } if (!ComboBoxSomethingSelected( IDC_RESOLUTION_COMBO ) && ComboBoxCount( IDC_RESOLUTION_COMBO ) > 0) { ComboBoxSelectIndex( IDC_RESOLUTION_COMBO, 0 ); } } // Update backbuffer format combo box D3DDeviceInfo* pDeviceInfo = (D3DDeviceInfo*)ComboBoxSelected( IDC_DEVICE_COMBO ); if( pDeviceInfo == NULL ) return; ComboBoxClear( IDC_BACKBUFFERFORMAT_COMBO ); for( UINT idc = 0; idc < pDeviceInfo->pDeviceComboList->Count(); idc++ ) { D3DDeviceCombo* pDeviceCombo = (D3DDeviceCombo*)pDeviceInfo->pDeviceComboList->GetPtr(idc); if (pDeviceCombo->IsWindowed == m_d3dSettings.IsWindowed && pDeviceCombo->AdapterFormat == m_d3dSettings.DisplayMode().Format) { if (!ComboBoxContainsText( IDC_BACKBUFFERFORMAT_COMBO, D3DUtil_D3DFormatToString( pDeviceCombo->BackBufferFormat ) ) ) { ComboBoxAdd( IDC_BACKBUFFERFORMAT_COMBO, (void*)pDeviceCombo->BackBufferFormat, D3DUtil_D3DFormatToString( pDeviceCombo->BackBufferFormat ) ); if (pDeviceCombo->BackBufferFormat == m_d3dSettings.BackBufferFormat() ) ComboBoxSelect( IDC_BACKBUFFERFORMAT_COMBO, (void*)pDeviceCombo->BackBufferFormat ); } } } if (!ComboBoxSomethingSelected( IDC_BACKBUFFERFORMAT_COMBO ) && ComboBoxCount( IDC_BACKBUFFERFORMAT_COMBO ) > 0) { ComboBoxSelectIndex( IDC_BACKBUFFERFORMAT_COMBO, 0 ); } } //----------------------------------------------------------------------------- // Name: ResolutionChanged // Desc: Respond to a change of selected resolution by rebuilding the // refresh rate list. //----------------------------------------------------------------------------- void CD3DSettingsDialog::ResolutionChanged( void ) { if (m_d3dSettings.IsWindowed) return; D3DAdapterInfo* pAdapterInfo = (D3DAdapterInfo*)ComboBoxSelected( IDC_ADAPTER_COMBO ); if( pAdapterInfo == NULL ) return; // Update settingsNew with new resolution DWORD dwResolutionData = PtrToUlong( ComboBoxSelected( IDC_RESOLUTION_COMBO ) ); UINT width = LOWORD( dwResolutionData ); UINT height = HIWORD( dwResolutionData ); m_d3dSettings.Fullscreen_DisplayMode.Width = width; m_d3dSettings.Fullscreen_DisplayMode.Height = height; // Update refresh rate list based on new resolution D3DFORMAT adapterFormat = (D3DFORMAT)PtrToUlong( ComboBoxSelected( IDC_ADAPTERFORMAT_COMBO ) ); ComboBoxClear( IDC_REFRESHRATE_COMBO ); for( UINT idm = 0; idm < pAdapterInfo->pDisplayModeList->Count(); idm++ ) { D3DDISPLAYMODE displayMode = *(D3DDISPLAYMODE*)pAdapterInfo->pDisplayModeList->GetPtr(idm); if (displayMode.Format == adapterFormat && displayMode.Width == width && displayMode.Height == height) { TCHAR strRefreshRate[50]; if( displayMode.RefreshRate == 0 ) lstrcpy( strRefreshRate, TEXT("Default Rate") ); else _sntprintf( strRefreshRate, 50, TEXT("%d Hz"), displayMode.RefreshRate ); strRefreshRate[49] = 0; if( !ComboBoxContainsText( IDC_REFRESHRATE_COMBO, strRefreshRate ) ) { ComboBoxAdd( IDC_REFRESHRATE_COMBO, UlongToPtr( displayMode.RefreshRate ), strRefreshRate ); if (m_d3dSettings.Fullscreen_DisplayMode.RefreshRate == displayMode.RefreshRate) ComboBoxSelect( IDC_REFRESHRATE_COMBO, UlongToPtr( displayMode.RefreshRate ) ); } } } if (!ComboBoxSomethingSelected( IDC_REFRESHRATE_COMBO ) && ComboBoxCount( IDC_REFRESHRATE_COMBO ) > 0) { ComboBoxSelectIndex( IDC_REFRESHRATE_COMBO, 0 ); } } //----------------------------------------------------------------------------- // Name: RefreshRateChanged // Desc: Respond to a change of selected refresh rate. //----------------------------------------------------------------------------- void CD3DSettingsDialog::RefreshRateChanged( void ) { if( m_d3dSettings.IsWindowed ) return; // Update settingsNew with new refresh rate UINT refreshRate = PtrToUlong( ComboBoxSelected( IDC_REFRESHRATE_COMBO ) ); m_d3dSettings.Fullscreen_DisplayMode.RefreshRate = refreshRate; } //----------------------------------------------------------------------------- // Name: BackBufferFormatChanged // Desc: Respond to a change of selected back buffer format by rebuilding // the depth/stencil format list, multisample type list, and vertex // processing type list. //----------------------------------------------------------------------------- void CD3DSettingsDialog::BackBufferFormatChanged( void ) { D3DDeviceInfo* pDeviceInfo = (D3DDeviceInfo*)ComboBoxSelected( IDC_DEVICE_COMBO ); D3DFORMAT adapterFormat = (D3DFORMAT)PtrToUlong( ComboBoxSelected( IDC_ADAPTERFORMAT_COMBO ) ); D3DFORMAT backBufferFormat = (D3DFORMAT)PtrToUlong( ComboBoxSelected( IDC_BACKBUFFERFORMAT_COMBO ) ); if( pDeviceInfo == NULL ) return; for( UINT idc = 0; idc < pDeviceInfo->pDeviceComboList->Count(); idc++ ) { D3DDeviceCombo* pDeviceCombo = (D3DDeviceCombo*)pDeviceInfo->pDeviceComboList->GetPtr(idc); if (pDeviceCombo->IsWindowed == m_d3dSettings.IsWindowed && pDeviceCombo->AdapterFormat == adapterFormat && pDeviceCombo->BackBufferFormat == backBufferFormat) { if( m_d3dSettings.IsWindowed ) m_d3dSettings.pWindowed_DeviceCombo = pDeviceCombo; else m_d3dSettings.pFullscreen_DeviceCombo = pDeviceCombo; ComboBoxClear( IDC_DEPTHSTENCILBUFFERFORMAT_COMBO ); if( m_pEnumeration->AppUsesDepthBuffer ) { for( UINT ifmt = 0; ifmt < pDeviceCombo->pDepthStencilFormatList->Count(); ifmt++ ) { D3DFORMAT fmt = *(D3DFORMAT*)pDeviceCombo->pDepthStencilFormatList->GetPtr(ifmt); ComboBoxAdd( IDC_DEPTHSTENCILBUFFERFORMAT_COMBO, (void*)fmt, D3DUtil_D3DFormatToString(fmt) ); if( fmt == m_d3dSettings.DepthStencilBufferFormat() ) ComboBoxSelect( IDC_DEPTHSTENCILBUFFERFORMAT_COMBO, (void*)fmt ); } if (!ComboBoxSomethingSelected( IDC_DEPTHSTENCILBUFFERFORMAT_COMBO ) && ComboBoxCount( IDC_DEPTHSTENCILBUFFERFORMAT_COMBO ) > 0) { ComboBoxSelectIndex( IDC_DEPTHSTENCILBUFFERFORMAT_COMBO, 0 ); } } else { EnableWindow( GetDlgItem( m_hDlg, IDC_DEPTHSTENCILBUFFERFORMAT_COMBO ), false ); ComboBoxAdd( IDC_DEPTHSTENCILBUFFERFORMAT_COMBO, NULL, TEXT("(not used)") ); ComboBoxSelectIndex( IDC_DEPTHSTENCILBUFFERFORMAT_COMBO, 0 ); } ComboBoxClear( IDC_VERTEXPROCESSING_COMBO ); for( UINT ivpt = 0; ivpt < pDeviceCombo->pVertexProcessingTypeList->Count(); ivpt++ ) { VertexProcessingType vpt = *(VertexProcessingType*)pDeviceCombo->pVertexProcessingTypeList->GetPtr(ivpt); ComboBoxAdd( IDC_VERTEXPROCESSING_COMBO, (void*)vpt, VertexProcessingTypeToString(vpt) ); if( vpt == m_d3dSettings.GetVertexProcessingType() ) ComboBoxSelect( IDC_VERTEXPROCESSING_COMBO, (void*)vpt ); } if (!ComboBoxSomethingSelected( IDC_VERTEXPROCESSING_COMBO ) && ComboBoxCount( IDC_VERTEXPROCESSING_COMBO ) > 0) { ComboBoxSelectIndex( IDC_VERTEXPROCESSING_COMBO, 0 ); } ComboBoxClear( IDC_PRESENTINTERVAL_COMBO ); for( UINT ipi = 0; ipi < pDeviceCombo->pPresentIntervalList->Count(); ipi++ ) { UINT pi = *(UINT*)pDeviceCombo->pPresentIntervalList->GetPtr(ipi); ComboBoxAdd( IDC_PRESENTINTERVAL_COMBO, UlongToPtr( pi ), PresentIntervalToString(pi) ); if( pi == m_d3dSettings.PresentInterval() ) ComboBoxSelect( IDC_PRESENTINTERVAL_COMBO, UlongToPtr( pi ) ); } if (!ComboBoxSomethingSelected( IDC_PRESENTINTERVAL_COMBO ) && ComboBoxCount( IDC_PRESENTINTERVAL_COMBO ) > 0) { ComboBoxSelectIndex( IDC_PRESENTINTERVAL_COMBO, 0 ); } break; } } } //----------------------------------------------------------------------------- // Name: DepthStencilBufferFormatChanged // Desc: Respond to a change of selected depth/stencil buffer format. //----------------------------------------------------------------------------- void CD3DSettingsDialog::DepthStencilBufferFormatChanged( void ) { D3DFORMAT fmt = (D3DFORMAT)PtrToUlong( ComboBoxSelected( IDC_DEPTHSTENCILBUFFERFORMAT_COMBO ) ); if( m_pEnumeration->AppUsesDepthBuffer ) m_d3dSettings.SetDepthStencilBufferFormat( fmt ); // Build multisample list D3DDeviceCombo* pDeviceCombo = m_d3dSettings.PDeviceCombo(); ComboBoxClear( IDC_MULTISAMPLE_COMBO ); for( UINT ims = 0; ims < pDeviceCombo->pMultiSampleTypeList->Count(); ims++ ) { D3DMULTISAMPLE_TYPE msType = *(D3DMULTISAMPLE_TYPE*)pDeviceCombo->pMultiSampleTypeList->GetPtr(ims); // check for DS/MS conflicts BOOL bConflictFound = FALSE; for( UINT iConf = 0; iConf < pDeviceCombo->pDSMSConflictList->Count(); iConf++ ) { D3DDSMSConflict* pDSMSConf = (D3DDSMSConflict*)pDeviceCombo->pDSMSConflictList->GetPtr(iConf); if( pDSMSConf->DSFormat == fmt && pDSMSConf->MSType == msType ) { bConflictFound = TRUE; break; } } if( !bConflictFound ) { ComboBoxAdd( IDC_MULTISAMPLE_COMBO, (void*)msType, MultisampleTypeToString(msType) ); if( msType == m_d3dSettings.MultisampleType() ) ComboBoxSelect( IDC_MULTISAMPLE_COMBO, (void*)msType ); } } if (!ComboBoxSomethingSelected( IDC_MULTISAMPLE_COMBO ) && ComboBoxCount( IDC_MULTISAMPLE_COMBO ) > 0) { ComboBoxSelectIndex( IDC_MULTISAMPLE_COMBO, 0 ); } } //----------------------------------------------------------------------------- // Name: MultisampleTypeChanged // Desc: Respond to a change of selected multisample type. //----------------------------------------------------------------------------- void CD3DSettingsDialog::MultisampleTypeChanged( void ) { D3DMULTISAMPLE_TYPE mst = (D3DMULTISAMPLE_TYPE)PtrToUlong( ComboBoxSelected( IDC_MULTISAMPLE_COMBO ) ); m_d3dSettings.SetMultisampleType( mst ); // Set up max quality for this mst D3DDeviceCombo* pDeviceCombo = m_d3dSettings.PDeviceCombo(); DWORD maxQuality = 0; for( UINT ims = 0; ims < pDeviceCombo->pMultiSampleTypeList->Count(); ims++ ) { D3DMULTISAMPLE_TYPE msType = *(D3DMULTISAMPLE_TYPE*)pDeviceCombo->pMultiSampleTypeList->GetPtr(ims); if( msType == mst ) { maxQuality = *(DWORD*)pDeviceCombo->pMultiSampleQualityList->GetPtr(ims); break; } } ComboBoxClear( IDC_MULTISAMPLE_QUALITY_COMBO ); for( UINT msq = 0; msq < maxQuality; msq++ ) { TCHAR str[100]; wsprintf( str, TEXT("%d"), msq ); ComboBoxAdd( IDC_MULTISAMPLE_QUALITY_COMBO, UlongToPtr( msq ), str ); if( msq == m_d3dSettings.MultisampleQuality() ) ComboBoxSelect( IDC_MULTISAMPLE_QUALITY_COMBO, UlongToPtr( msq ) ); } if (!ComboBoxSomethingSelected( IDC_MULTISAMPLE_QUALITY_COMBO ) && ComboBoxCount( IDC_MULTISAMPLE_QUALITY_COMBO ) > 0) { ComboBoxSelectIndex( IDC_MULTISAMPLE_QUALITY_COMBO, 0 ); } } //----------------------------------------------------------------------------- // Name: MultisampleQualityChanged // Desc: Respond to a change of selected multisample quality. //----------------------------------------------------------------------------- void CD3DSettingsDialog::MultisampleQualityChanged( void ) { DWORD msq = (DWORD)PtrToUlong( ComboBoxSelected( IDC_MULTISAMPLE_QUALITY_COMBO ) ); m_d3dSettings.SetMultisampleQuality( msq ); } //----------------------------------------------------------------------------- // Name: VertexProcessingChanged // Desc: Respond to a change of selected vertex processing type. //----------------------------------------------------------------------------- void CD3DSettingsDialog::VertexProcessingChanged( void ) { VertexProcessingType vpt = (VertexProcessingType)PtrToUlong( ComboBoxSelected( IDC_VERTEXPROCESSING_COMBO ) ); m_d3dSettings.SetVertexProcessingType( vpt ); } //----------------------------------------------------------------------------- // Name: PresentIntervalChanged // Desc: Respond to a change of selected present interval. //----------------------------------------------------------------------------- void CD3DSettingsDialog::PresentIntervalChanged( void ) { UINT pi = PtrToUlong( ComboBoxSelected( IDC_PRESENTINTERVAL_COMBO ) ); m_d3dSettings.SetPresentInterval( pi ); }