Deal with systems that have different refresh rates available at 16bpp
and 32bpp. (There are still systems that report refresh rates they can't really use ... need to probe, I think.)
This commit is contained in:
@@ -115,7 +115,9 @@ int RageDisplay::MaxRefresh(int iWidth, int iHeight, D3DFORMAT fmt) const
|
||||
return mx;
|
||||
}
|
||||
|
||||
void RageDisplay::GetHzAtResolution(int width, int height, CArray<int,int> &add) const
|
||||
/* Get the maximum refresh rate available in the given size, for any format
|
||||
* that fits bpp. */
|
||||
void RageDisplay::GetHzAtResolution(int width, int height, int bpp, CArray<int,int> &add) const
|
||||
{
|
||||
for( UINT u=0; u<m_pd3d->GetAdapterModeCount(D3DADAPTER_DEFAULT); u++ )
|
||||
{
|
||||
@@ -125,7 +127,7 @@ void RageDisplay::GetHzAtResolution(int width, int height, CArray<int,int> &add)
|
||||
|
||||
if(mode.Width != width) continue;
|
||||
if(mode.Height != height) continue;
|
||||
/* also test mode.Format? */
|
||||
if(GetBPP(mode.Format) != bpp) continue;
|
||||
|
||||
add.Add(mode.RefreshRate);
|
||||
}
|
||||
@@ -178,8 +180,8 @@ bool RageDisplay::SwitchDisplayMode(
|
||||
|
||||
// Test each back buffer format until we find something that works.
|
||||
D3DFORMAT fmtBackBuffer; // fill this in below...
|
||||
|
||||
for( int i=0; i < arrayBackBufferFormats.GetSize(); i++ )
|
||||
int i;
|
||||
for( i=0; i < arrayBackBufferFormats.GetSize(); i++ )
|
||||
{
|
||||
D3DFORMAT fmtDisplay;
|
||||
if( bWindowed )
|
||||
@@ -236,8 +238,8 @@ bool RageDisplay::SwitchDisplayMode(
|
||||
m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
|
||||
m_d3dpp.Flags = 0;
|
||||
m_d3dpp.FullScreen_RefreshRateInHz = bWindowed? D3DPRESENT_RATE_DEFAULT :
|
||||
iFullScreenHz == 0? MaxRefresh(iWidth, iHeight, fmtBackBuffer):
|
||||
iFullScreenHz == 1? D3DPRESENT_RATE_DEFAULT:
|
||||
iFullScreenHz == REFRESH_MAX? MaxRefresh(iWidth, iHeight, fmtBackBuffer):
|
||||
iFullScreenHz == REFRESH_DEFAULT? D3DPRESENT_RATE_DEFAULT:
|
||||
iFullScreenHz;
|
||||
m_d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
|
||||
|
||||
@@ -445,6 +447,23 @@ HRESULT RageDisplay::Restore()
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
int RageDisplay::GetBPP(D3DFORMAT fmt) const
|
||||
{
|
||||
switch( fmt )
|
||||
{
|
||||
case D3DFMT_R5G6B5:
|
||||
case D3DFMT_X1R5G5B5:
|
||||
case D3DFMT_A1R5G5B5:
|
||||
return 16;
|
||||
case D3DFMT_R8G8B8:
|
||||
case D3DFMT_X8R8G8B8:
|
||||
case D3DFMT_A8R8G8B8:
|
||||
return 32;
|
||||
default:
|
||||
ASSERT( false ); // unexpected format
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RageDisplay::CreateVertexBuffer()
|
||||
|
||||
@@ -49,6 +49,7 @@ class RageDisplay
|
||||
public:
|
||||
RageDisplay( HWND hWnd );
|
||||
~RageDisplay();
|
||||
enum { REFRESH_MAX=0, REFRESH_DEFAULT=1 };
|
||||
bool SwitchDisplayMode(
|
||||
const bool bWindowed, const int iWidth, const int iHeight, const int iBPP, const int iFullScreenHz );
|
||||
|
||||
@@ -65,27 +66,10 @@ public:
|
||||
HRESULT Restore();
|
||||
|
||||
|
||||
BOOL IsWindowed() { return m_d3dpp.Windowed; };
|
||||
DWORD GetWidth() { return m_d3dpp.BackBufferWidth; };
|
||||
DWORD GetHeight() { return m_d3dpp.BackBufferHeight; };
|
||||
DWORD GetBPP()
|
||||
{
|
||||
switch( m_d3dpp.BackBufferFormat )
|
||||
{
|
||||
case D3DFMT_R5G6B5:
|
||||
case D3DFMT_X1R5G5B5:
|
||||
case D3DFMT_A1R5G5B5:
|
||||
return 16;
|
||||
case D3DFMT_R8G8B8:
|
||||
case D3DFMT_X8R8G8B8:
|
||||
case D3DFMT_A8R8G8B8:
|
||||
return 32;
|
||||
default:
|
||||
ASSERT( false ); // unexpected format
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool IsWindowed() const { return !!m_d3dpp.Windowed; };
|
||||
int GetWidth() const { return m_d3dpp.BackBufferWidth; };
|
||||
int GetHeight() const { return m_d3dpp.BackBufferHeight; };
|
||||
int GetBPP() const { return GetBPP( m_d3dpp.BackBufferFormat ); }
|
||||
|
||||
// LPDIRECT3DVERTEXBUFFER8 GetVertexBuffer() { return m_pVB; };
|
||||
void SetViewTransform( const D3DXMATRIX* pMatrix );
|
||||
@@ -108,10 +92,11 @@ public:
|
||||
int GetTPF() { return m_iTPF; };
|
||||
int GetDPF() { return m_iDPF; };
|
||||
|
||||
void GetHzAtResolution(int width, int height, CArray<int,int> &add) const;
|
||||
void GetHzAtResolution(int width, int height, int bpp, CArray<int,int> &add) const;
|
||||
|
||||
private:
|
||||
int MaxRefresh(int iWidth, int iHeight, D3DFORMAT fmt) const;
|
||||
int GetBPP(D3DFORMAT fmt) const;
|
||||
D3DXMATRIX& GetTopMatrix() { return m_MatrixStack.ElementAt( m_MatrixStack.GetSize()-1 ); };
|
||||
|
||||
HWND m_hWnd;
|
||||
|
||||
@@ -78,8 +78,10 @@ void ScreenGraphicOptions::UpdateRefreshRates()
|
||||
{
|
||||
CArray<int,int> hz;
|
||||
|
||||
/* XXX: We're hardcoded to 16bpp in StepMania.cpp; if we add a bpp option
|
||||
* this needs to be changed. */
|
||||
DISPLAY->GetHzAtResolution(HorizRes[m_iSelectedOption[0][GO_DISPLAY_RESOLUTION]],
|
||||
VertRes[m_iSelectedOption[0][GO_DISPLAY_RESOLUTION]], hz);
|
||||
VertRes[m_iSelectedOption[0][GO_DISPLAY_RESOLUTION]], 16 /* XXX */, hz);
|
||||
|
||||
/* Disable all refresh rates (except DEFAULT/MAX). */
|
||||
int i;
|
||||
@@ -114,7 +116,7 @@ void ScreenGraphicOptions::UpdateRefreshRates()
|
||||
int CurSel = m_iSelectedOption[0][GO_REFRESH_RATE];
|
||||
if(m_OptionDim[GO_REFRESH_RATE][CurSel])
|
||||
m_iSelectedOption[0][GO_REFRESH_RATE] =
|
||||
m_iSelectedOption[1][GO_REFRESH_RATE] = 0;
|
||||
m_iSelectedOption[1][GO_REFRESH_RATE] = RageDisplay::REFRESH_MAX;
|
||||
// PositionUnderlines();
|
||||
}
|
||||
|
||||
@@ -150,8 +152,8 @@ void ScreenGraphicOptions::ImportOptions()
|
||||
|
||||
switch( PREFSMAN->m_iRefreshRate )
|
||||
{
|
||||
case 0: m_iSelectedOption[0][GO_REFRESH_RATE] = 0; break;
|
||||
case 1: m_iSelectedOption[0][GO_REFRESH_RATE] = 1; break;
|
||||
case RageDisplay::REFRESH_MAX: m_iSelectedOption[0][GO_REFRESH_RATE] = 0; break;
|
||||
case RageDisplay::REFRESH_DEFAULT: m_iSelectedOption[0][GO_REFRESH_RATE] = 1; break;
|
||||
case 60: m_iSelectedOption[0][GO_REFRESH_RATE] = 2; break;
|
||||
case 70: m_iSelectedOption[0][GO_REFRESH_RATE] = 3; break;
|
||||
case 72: m_iSelectedOption[0][GO_REFRESH_RATE] = 4; break;
|
||||
@@ -192,8 +194,8 @@ void ScreenGraphicOptions::ExportOptions()
|
||||
|
||||
switch( m_iSelectedOption[0][GO_REFRESH_RATE] )
|
||||
{
|
||||
case 0: PREFSMAN->m_iRefreshRate = 0; break;
|
||||
case 1: PREFSMAN->m_iRefreshRate = 1; break;
|
||||
case 0: PREFSMAN->m_iRefreshRate = RageDisplay::REFRESH_MAX; break;
|
||||
case 1: PREFSMAN->m_iRefreshRate = RageDisplay::REFRESH_DEFAULT;break;
|
||||
case 2: PREFSMAN->m_iRefreshRate = 60; break;
|
||||
case 3: PREFSMAN->m_iRefreshRate = 70; break;
|
||||
case 4: PREFSMAN->m_iRefreshRate = 72; break;
|
||||
|
||||
Reference in New Issue
Block a user