Refactor Renderer11::blit to use simpler control flow.

TRAC #22679

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

git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2094 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 809f0d0..e347677 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -2920,14 +2920,57 @@
 bool Renderer11::blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, const gl::Rectangle &drawRect,
                           bool blitRenderTarget, bool blitDepthStencil)
 {
-    if (blitRenderTarget && !blitRect(readTarget, readRect, drawTarget, drawRect, BLIT_RENDERTARGET))
+    // TODO: mrt blit support
+    if (blitRenderTarget)
     {
-        return false;
+        gl::Renderbuffer *readBuffer = readTarget->getReadColorbuffer();
+        gl::Renderbuffer *drawBuffer = drawTarget->getColorbuffer(0);
+
+        if (!readBuffer)
+        {
+            ERR("Failed to retrieve the read buffer from the read framebuffer.");
+            return gl::error(GL_OUT_OF_MEMORY, false);
+        }
+
+        if (!drawBuffer)
+        {
+            ERR("Failed to retrieve the draw buffer from the draw framebuffer.");
+            return gl::error(GL_OUT_OF_MEMORY, false);
+        }
+
+        RenderTarget *readRenderTarget = readBuffer->getRenderTarget();
+        RenderTarget *drawRenderTarget = drawBuffer->getRenderTarget();
+
+        if (!blitRenderbufferRect(readRect, drawRect, readRenderTarget, drawRenderTarget))
+        {
+            return false;
+        }
     }
 
-    if (blitDepthStencil && !blitRect(readTarget, readRect, drawTarget, drawRect, BLIT_DEPTHSTENCIL))
+    if (blitDepthStencil)
     {
-        return false;
+        gl::Renderbuffer *readBuffer = readTarget->getDepthOrStencilbuffer();
+        gl::Renderbuffer *drawBuffer = drawTarget->getDepthOrStencilbuffer();
+
+        if (!readBuffer)
+        {
+            ERR("Failed to retrieve the read depth-stencil buffer from the read framebuffer.");
+            return gl::error(GL_OUT_OF_MEMORY, false);
+        }
+
+        if (!drawBuffer)
+        {
+            ERR("Failed to retrieve the draw depth-stencil buffer from the draw framebuffer.");
+            return gl::error(GL_OUT_OF_MEMORY, false);
+        }
+
+        RenderTarget *readRenderTarget = readBuffer->getDepthStencil();
+        RenderTarget *drawRenderTarget = drawBuffer->getDepthStencil();
+
+        if (!blitRenderbufferRect(readRect, drawRect, readRenderTarget, drawRenderTarget))
+        {
+            return false;
+        }
     }
 
     return true;
@@ -3355,122 +3398,64 @@
     stagingTex = NULL;
 }
 
-bool Renderer11::blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget,
-                          const gl::Rectangle &drawRect, BlitTarget target)
+bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTarget *readRenderTarget, RenderTarget *drawRenderTarget)
 {
-    // TODO: mrt support
     ASSERT(readRect.width == drawRect.width && readRect.height == drawRect.height);
 
-    gl::Renderbuffer *readBuffer = NULL;
-    switch (target)
+    RenderTarget11 *readRenderTarget11 = RenderTarget11::makeRenderTarget11(readRenderTarget);
+    if (!readRenderTarget)
     {
-      case BLIT_RENDERTARGET:
-        readBuffer = readTarget->getColorbuffer(0);
-        break;
-      case BLIT_DEPTHSTENCIL:
-        readBuffer = readTarget->getDepthOrStencilbuffer();
-        break;
-      default: UNREACHABLE();
-    }
-    if (!readBuffer)
-    {
-        ERR("Failed to retrieve the color buffer from the read target.");
+        ERR("Failed to retrieve the read render target from the read framebuffer.");
         return gl::error(GL_OUT_OF_MEMORY, false);
     }
 
-    RenderTarget11 *sourceRenderTarget = NULL;
-    switch (target)
+    ID3D11Texture2D *readTexture = NULL;
+    unsigned int readSubresource = 0;
+    if (readRenderTarget->getSamples() > 0)
     {
-      case BLIT_RENDERTARGET:
-        sourceRenderTarget = RenderTarget11::makeRenderTarget11(readBuffer->getRenderTarget());
-        break;
-      case BLIT_DEPTHSTENCIL:
-        sourceRenderTarget = RenderTarget11::makeRenderTarget11(readBuffer->getDepthStencil());
-        break;
-      default: UNREACHABLE();
-    }
-    if (!sourceRenderTarget)
-    {
-        ERR("Failed to retrieve the render target from the frame buffer.");
-        return gl::error(GL_OUT_OF_MEMORY, false);
-    }
+        ID3D11Texture2D *unresolvedTexture = readRenderTarget11->getTexture();
 
-    ID3D11Texture2D *source = NULL;
-    unsigned int sourceSubresource = 0;
-    if (sourceRenderTarget->getSamples() > 0)
-    {
-        ID3D11Texture2D *unresolvedTexture = sourceRenderTarget->getTexture();
-
-        source = resolveMultisampledTexture(unresolvedTexture, sourceRenderTarget->getSubresourceIndex());
-        sourceSubresource = 0;
+        readTexture = resolveMultisampledTexture(unresolvedTexture, readRenderTarget11->getSubresourceIndex());
+        readSubresource = 0;
 
         unresolvedTexture->Release();
     }
     else
     {
-        source = sourceRenderTarget->getTexture();
-        sourceSubresource = sourceRenderTarget->getSubresourceIndex();
+        readTexture = readRenderTarget11->getTexture();
+        readSubresource = readRenderTarget11->getSubresourceIndex();
     }
 
-    if (!source)
+    if (!readTexture)
     {
-        ERR("Failed to retrieve the render target view from the render target.");
+        ERR("Failed to retrieve the read render target view from the read render target.");
         return gl::error(GL_OUT_OF_MEMORY, false);
     }
 
-
-    gl::Renderbuffer *drawBuffer = NULL;
-    switch (target)
-    {
-      case BLIT_RENDERTARGET:
-        drawBuffer = drawTarget->getColorbuffer(0);
-        break;
-      case BLIT_DEPTHSTENCIL:
-        drawBuffer = drawTarget->getDepthOrStencilbuffer();
-        break;
-      default: UNREACHABLE();
-    }
-    if (!drawBuffer)
-    {
-        source->Release();
-        ERR("Failed to retrieve the color buffer from the draw buffer.");
-        return gl::error(GL_OUT_OF_MEMORY, false);
-    }
-
-    RenderTarget11 *drawRenderTarget = NULL;
-    switch (target)
-    {
-      case BLIT_RENDERTARGET:
-        drawRenderTarget = RenderTarget11::makeRenderTarget11(drawBuffer->getRenderTarget());
-        break;
-      case BLIT_DEPTHSTENCIL:
-        drawRenderTarget = RenderTarget11::makeRenderTarget11(drawBuffer->getDepthStencil());
-        break;
-      default: UNREACHABLE();
-    }
+    RenderTarget11 *drawRenderTarget11 = RenderTarget11::makeRenderTarget11(drawRenderTarget);
     if (!drawRenderTarget)
     {
-        source->Release();
-        ERR("Failed to retrieve the render target from the render buffer.");
+        readTexture->Release();
+        ERR("Failed to retrieve the draw render target from the draw framebuffer.");
         return gl::error(GL_OUT_OF_MEMORY, false);
     }
 
-    ID3D11Texture2D *dest = drawRenderTarget->getTexture();
-    unsigned int destSubresource = drawRenderTarget->getSubresourceIndex();
+    ID3D11Texture2D *drawTexture = drawRenderTarget11->getTexture();
+    unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex();
 
-    D3D11_BOX srcBox;
-    srcBox.left = readRect.x;
-    srcBox.right = readRect.x + readRect.width;
-    srcBox.top = readRect.y;
-    srcBox.bottom = readRect.y + readRect.height;
-    srcBox.front = 0;
-    srcBox.back = 1;
+    D3D11_BOX readBox;
+    readBox.left = readRect.x;
+    readBox.right = readRect.x + readRect.width;
+    readBox.top = readRect.y;
+    readBox.bottom = readRect.y + readRect.height;
+    readBox.front = 0;
+    readBox.back = 1;
 
-    mDeviceContext->CopySubresourceRegion(dest, destSubresource, drawRect.x, drawRect.y, 0,
-                                          source, sourceSubresource, &srcBox);
+    mDeviceContext->CopySubresourceRegion(drawTexture, drawSubresource, drawRect.x, drawRect.y, 0,
+                                          readTexture, readSubresource, &readBox);
 
-    source->Release();
-    dest->Release();
+    readTexture->Release();
+    drawTexture->Release();
 
     return true;
 }