fixed the window/fullscreen toggle crash for some cards

This commit is contained in:
Asad M. Zaman 2004-05-25 21:06:24 +00:00
parent b42bde4b2e
commit 91a65b3a56
6 changed files with 30 additions and 10 deletions

View File

@ -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

View File

@ -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();

View File

@ -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)) {

View File

@ -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

View File

@ -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();

View File

@ -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