mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-01 01:07:51 -04:00
fixed the window/fullscreen toggle crash for some cards
This commit is contained in:
parent
b42bde4b2e
commit
91a65b3a56
@ -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
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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)) {
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user