From 5ab889f509da8c6b5474653906c130e9f02ac645 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Thu, 29 Aug 2002 20:59:47 +0000 Subject: [PATCH] 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.) --- stepmania/src/RageDisplay.cpp | 31 +++++++++++++++++++++----- stepmania/src/RageDisplay.h | 29 ++++++------------------ stepmania/src/ScreenGraphicOptions.cpp | 14 +++++++----- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/stepmania/src/RageDisplay.cpp b/stepmania/src/RageDisplay.cpp index 0d3ac302b2..c3c9f236a4 100644 --- a/stepmania/src/RageDisplay.cpp +++ b/stepmania/src/RageDisplay.cpp @@ -115,7 +115,9 @@ int RageDisplay::MaxRefresh(int iWidth, int iHeight, D3DFORMAT fmt) const return mx; } -void RageDisplay::GetHzAtResolution(int width, int height, CArray &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 &add) const { for( UINT u=0; uGetAdapterModeCount(D3DADAPTER_DEFAULT); u++ ) { @@ -125,7 +127,7 @@ void RageDisplay::GetHzAtResolution(int width, int height, CArray &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() diff --git a/stepmania/src/RageDisplay.h b/stepmania/src/RageDisplay.h index 49e097be99..6d5cfd4078 100644 --- a/stepmania/src/RageDisplay.h +++ b/stepmania/src/RageDisplay.h @@ -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 &add) const; + void GetHzAtResolution(int width, int height, int bpp, CArray &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; diff --git a/stepmania/src/ScreenGraphicOptions.cpp b/stepmania/src/ScreenGraphicOptions.cpp index 60ab258235..8fd7ccb1f4 100644 --- a/stepmania/src/ScreenGraphicOptions.cpp +++ b/stepmania/src/ScreenGraphicOptions.cpp @@ -78,8 +78,10 @@ void ScreenGraphicOptions::UpdateRefreshRates() { CArray 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;