Browse Source

Fix a case where there is no depth buffer for a render to texture.

aignacio_sf 17 years ago
parent
commit
cfb8fa8b3b
1 changed files with 19 additions and 8 deletions
  1. 19 8
      panda/src/dxgsg9/wdxGraphicsBuffer9.cxx

+ 19 - 8
panda/src/dxgsg9/wdxGraphicsBuffer9.cxx

@@ -186,10 +186,17 @@ save_bitplanes() {
     dxgsg9_cat.error ( ) << "GetRenderTarget " << D3DERRORSTRING(hr) FL;
     return false;
   }
+  
+  _saved_depth_buffer = 0;
   hr = _dxgsg -> _d3d_device -> GetDepthStencilSurface (&_saved_depth_buffer);
-  if (!SUCCEEDED (hr)) {
-    dxgsg9_cat.error ( ) << "GetDepthStencilSurface " << D3DERRORSTRING(hr) FL;
-    return false;
+  if (hr == D3DERR_NOTFOUND) {
+    // this case is actually ok
+  }
+  else {
+    if (!SUCCEEDED (hr)) {
+      dxgsg9_cat.error ( ) << "GetDepthStencilSurface " << D3DERRORSTRING(hr) FL;
+      return false;
+    }
   }
   return true;
 }
@@ -215,11 +222,13 @@ restore_bitplanes() {
   if (!SUCCEEDED (hr)) {
     dxgsg9_cat.error ( ) << "SetRenderTarget " << D3DERRORSTRING(hr) FL;
   }
-  hr = _dxgsg -> _d3d_device -> SetDepthStencilSurface (_saved_depth_buffer);
-  if (!SUCCEEDED (hr)) {
-    dxgsg9_cat.error ( ) << "SetDepthStencilSurface " << D3DERRORSTRING(hr) FL;
+  if (_saved_depth_buffer) {
+    hr = _dxgsg -> _d3d_device -> SetDepthStencilSurface (_saved_depth_buffer);
+    if (!SUCCEEDED (hr)) {
+      dxgsg9_cat.error ( ) << "SetDepthStencilSurface " << D3DERRORSTRING(hr) FL;
+    }
   }
-
+  
   // clear all render targets, except for the main render target
   for (int i = 1; i<count_textures(); i++) {
     hr = _dxgsg -> _d3d_device -> SetRenderTarget (i, NULL);
@@ -229,7 +238,9 @@ restore_bitplanes() {
   }
 
   _saved_color_buffer->Release();
-  _saved_depth_buffer->Release();
+  if (_saved_depth_buffer) {
+    _saved_depth_buffer->Release();
+  }
   _saved_color_buffer = NULL;
   _saved_depth_buffer = NULL;
 }