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:
Glenn Maynard
2002-08-29 20:59:47 +00:00
parent 2a5d068a6c
commit 5ab889f509
3 changed files with 40 additions and 34 deletions
+25 -6
View File
@@ -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()
+7 -22
View File
@@ -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;
+8 -6
View File
@@ -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;