فهرست منبع

fixed the window/fullscreen toggle crash for some cards

Asad M. Zaman 21 سال پیش
والد
کامیت
91a65b3a56

+ 2 - 2
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

+ 1 - 1
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();
 

+ 12 - 2
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)) {

+ 2 - 2
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

+ 1 - 1
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();
 

+ 12 - 2
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