diff --git a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx index 32aa0b6103..526b37a29b 100644 --- a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx +++ b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx @@ -4506,8 +4506,8 @@ dx_cleanup(bool bRestoreDisplayMode,bool bAtExitFnCalled) { // for now, I can't trust any of the ddraw/d3d releases during atexit(), // so just return directly. maybe revisit this later, if have problems // restarting d3d/ddraw after one of these uncleaned-up exits - if(bAtExitFnEverCalled) - return; + // if(bAtExitFnEverCalled) + // return; // unsafe to do the D3D releases after exit() called, since DLL_PROCESS_DETACH // msg already delivered to d3d.dll and it's unloaded itself diff --git a/panda/src/dxgsg8/wdxGraphicsPipe8.cxx b/panda/src/dxgsg8/wdxGraphicsPipe8.cxx index c715d5975c..37bf813608 100644 --- a/panda/src/dxgsg8/wdxGraphicsPipe8.cxx +++ b/panda/src/dxgsg8/wdxGraphicsPipe8.cxx @@ -769,7 +769,7 @@ make_device(void *scrn) { device->_pD3DDevice = device->_Scrn.pD3DDevice; _device = device; - wdxdisplay8_cat.error() << "walla: device" << device << "\n"; + wdxdisplay8_cat.info() << "walla: device" << device << "\n"; return device.p(); diff --git a/panda/src/dxgsg8/wdxGraphicsWindow8.cxx b/panda/src/dxgsg8/wdxGraphicsWindow8.cxx index 68399effc9..f21b9634b5 100644 --- a/panda/src/dxgsg8/wdxGraphicsWindow8.cxx +++ b/panda/src/dxgsg8/wdxGraphicsWindow8.cxx @@ -860,7 +860,12 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer dwBehaviorFlags, pPresParams, &Display.pD3DDevice); if (FAILED(hr)) { - wdxdisplay8_cat.fatal() << "D3D CreateDevice failed for device #" << Display.CardIDNum << D3DERRORSTRING(hr); + wdxdisplay8_cat.warning() << "pPresParams->BackBufferWidth : " << pPresParams->BackBufferWidth << endl; + wdxdisplay8_cat.warning() << "pPresParams->BackBufferHeight : " << pPresParams->BackBufferHeight << endl; + wdxdisplay8_cat.warning() << "pPresParams->BackBufferFormat : " << pPresParams->BackBufferFormat << endl; + wdxdisplay8_cat.warning() << "pPresParams->BackBufferCount : " << pPresParams->BackBufferCount << endl; + wdxdisplay8_cat.warning() << "D3D CreateDevice failed for device #" << Display.CardIDNum << D3DERRORSTRING(hr); + goto Fallback_to_16bpp_buffers; //exit(1); return false; } @@ -895,7 +900,7 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer if (wdxdisplay8_cat.info()) { wdxdisplay8_cat.info() - << "CreateDevice failed with out-of-vidmem, retrying w/16bpp buffers on device #" + << "CreateDevice failed with out-of-vidmem or invalid BackBufferFormat, retrying w/16bpp buffers on device #" << Display.CardIDNum << endl; } return create_screen_buffers_and_device(Display, true); @@ -1788,6 +1793,11 @@ open_window(void) { while(1) { if (dxgsg->get_pipe()->get_device() == NULL || discard_device) { wdxdisplay8_cat.debug() << "device is null or fullscreen\n"; + + // If device exists, free it + if (dxgsg->get_pipe()->get_device()) { + dxgsg->dx_cleanup(false, true); + } wdxdisplay8_cat.debug()<<"device width "<<_wcontext.DisplayMode.Width<<"\n"; if (!create_screen_buffers_and_device(_wcontext, dx_force_16bpp_zbuffer)) { diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx index 03980da973..67325fce0a 100755 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx @@ -4510,8 +4510,8 @@ dx_cleanup(bool bRestoreDisplayMode,bool bAtExitFnCalled) { // for now, I can't trust any of the ddraw/d3d releases during atexit(), // so just return directly. maybe revisit this later, if have problems // restarting d3d/ddraw after one of these uncleaned-up exits - if(bAtExitFnEverCalled) - return; + // if(bAtExitFnEverCalled) + // return; // unsafe to do the D3D releases after exit() called, since DLL_PROCESS_DETACH // msg already delivered to d3d.dll and it's unloaded itself diff --git a/panda/src/dxgsg9/wdxGraphicsPipe9.cxx b/panda/src/dxgsg9/wdxGraphicsPipe9.cxx index bfe98389fa..87ffdbccf8 100755 --- a/panda/src/dxgsg9/wdxGraphicsPipe9.cxx +++ b/panda/src/dxgsg9/wdxGraphicsPipe9.cxx @@ -788,7 +788,7 @@ make_device(void *scrn) { device->_pD3DDevice = device->_Scrn.pD3DDevice; _device = device; - wdxdisplay9_cat.error() << "walla: device" << device << "\n"; + wdxdisplay9_cat.info() << "walla: device" << device << "\n"; return device.p(); diff --git a/panda/src/dxgsg9/wdxGraphicsWindow9.cxx b/panda/src/dxgsg9/wdxGraphicsWindow9.cxx index a0c6840521..d6622a7391 100755 --- a/panda/src/dxgsg9/wdxGraphicsWindow9.cxx +++ b/panda/src/dxgsg9/wdxGraphicsWindow9.cxx @@ -847,7 +847,12 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer dwBehaviorFlags, pPresParams, &Display.pD3DDevice); if (FAILED(hr)) { - wdxdisplay9_cat.fatal() << "D3D CreateDevice failed for device #" << Display.CardIDNum << D3DERRORSTRING(hr); + wdxdisplay9_cat.warning() << "pPresParams->BackBufferWidth : " << pPresParams->BackBufferWidth << endl; + wdxdisplay9_cat.warning() << "pPresParams->BackBufferHeight : " << pPresParams->BackBufferHeight << endl; + wdxdisplay9_cat.warning() << "pPresParams->BackBufferFormat : " << pPresParams->BackBufferFormat << endl; + wdxdisplay9_cat.warning() << "pPresParams->BackBufferCount : " << pPresParams->BackBufferCount << endl; + wdxdisplay9_cat.warning() << "D3D CreateDevice failed for device #" << Display.CardIDNum << D3DERRORSTRING(hr); + goto Fallback_to_16bpp_buffers; //exit(1); return false; } @@ -882,7 +887,7 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer if (wdxdisplay9_cat.info()) { wdxdisplay9_cat.info() - << "CreateDevice failed with out-of-vidmem, retrying w/16bpp buffers on device #" + << "CreateDevice failed with out-of-vidmem or invalid BackBufferFormat, retrying w/16bpp buffers on device #" << Display.CardIDNum << endl; } return create_screen_buffers_and_device(Display, true); @@ -1774,6 +1779,11 @@ open_window(void) { if (dxgsg->get_pipe()->get_device() == NULL || discard_device) { wdxdisplay9_cat.debug() << "device is null or fullscreen\n"; + // If device exists, free it + if (dxgsg->get_pipe()->get_device()) { + dxgsg->dx_cleanup(false, true); + } + wdxdisplay9_cat.debug()<<"device width "<<_wcontext.DisplayMode.Width<<"\n"; if (!create_screen_buffers_and_device(_wcontext, dx_force_16bpp_zbuffer)) { // just crash here