mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -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(),
|
// 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
|
// so just return directly. maybe revisit this later, if have problems
|
||||||
// restarting d3d/ddraw after one of these uncleaned-up exits
|
// restarting d3d/ddraw after one of these uncleaned-up exits
|
||||||
if(bAtExitFnEverCalled)
|
// if(bAtExitFnEverCalled)
|
||||||
return;
|
// return;
|
||||||
|
|
||||||
// unsafe to do the D3D releases after exit() called, since DLL_PROCESS_DETACH
|
// unsafe to do the D3D releases after exit() called, since DLL_PROCESS_DETACH
|
||||||
// msg already delivered to d3d.dll and it's unloaded itself
|
// 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->_pD3DDevice = device->_Scrn.pD3DDevice;
|
||||||
|
|
||||||
_device = device;
|
_device = device;
|
||||||
wdxdisplay8_cat.error() << "walla: device" << device << "\n";
|
wdxdisplay8_cat.info() << "walla: device" << device << "\n";
|
||||||
|
|
||||||
return device.p();
|
return device.p();
|
||||||
|
|
||||||
|
@ -860,7 +860,12 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
|
|||||||
dwBehaviorFlags, pPresParams, &Display.pD3DDevice);
|
dwBehaviorFlags, pPresParams, &Display.pD3DDevice);
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
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);
|
//exit(1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -895,7 +900,7 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
|
|||||||
|
|
||||||
if (wdxdisplay8_cat.info()) {
|
if (wdxdisplay8_cat.info()) {
|
||||||
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;
|
<< Display.CardIDNum << endl;
|
||||||
}
|
}
|
||||||
return create_screen_buffers_and_device(Display, true);
|
return create_screen_buffers_and_device(Display, true);
|
||||||
@ -1789,6 +1794,11 @@ open_window(void) {
|
|||||||
if (dxgsg->get_pipe()->get_device() == NULL || discard_device) {
|
if (dxgsg->get_pipe()->get_device() == NULL || discard_device) {
|
||||||
wdxdisplay8_cat.debug() << "device is null or fullscreen\n";
|
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";
|
wdxdisplay8_cat.debug()<<"device width "<<_wcontext.DisplayMode.Width<<"\n";
|
||||||
if (!create_screen_buffers_and_device(_wcontext, dx_force_16bpp_zbuffer)) {
|
if (!create_screen_buffers_and_device(_wcontext, dx_force_16bpp_zbuffer)) {
|
||||||
// just crash here
|
// just crash here
|
||||||
|
@ -4510,8 +4510,8 @@ dx_cleanup(bool bRestoreDisplayMode,bool bAtExitFnCalled) {
|
|||||||
// for now, I can't trust any of the ddraw/d3d releases during atexit(),
|
// 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
|
// so just return directly. maybe revisit this later, if have problems
|
||||||
// restarting d3d/ddraw after one of these uncleaned-up exits
|
// restarting d3d/ddraw after one of these uncleaned-up exits
|
||||||
if(bAtExitFnEverCalled)
|
// if(bAtExitFnEverCalled)
|
||||||
return;
|
// return;
|
||||||
|
|
||||||
// unsafe to do the D3D releases after exit() called, since DLL_PROCESS_DETACH
|
// unsafe to do the D3D releases after exit() called, since DLL_PROCESS_DETACH
|
||||||
// msg already delivered to d3d.dll and it's unloaded itself
|
// 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->_pD3DDevice = device->_Scrn.pD3DDevice;
|
||||||
|
|
||||||
_device = device;
|
_device = device;
|
||||||
wdxdisplay9_cat.error() << "walla: device" << device << "\n";
|
wdxdisplay9_cat.info() << "walla: device" << device << "\n";
|
||||||
|
|
||||||
return device.p();
|
return device.p();
|
||||||
|
|
||||||
|
@ -847,7 +847,12 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
|
|||||||
dwBehaviorFlags, pPresParams, &Display.pD3DDevice);
|
dwBehaviorFlags, pPresParams, &Display.pD3DDevice);
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
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);
|
//exit(1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -882,7 +887,7 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
|
|||||||
|
|
||||||
if (wdxdisplay9_cat.info()) {
|
if (wdxdisplay9_cat.info()) {
|
||||||
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;
|
<< Display.CardIDNum << endl;
|
||||||
}
|
}
|
||||||
return create_screen_buffers_and_device(Display, true);
|
return create_screen_buffers_and_device(Display, true);
|
||||||
@ -1774,6 +1779,11 @@ open_window(void) {
|
|||||||
if (dxgsg->get_pipe()->get_device() == NULL || discard_device) {
|
if (dxgsg->get_pipe()->get_device() == NULL || discard_device) {
|
||||||
wdxdisplay9_cat.debug() << "device is null or fullscreen\n";
|
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";
|
wdxdisplay9_cat.debug()<<"device width "<<_wcontext.DisplayMode.Width<<"\n";
|
||||||
if (!create_screen_buffers_and_device(_wcontext, dx_force_16bpp_zbuffer)) {
|
if (!create_screen_buffers_and_device(_wcontext, dx_force_16bpp_zbuffer)) {
|
||||||
// just crash here
|
// just crash here
|
||||||
|
Loading…
x
Reference in New Issue
Block a user