Fix D3D11 depth/stencil framebuffer blit.

D3D11 requires the pSrcBox parameter to be NULL for depth/stencil CopySubresourceRegion calls.

TRAC #22679

Signed-off-by: Geoff Lang
Signed-off-by: Shannon Woods
Author: Jamie Madill

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@2029 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 176cd8b..065202a 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -2945,7 +2945,7 @@
 
                 RenderTarget *drawRenderTarget = drawBuffer->getRenderTarget();
 
-                if (!blitRenderbufferRect(readRect, drawRect, readRenderTarget, drawRenderTarget))
+                if (!blitRenderbufferRect(readRect, drawRect, readRenderTarget, drawRenderTarget, false))
                 {
                     return false;
                 }
@@ -2973,7 +2973,7 @@
         RenderTarget *readRenderTarget = readBuffer->getDepthStencil();
         RenderTarget *drawRenderTarget = drawBuffer->getDepthStencil();
 
-        if (!blitRenderbufferRect(readRect, drawRect, readRenderTarget, drawRenderTarget))
+        if (!blitRenderbufferRect(readRect, drawRect, readRenderTarget, drawRenderTarget, true))
         {
             return false;
         }
@@ -3404,7 +3404,8 @@
     stagingTex = NULL;
 }
 
-bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTarget *readRenderTarget, RenderTarget *drawRenderTarget)
+bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTarget *readRenderTarget, 
+                                      RenderTarget *drawRenderTarget, bool wholeBufferCopy)
 {
     ASSERT(readRect.width == drawRect.width && readRect.height == drawRect.height);
 
@@ -3457,8 +3458,12 @@
     readBox.front = 0;
     readBox.back = 1;
 
+    // D3D11 needs depth-stencil CopySubresourceRegions to have a NULL pSrcBox
+    // We also require complete framebuffer copies for depth-stencil blit.
+    D3D11_BOX *pSrcBox = wholeBufferCopy ? NULL : &readBox;
+
     mDeviceContext->CopySubresourceRegion(drawTexture, drawSubresource, drawRect.x, drawRect.y, 0,
-                                          readTexture, readSubresource, &readBox);
+                                          readTexture, readSubresource, pSrcBox);
 
     readTexture->Release();
     drawTexture->Release();
diff --git a/src/libGLESv2/renderer/Renderer11.h b/src/libGLESv2/renderer/Renderer11.h
index 56646cd..a3e42e9 100644
--- a/src/libGLESv2/renderer/Renderer11.h
+++ b/src/libGLESv2/renderer/Renderer11.h
@@ -195,7 +195,8 @@
     void maskedClear(const gl::ClearParameters &clearParams);
     rx::Range getViewportBounds() const;
 
-    bool blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTarget *readRenderTarget, RenderTarget *drawRenderTarget);
+    bool blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTarget *readRenderTarget, 
+                              RenderTarget *drawRenderTarget, bool wholeBufferCopy);
     ID3D11Texture2D *resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource);
 
     HMODULE mD3d11Module;