ADDED full screen mode enumeration functionality to OpenGL (uses Windows GDI functions).

This commit is contained in:
spacy51 2008-01-20 20:22:57 +00:00
parent c80a3917cb
commit 23fe108b5d
3 changed files with 285 additions and 49 deletions

View File

@ -20,12 +20,13 @@ Important:
Less important: Less important:
- Add GBA cheat editing support (GB already has)
- Look at Cheats.cpp (Core) and GBACheats.cpp (GUI)
- Support D3DFMT_A2R10G10B10 (10 bit per color component) color format - Support D3DFMT_A2R10G10B10 (10 bit per color component) color format
- Add documentation for VBA-M (configuration guide) - Add documentation for VBA-M (configuration guide)
- DDraw, D3D, OGL: Add full screen device & frequency selection
- Improve AVI recording (produces asynchronous files) - Improve AVI recording (produces asynchronous files)
- Enable audio stream compression for AVI files - Enable audio stream compression for AVI files

View File

@ -100,12 +100,23 @@ BOOL FullscreenSettings::OnInitDialog()
} }
#endif #endif
//#ifndef NO_OGL #ifndef NO_OGL
//case OPENGL: if( api == OPENGL ) {
//break; // enumerate devices
//#endif DWORD iDevice = 0;
DISPLAY_DEVICE devInfo;
// TODO: Add extra initialization here ZeroMemory( &devInfo, sizeof(devInfo) );
devInfo.cb = sizeof(devInfo);
combo_device.ResetContent();
while( TRUE == EnumDisplayDevices( NULL, iDevice, &devInfo, 0 ) ) {
int index = combo_device.AddString( devInfo.DeviceString );
combo_device.SetItemData( index, (DWORD_PTR)iDevice );
iDevice++;
}
combo_device.SetCurSel( 0 );
OnCbnSelchangeComboDevice();
}
#endif
return TRUE; // return TRUE unless you set the focus to a control return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE // EXCEPTION: OCX Property Pages should return FALSE
@ -121,7 +132,7 @@ void FullscreenSettings::setAPI( DISPLAY_TYPE type )
void FullscreenSettings::OnCbnSelchangeComboDevice() void FullscreenSettings::OnCbnSelchangeComboDevice()
{ {
if( failed ) return; failed = false;
#ifndef NO_D3D #ifndef NO_D3D
if( api == DIRECT_3D ) { if( api == DIRECT_3D ) {
@ -162,10 +173,66 @@ void FullscreenSettings::OnCbnSelchangeComboDevice()
if( combo_color_depth.GetCount() == 0 ) { if( combo_color_depth.GetCount() == 0 ) {
failed = true; failed = true;
combo_resolution.ResetContent();
combo_refresh_rate.ResetContent();
return; return;
} }
combo_color_depth.SetCurSel( 0 ); combo_color_depth.SetCurSel( combo_color_depth.GetCount() - 1 );
OnCbnSelchangeComboColorDepth();
}
#endif
#ifndef NO_OGL
if( api == OPENGL ) {
int selection;
// get selected device's name
selection = combo_device.GetCurSel();
if( selection == LB_ERR ) return;
DWORD iDevice = (UINT)combo_device.GetItemData( selection );
DISPLAY_DEVICE devInfo;
ZeroMemory( &devInfo, sizeof(devInfo) );
devInfo.cb = sizeof(devInfo);
EnumDisplayDevices( NULL, iDevice, &devInfo, 0 );
// enumerate color depths
DWORD iMode = 0;
DEVMODE mode;
ZeroMemory( &mode, sizeof(mode) );
mode.dmSize = sizeof(mode);
bool alreadyExists;
combo_color_depth.ResetContent();
while( TRUE == EnumDisplaySettings( devInfo.DeviceName, iMode, &mode ) ) {
if( mode.dmDisplayFlags != 0 ) {
iMode++;
continue; // don't list special modes
}
alreadyExists = false;
for( int iItem = 0 ; iItem < combo_color_depth.GetCount() ; iItem++ ) {
if( mode.dmBitsPerPel == (DWORD)combo_color_depth.GetItemData( iItem ) ) {
alreadyExists = true;
break;
}
}
if( !alreadyExists ) {
CString temp;
temp.Format( _T("%2u bits per pixel"), mode.dmBitsPerPel );
int index = combo_color_depth.AddString( temp );
combo_color_depth.SetItemData( index, (DWORD_PTR)mode.dmBitsPerPel );
}
iMode++;
}
if( combo_color_depth.GetCount() == 0 ) {
failed = true;
combo_resolution.ResetContent();
combo_refresh_rate.ResetContent();
return;
}
combo_color_depth.SetCurSel( combo_color_depth.GetCount() - 1 );
OnCbnSelchangeComboColorDepth(); OnCbnSelchangeComboColorDepth();
} }
#endif #endif
@ -217,14 +284,73 @@ void FullscreenSettings::OnCbnSelchangeComboColorDepth()
allModes[i] = mode; allModes[i] = mode;
} }
} }
delete [] allModes; delete [] allModes;
int count = combo_resolution.GetCount();
combo_resolution.SetCurSel( count - 1 ); // select last item
OnCbnSelchangeComboResolution();
} }
#endif #endif
#ifndef NO_OGL
if( api == OPENGL ) {
int selection;
// get selected device's name
selection = combo_device.GetCurSel();
if( selection == LB_ERR ) return;
DWORD iDevice = (UINT)combo_device.GetItemData( selection );
DISPLAY_DEVICE devInfo;
ZeroMemory( &devInfo, sizeof(devInfo) );
devInfo.cb = sizeof(devInfo);
EnumDisplayDevices( NULL, iDevice, &devInfo, 0 );
// get selected bit depth value
selection = combo_color_depth.GetCurSel();
if( selection == LB_ERR ) return;
DWORD selectedBPP = (DWORD)combo_color_depth.GetItemData( selection );
// enumerate resolutions
DWORD iMode = 0;
DEVMODE mode, surfMode;
ZeroMemory( &mode, sizeof(mode) );
ZeroMemory( &surfMode, sizeof(surfMode) );
mode.dmSize = sizeof(mode);
surfMode.dmSize = sizeof(surfMode);
bool alreadyExists;
combo_resolution.ResetContent();
while( TRUE == EnumDisplaySettings( devInfo.DeviceName, iMode, &mode ) ) {
if( ( mode.dmBitsPerPel != selectedBPP) ||
( mode.dmDisplayFlags != 0 ) ) {
iMode++;
continue;
}
alreadyExists = false;
for( int iItem = 0 ; iItem < combo_resolution.GetCount() ; iItem++ ) {
DWORD iSurfMode = (DWORD)combo_resolution.GetItemData( iItem );
EnumDisplaySettings( devInfo.DeviceName, iSurfMode, &surfMode );
if( ( mode.dmPelsWidth == surfMode.dmPelsWidth ) &&
( mode.dmPelsHeight == surfMode.dmPelsHeight ) ) {
alreadyExists = true;
break;
}
}
if( !alreadyExists ) {
CString temp;
temp.Format( _T("%4u x %4u"), mode.dmPelsWidth, mode.dmPelsHeight );
int index = combo_resolution.AddString( temp );
combo_resolution.SetItemData( index, (DWORD_PTR)iMode );
}
iMode++;
}
if( combo_resolution.GetCount() == 0 ) {
failed = true;
return;
}
}
#endif
combo_resolution.SetCurSel( combo_resolution.GetCount() - 1 ); // select last item
OnCbnSelchangeComboResolution();
} }
@ -267,11 +393,72 @@ void FullscreenSettings::OnCbnSelchangeComboResolution()
combo_refresh_rate.SetItemData( index, (DWORD_PTR)i ); combo_refresh_rate.SetItemData( index, (DWORD_PTR)i );
} }
} }
int count = combo_refresh_rate.GetCount();
combo_refresh_rate.SetCurSel( count - 1 ); // select last item
} }
#endif #endif
#ifndef NO_OGL
if( api == OPENGL ) {
int selection;
// get selected device's name
selection = combo_device.GetCurSel();
if( selection == LB_ERR ) return;
DWORD iDevice = (UINT)combo_device.GetItemData( selection );
DISPLAY_DEVICE devInfo;
ZeroMemory( &devInfo, sizeof(devInfo) );
devInfo.cb = sizeof(devInfo);
EnumDisplayDevices( NULL, iDevice, &devInfo, 0 );
// get selected resolution / bpp
DEVMODE selectedResolution;
ZeroMemory( &selectedResolution, sizeof(selectedResolution) );
selectedResolution.dmSize = sizeof(selectedResolution);
selection = combo_resolution.GetCurSel();
if( selection == LB_ERR ) return;
DWORD dwSelectedRes = (DWORD)combo_resolution.GetItemData( selection );
EnumDisplaySettings( devInfo.DeviceName, dwSelectedRes, &selectedResolution );
// enumerate refresh rates
DWORD iMode = 0;
DEVMODE mode, surfMode;
ZeroMemory( &mode, sizeof(mode) );
ZeroMemory( &surfMode, sizeof(surfMode) );
mode.dmSize = sizeof(mode);
surfMode.dmSize = sizeof(surfMode);
bool alreadyExists;
combo_refresh_rate.ResetContent();
while( TRUE == EnumDisplaySettings( devInfo.DeviceName, iMode, &mode ) ) {
if( ( mode.dmBitsPerPel != selectedResolution.dmBitsPerPel ) ||
( mode.dmDisplayFlags != 0 ) ||
( mode.dmPelsWidth != selectedResolution.dmPelsWidth ) ||
( mode.dmPelsHeight != selectedResolution.dmPelsHeight ) ) {
iMode++;
continue;
}
alreadyExists = false;
for( int iItem = 0 ; iItem < combo_refresh_rate.GetCount() ; iItem++ ) {
DWORD iSurfMode = (DWORD)combo_refresh_rate.GetItemData( iItem );
EnumDisplaySettings( devInfo.DeviceName, iSurfMode, &surfMode );
if( ( mode.dmDisplayFrequency == surfMode.dmDisplayFrequency ) ) {
alreadyExists = true;
break;
}
}
if( !alreadyExists ) {
CString temp;
temp.Format( _T("%3u Hz"), mode.dmDisplayFrequency );
int index = combo_refresh_rate.AddString( temp );
combo_refresh_rate.SetItemData( index, (DWORD_PTR)iMode );
}
iMode++;
}
}
#endif
combo_refresh_rate.SetCurSel( combo_refresh_rate.GetCount() - 1 ); // select last item
} }
void FullscreenSettings::OnOK() void FullscreenSettings::OnOK()
@ -279,42 +466,90 @@ void FullscreenSettings::OnOK()
if( failed ) return; if( failed ) return;
#ifndef NO_D3D #ifndef NO_D3D
int selection; if( api == DIRECT_3D ) {
int selection;
selection = combo_device.GetCurSel(); selection = combo_device.GetCurSel();
if( selection == LB_ERR ) return; if( selection == LB_ERR ) return;
UINT adapter = (UINT)combo_device.GetItemData( selection ); UINT adapter = (UINT)combo_device.GetItemData( selection );
selection = combo_color_depth.GetCurSel(); selection = combo_color_depth.GetCurSel();
if( selection == LB_ERR ) return; if( selection == LB_ERR ) return;
D3DFORMAT format = (D3DFORMAT)combo_color_depth.GetItemData( selection ); D3DFORMAT format = (D3DFORMAT)combo_color_depth.GetItemData( selection );
selection = combo_refresh_rate.GetCurSel(); selection = combo_refresh_rate.GetCurSel();
if( selection == LB_ERR ) return; if( selection == LB_ERR ) return;
UINT selectedMode = (UINT)combo_refresh_rate.GetItemData( selection ); UINT selectedMode = (UINT)combo_refresh_rate.GetItemData( selection );
D3DDISPLAYMODE mode; D3DDISPLAYMODE mode;
pD3D->EnumAdapterModes( adapter, format, selectedMode, &mode ); pD3D->EnumAdapterModes( adapter, format, selectedMode, &mode );
m_device = (unsigned int)adapter; m_device = (unsigned int)adapter;
switch( mode.Format ) switch( mode.Format )
{ // TODO: use these assignments for VBA as well { // TODO: use these assignments for VBA as well
case D3DFMT_A2R10G10B10: case D3DFMT_A2R10G10B10:
m_colorDepth = 30; m_colorDepth = 30;
break; break;
case D3DFMT_X8R8G8B8: case D3DFMT_X8R8G8B8:
m_colorDepth = 24; m_colorDepth = 24;
break; break;
case D3DFMT_R5G6B5: case D3DFMT_R5G6B5:
m_colorDepth = 16; m_colorDepth = 16;
break; break;
case D3DFMT_X1R5G5B5: case D3DFMT_X1R5G5B5:
m_colorDepth = 15; m_colorDepth = 15;
break; break;
}
m_width = (unsigned int)mode.Width;
m_height = (unsigned int)mode.Height;
m_refreshRate = (unsigned int)mode.RefreshRate;
}
#endif
#ifndef NO_OGL
if( api == OPENGL ) {
int selection;
// get selected device's name
selection = combo_device.GetCurSel();
if( selection == LB_ERR ) return;
DWORD iDevice = (UINT)combo_device.GetItemData( selection );
DISPLAY_DEVICE devInfo;
ZeroMemory( &devInfo, sizeof(devInfo) );
devInfo.cb = sizeof(devInfo);
EnumDisplayDevices( NULL, iDevice, &devInfo, 0 );
// get selected resolution / bpp
DEVMODE mode;
ZeroMemory( &mode, sizeof(mode) );
mode.dmSize = sizeof(mode);
selection = combo_refresh_rate.GetCurSel();
if( selection == LB_ERR ) return;
DWORD selectedMode = (DWORD)combo_refresh_rate.GetItemData( selection );
EnumDisplaySettings( devInfo.DeviceName, selectedMode, &mode );
m_device = (unsigned int)iDevice;
switch( mode.dmBitsPerPel )
{ // the policy of this dialog is to return the actually usable amount of bits
case 4:
m_colorDepth = 4;
break;
case 8:
m_colorDepth = 8;
break;
case 16:
m_colorDepth = 16;
break;
case 24:
case 32:
m_colorDepth = 24;
break;
}
m_width = (unsigned int)mode.dmPelsWidth;
m_height = (unsigned int)mode.dmPelsHeight;
m_refreshRate = (unsigned int)mode.dmDisplayFrequency;
} }
m_width = (unsigned int)mode.Width;
m_height = (unsigned int)mode.Height;
m_refreshRate = (unsigned int)mode.RefreshRate;
#endif #endif
CDialog::OnOK(); CDialog::OnOK();

View File

@ -1139,7 +1139,7 @@ BEGIN
COMBOBOX IDC_COMBO_RESOLUTION,60,42,102,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO_RESOLUTION,60,42,102,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
RTEXT "Resolution:",IDC_STATIC,6,42,48,12 RTEXT "Resolution:",IDC_STATIC,6,42,48,12
RTEXT "Color depth:",IDC_STATIC,6,24,48,12 RTEXT "Color depth:",IDC_STATIC,6,24,48,12
COMBOBOX IDC_COMBO_COLOR_DEPTH,60,24,102,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO_COLOR_DEPTH,60,24,102,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
RTEXT "Refresh rate:",IDC_STATIC,6,60,48,12 RTEXT "Refresh rate:",IDC_STATIC,6,60,48,12
COMBOBOX IDC_COMBO_REFRESH_RATE,60,60,102,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO_REFRESH_RATE,60,60,102,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_COMBO_DEVICE,60,6,102,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO_DEVICE,60,6,102,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP