more error recovery on dx error

This commit is contained in:
Asad M. Zaman 2004-03-17 21:05:39 +00:00
parent daf3f0d00b
commit 60fcb96b59
3 changed files with 30 additions and 36 deletions

View File

@ -4864,13 +4864,9 @@ reset_d3d_device(D3DPRESENT_PARAMETERS *pPresParams, DXScreenData **pScrn) {
if(SUCCEEDED(hr)) { if(SUCCEEDED(hr)) {
if(pPresParams!=&_pScrn->PresParams) if(pPresParams!=&_pScrn->PresParams)
memcpy(&_pScrn->PresParams,pPresParams,sizeof(D3DPRESENT_PARAMETERS)); memcpy(&_pScrn->PresParams,pPresParams,sizeof(D3DPRESENT_PARAMETERS));
if (pScrn) { if (pScrn)
*pScrn = _pScrn; *pScrn = _pScrn;
wdxdisplay8_cat.debug() << "_pScrn = " << _pScrn << ", _pScrn_device = " << _pScrn->pD3DDevice << "\n";
}
} }
else
while(1);
return hr; return hr;
} }

View File

@ -656,10 +656,10 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
// //
// Sets _depth_buffer_bpp appropriately. // Sets _depth_buffer_bpp appropriately.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void wdxGraphicsWindow8:: bool wdxGraphicsWindow8::
create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer) { create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer) {
wdxGraphicsPipe8 *dxpipe; wdxGraphicsPipe8 *dxpipe;
DCAST_INTO_V(dxpipe, _pipe); DCAST_INTO_R(dxpipe, _pipe, false);
// only want dx_pick_best_screenres to apply to initial startup, and // only want dx_pick_best_screenres to apply to initial startup, and
// since the initial res has already been picked, dont use auto-res-select in any future init sequence. // since the initial res has already been picked, dont use auto-res-select in any future init sequence.
@ -725,7 +725,8 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
is_fullscreen(), D3DMULTISAMPLE_TYPE(dx_multisample_antialiasing_level)); is_fullscreen(), D3DMULTISAMPLE_TYPE(dx_multisample_antialiasing_level));
if (FAILED(hr)) { if (FAILED(hr)) {
wdxdisplay8_cat.fatal() << "device #"<<Display.CardIDNum<< " doesnt support multisample level "<<dx_multisample_antialiasing_level <<"surface fmt "<< D3DFormatStr(Display.DisplayMode.Format) <<endl; wdxdisplay8_cat.fatal() << "device #"<<Display.CardIDNum<< " doesnt support multisample level "<<dx_multisample_antialiasing_level <<"surface fmt "<< D3DFormatStr(Display.DisplayMode.Format) <<endl;
exit(1); //exit(1);
return false;
} }
if (Display.PresParams.EnableAutoDepthStencil) { if (Display.PresParams.EnableAutoDepthStencil) {
@ -733,7 +734,8 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
is_fullscreen(), D3DMULTISAMPLE_TYPE(dx_multisample_antialiasing_level)); is_fullscreen(), D3DMULTISAMPLE_TYPE(dx_multisample_antialiasing_level));
if (FAILED(hr)) { if (FAILED(hr)) {
wdxdisplay8_cat.fatal() << "device #"<<Display.CardIDNum<< " doesnt support multisample level "<<dx_multisample_antialiasing_level <<"surface fmt "<< D3DFormatStr(Display.PresParams.AutoDepthStencilFormat) <<endl; wdxdisplay8_cat.fatal() << "device #"<<Display.CardIDNum<< " doesnt support multisample level "<<dx_multisample_antialiasing_level <<"surface fmt "<< D3DFormatStr(Display.PresParams.AutoDepthStencilFormat) <<endl;
exit(1); //exit(1);
return false;
} }
} }
@ -797,6 +799,8 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
if (hr == D3DERR_OUTOFVIDEOMEMORY) if (hr == D3DERR_OUTOFVIDEOMEMORY)
goto Fallback_to_16bpp_buffers; goto Fallback_to_16bpp_buffers;
else
return false;
} }
SetRect(&view_rect, 0, 0, dwRenderWidth, dwRenderHeight); SetRect(&view_rect, 0, 0, dwRenderWidth, dwRenderHeight);
@ -804,22 +808,26 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
else { // CREATE WINDOWED BUFFERS else { // CREATE WINDOWED BUFFERS
/* not necessary anymore...all cards can do this now a days
if (!(pD3DCaps->Caps2 & D3DCAPS2_CANRENDERWINDOWED)) { if (!(pD3DCaps->Caps2 & D3DCAPS2_CANRENDERWINDOWED)) {
wdxdisplay8_cat.fatal() << "the 3D HW cannot render windowed, exiting..." << endl; wdxdisplay8_cat.fatal() << "the 3D HW cannot render windowed, exiting..." << endl;
exit(1); exit(1);
} }
*/
D3DDISPLAYMODE dispmode; D3DDISPLAYMODE dispmode;
hr = Display.pD3D8->GetAdapterDisplayMode(Display.CardIDNum, &dispmode); hr = Display.pD3D8->GetAdapterDisplayMode(Display.CardIDNum, &dispmode);
if (FAILED(hr)) { if (FAILED(hr)) {
wdxdisplay8_cat.fatal() << "GetAdapterDisplayMode failed" << D3DERRORSTRING(hr); wdxdisplay8_cat.fatal() << "GetAdapterDisplayMode failed" << D3DERRORSTRING(hr);
exit(1); //exit(1);
return false;
} }
if (dispmode.Format == D3DFMT_P8) { if (dispmode.Format == D3DFMT_P8) {
wdxdisplay8_cat.fatal() << "Can't run windowed in an 8-bit or less display mode" << endl; wdxdisplay8_cat.fatal() << "Can't run windowed in an 8-bit or less display mode" << endl;
exit(1); //exit(1);
return false;
} }
pPresParams->FullScreen_PresentationInterval = 0; pPresParams->FullScreen_PresentationInterval = 0;
@ -841,7 +849,8 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
if (FAILED(hr)) { if (FAILED(hr)) {
wdxdisplay8_cat.fatal() << "D3D CreateDevice failed for device #" << Display.CardIDNum << D3DERRORSTRING(hr); wdxdisplay8_cat.fatal() << "D3D CreateDevice failed for device #" << Display.CardIDNum << D3DERRORSTRING(hr);
exit(1); //exit(1);
return false;
} }
} // end create windowed buffers } // end create windowed buffers
@ -862,7 +871,7 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
init_resized_window(); init_resized_window();
return; return true;
Fallback_to_16bpp_buffers: Fallback_to_16bpp_buffers:
@ -877,8 +886,8 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
<< "CreateDevice failed with out-of-vidmem, retrying w/16bpp buffers on device #" << "CreateDevice failed with out-of-vidmem, retrying w/16bpp buffers on device #"
<< Display.CardIDNum << endl; << Display.CardIDNum << endl;
} }
create_screen_buffers_and_device(Display, true); return create_screen_buffers_and_device(Display, true);
return; //return;
} else if (!((dwRenderWidth==640)&&(dwRenderHeight==480))) { } else if (!((dwRenderWidth==640)&&(dwRenderHeight==480))) {
if (wdxdisplay8_cat.info()) if (wdxdisplay8_cat.info())
@ -886,13 +895,14 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
// try final fallback to 640x480x16 // try final fallback to 640x480x16
Display.DisplayMode.Width=640; Display.DisplayMode.Width=640;
Display.DisplayMode.Height=480; Display.DisplayMode.Height=480;
create_screen_buffers_and_device(Display, true); return create_screen_buffers_and_device(Display, true);
return; //return;
} else { } else {
wdxdisplay8_cat.fatal() wdxdisplay8_cat.fatal()
<< "Can't create any screen buffers, bailing out.\n"; << "Can't create any screen buffers, bailing out.\n";
exit(1); //exit(1);
return false;
} }
} }
@ -1639,7 +1649,6 @@ init_resized_window() {
//wdxdisplay8_cat.debug() << "wcontext = " << &_wcontext << " and device = " << _wcontext.pD3DDevice << "\n"; //wdxdisplay8_cat.debug() << "wcontext = " << &_wcontext << " and device = " << _wcontext.pD3DDevice << "\n";
#if 0
// clear textures and VB's out of video&AGP mem, so cache is reset // clear textures and VB's out of video&AGP mem, so cache is reset
hr = _wcontext.pD3DDevice->ResourceManagerDiscardBytes(0); hr = _wcontext.pD3DDevice->ResourceManagerDiscardBytes(0);
if (FAILED(hr)) { if (FAILED(hr)) {
@ -1647,7 +1656,6 @@ init_resized_window() {
<< "ResourceManagerDiscardBytes failed for device #" << "ResourceManagerDiscardBytes failed for device #"
<< _wcontext.CardIDNum << D3DERRORSTRING(hr); << _wcontext.CardIDNum << D3DERRORSTRING(hr);
} }
#endif
_dxgsg->set_context(&_wcontext); _dxgsg->set_context(&_wcontext);
// Note: dx_init will fill in additional fields in _wcontext, like supportedtexfmts // Note: dx_init will fill in additional fields in _wcontext, like supportedtexfmts
@ -1770,12 +1778,10 @@ open_window(void) {
// In that case just create an additional swapchain for this window // In that case just create an additional swapchain for this window
if (dxgsg->get_pipe()->get_device() == NULL) { if (dxgsg->get_pipe()->get_device() == NULL) {
wdxdisplay8_cat.debug() << "device is null \n";
if (wdxdisplay8_cat.is_debug()) { if (!create_screen_buffers_and_device(_wcontext, dx_force_16bpp_zbuffer))
wdxdisplay8_cat.debug() << "device is null \n"; return false;
}
create_screen_buffers_and_device(_wcontext, dx_force_16bpp_zbuffer);
dxgsg->get_pipe()->make_device((void*)(&_wcontext)); dxgsg->get_pipe()->make_device((void*)(&_wcontext));
dxgsg->copy_pres_reset(&_wcontext); dxgsg->copy_pres_reset(&_wcontext);
if (multiple_windows) { if (multiple_windows) {
@ -1786,19 +1792,13 @@ open_window(void) {
} else { } else {
// fill in the DXScreenData from dxdevice here and change the // fill in the DXScreenData from dxdevice here and change the
// reference to hWnd. // reference to hWnd.
if (wdxdisplay8_cat.is_debug()) { wdxdisplay8_cat.debug() << "device is not null\n";
wdxdisplay8_cat.debug() << "device is not null\n";
}
dxdev = (DXGraphicsDevice8*)dxgsg->get_pipe()->get_device(); dxdev = (DXGraphicsDevice8*)dxgsg->get_pipe()->get_device();
props = get_properties(); props = get_properties();
wdxdisplay8_cat.debug() << "dxdev_pScrn = " << &dxdev->_Scrn << ", _pScrn_device = " << dxdev->_Scrn.pD3DDevice
<< ", dxdev_device = " << dxdev->_pD3DDevice << "\n";
wdxdisplay8_cat.debug() << "_wcontext = " << &_wcontext << ", device = " << _wcontext.pD3DDevice << "\n";
memcpy(&_wcontext,&dxdev->_Scrn,sizeof(DXScreenData)); memcpy(&_wcontext,&dxdev->_Scrn,sizeof(DXScreenData));
_wcontext.hWnd = _hWnd; _wcontext.hWnd = _hWnd;
// _wcontext.pD3DDevice = dxdev->_pD3DDevice; // copy the current device
_wcontext.PresParams.hDeviceWindow = _hWnd; _wcontext.PresParams.hDeviceWindow = _hWnd;
_wcontext.PresParams.BackBufferWidth = props.get_x_size(); _wcontext.PresParams.BackBufferWidth = props.get_x_size();
_wcontext.PresParams.BackBufferHeight = props.get_y_size(); _wcontext.PresParams.BackBufferHeight = props.get_y_size();
@ -1807,8 +1807,6 @@ open_window(void) {
//wdxdisplay8_cat.debug()<<"debug pSwapChain "<<_wcontext.pSwapChain<<"\n"; //wdxdisplay8_cat.debug()<<"debug pSwapChain "<<_wcontext.pSwapChain<<"\n";
dxgsg->create_swap_chain(&_wcontext); dxgsg->create_swap_chain(&_wcontext);
init_resized_window(); init_resized_window();
//wdxdisplay8_cat.debug() << "Current device is " << dxdev << "\n";
} }
wdxdisplay8_cat.debug() << "swapchain is " << _wcontext.pSwapChain << "\n"; wdxdisplay8_cat.debug() << "swapchain is " << _wcontext.pSwapChain << "\n";
return true; return true;

View File

@ -61,7 +61,7 @@ protected:
private: private:
// bool set_to_temp_rendertarget(); // bool set_to_temp_rendertarget();
void create_screen_buffers_and_device(DXScreenData &Display, bool create_screen_buffers_and_device(DXScreenData &Display,
bool force_16bpp_zbuffer); bool force_16bpp_zbuffer);
bool choose_device(void); bool choose_device(void);