bool RageDisplay_D3D::BeginFrame() { GraphicsWindow::Update(); switch( g_pd3dDevice->TestCooperativeLevel() ) { case D3DERR_DEVICELOST: return false; case D3DERR_DEVICENOTRESET: { bool bIgnore = false; RString sError = SetD3DParams( bIgnore ); if( sError != "" ) RageException::Throw( sError ); break; } } g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0x00000000 ); g_pd3dDevice->BeginScene(); return RageDisplay::BeginFrame(); }
// Set the video mode. RString RageDisplay_D3D::TryVideoMode( const VideoModeParams &_p, bool &bNewDeviceOut ) { VideoModeParams p = _p; LOG->Warn( "RageDisplay_D3D::TryVideoMode( %d, %d, %d, %d, %d, %d )", p.windowed, p.width, p.height, p.bpp, p.rate, p.vsync ); if( FindBackBufferType( p.windowed, p.bpp ) == D3DFMT_UNKNOWN ) // no possible back buffer formats return ssprintf( "FindBackBufferType(%i,%i) failed", p.windowed, p.bpp ); // failed to set mode /* Set up and display the window before setting up D3D. If we don't do this, * then setting up a fullscreen window (when we're not coming from windowed) * causes all other windows on the system to be resized to the new resolution. */ GraphicsWindow::CreateGraphicsWindow( p ); SetPresentParametersFromVideoModeParams( p, &g_d3dpp ); // Display the window immediately, so we don't display the desktop ... while( 1 ) { // Try the video mode. RString sErr = SetD3DParams( bNewDeviceOut ); if( sErr.empty() ) break; /* It failed. We're probably selecting a video mode that isn't supported. * If we're fullscreen, search the mode list and find the nearest lower mode. */ if( p.windowed || !D3DReduceParams( &g_d3dpp ) ) return sErr; // Store the new settings we're about to try. p.height = g_d3dpp.BackBufferHeight; p.width = g_d3dpp.BackBufferWidth; if( g_d3dpp.FullScreen_RefreshRateInHz == D3DPRESENT_RATE_DEFAULT ) p.rate = REFRESH_DEFAULT; else p.rate = g_d3dpp.FullScreen_RefreshRateInHz; } /* Call this again after changing the display mode. If we're going to a window * from fullscreen, the first call can't set a larger window than the old * fullscreen resolution or set the window position. */ GraphicsWindow::CreateGraphicsWindow( p ); ResolutionChanged(); return RString(); // mode change successful }
/* Set the video mode. */ CString RageDisplay_D3D::TryVideoMode( VideoModeParams p, bool &bNewDeviceOut ) { if( FindBackBufferType( p.windowed, p.bpp ) == D3DFMT_UNKNOWN ) // no possible back buffer formats return ssprintf( "FindBackBufferType(%i,%i) failed", p.windowed, p.bpp ); // failed to set mode #if !defined(XBOX) if( GraphicsWindow::GetHwnd() == NULL ) GraphicsWindow::CreateGraphicsWindow( p ); #else p.windowed = false; #endif /* Set up and display the window before setting up D3D. If we don't do this, * then setting up a fullscreen window (when we're not coming from windowed) * causes all other windows on the system to be resized to the new resolution. */ GraphicsWindow::ConfigureGraphicsWindow( p ); ZeroMemory( &g_d3dpp, sizeof(g_d3dpp) ); g_d3dpp.BackBufferWidth = p.width; g_d3dpp.BackBufferHeight = p.height; g_d3dpp.BackBufferFormat = FindBackBufferType( p.windowed, p.bpp ); g_d3dpp.BackBufferCount = 1; g_d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; #if !defined(XBOX) g_d3dpp.hDeviceWindow = GraphicsWindow::GetHwnd(); #else g_d3dpp.hDeviceWindow = NULL; #endif g_d3dpp.Windowed = p.windowed; g_d3dpp.EnableAutoDepthStencil = TRUE; g_d3dpp.AutoDepthStencilFormat = D3DFMT_D16; if(p.windowed) g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; else g_d3dpp.PresentationInterval = p.vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; #if !defined(XBOX) g_d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; if( !p.windowed && p.rate != REFRESH_DEFAULT ) g_d3dpp.FullScreen_RefreshRateInHz = p.rate; #else if( XGetVideoStandard() == XC_VIDEO_STANDARD_PAL_I ) { /* Get supported video flags. */ DWORD VideoFlags = XGetVideoFlags(); /* Set pal60 if available. */ if( VideoFlags & XC_VIDEO_FLAGS_PAL_60Hz ) g_d3dpp.FullScreen_RefreshRateInHz = 60; else g_d3dpp.FullScreen_RefreshRateInHz = 50; } else g_d3dpp.FullScreen_RefreshRateInHz = 60; #endif g_d3dpp.Flags = 0; LOG->Trace( "Present Parameters: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d", g_d3dpp.BackBufferWidth, g_d3dpp.BackBufferHeight, g_d3dpp.BackBufferFormat, g_d3dpp.BackBufferCount, g_d3dpp.MultiSampleType, g_d3dpp.SwapEffect, g_d3dpp.hDeviceWindow, g_d3dpp.Windowed, g_d3dpp.EnableAutoDepthStencil, g_d3dpp.AutoDepthStencilFormat, g_d3dpp.Flags, g_d3dpp.FullScreen_RefreshRateInHz, g_d3dpp.PresentationInterval ); #if defined(XBOX) if( D3D__pDevice ) g_pd3dDevice = D3D__pDevice; #endif /* Display the window immediately, so we don't display the desktop ... */ while( 1 ) { /* Try the video mode. */ CString sErr = SetD3DParams( bNewDeviceOut ); if( sErr.empty() ) break; /* It failed. We're probably selecting a video mode that isn't supported. * If we're fullscreen, search the mode list and find the nearest lower * mode. */ if( p.windowed || !D3DReduceParams( &g_d3dpp ) ) return sErr; /* Store the new settings we're about to try. */ p.height = g_d3dpp.BackBufferHeight; p.width = g_d3dpp.BackBufferWidth; if( g_d3dpp.FullScreen_RefreshRateInHz == D3DPRESENT_RATE_DEFAULT ) p.rate = REFRESH_DEFAULT; else p.rate = g_d3dpp.FullScreen_RefreshRateInHz; } /* Call this again after changing the display mode. If we're going to a window * from fullscreen, the first call can't set a larger window than the old fullscreen * resolution or set the window position. */ GraphicsWindow::ConfigureGraphicsWindow( p ); GraphicsWindow::SetVideoModeParams( p ); ResolutionChanged(); this->SetDefaultRenderStates(); /* Palettes were lost by Reset(), so mark them unloaded. */ g_TexResourceToPaletteIndex.clear(); return ""; // mode change successful }