Move blit to the Framebuffer object and Impl.

BUG=angle:841

Change-Id: I482e53a90606d9d6b105c7006234215d51ab1a6b
Reviewed-on: https://chromium-review.googlesource.com/232692
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Reviewed-by: Brandon Jones <bajones@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/d3d/FramebufferD3D.cpp b/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
index 9dea27e..3ca5d14 100644
--- a/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
+++ b/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
@@ -12,6 +12,7 @@
 #include "libANGLE/renderer/d3d/RenderbufferD3D.h"
 #include "libANGLE/renderer/RenderTarget.h"
 #include "libANGLE/formatutils.h"
+#include "libANGLE/Framebuffer.h"
 #include "libANGLE/FramebufferAttachment.h"
 
 namespace rx
@@ -252,6 +253,47 @@
     return readPixels(area, format, type, outputPitch, state.getPackState(), reinterpret_cast<uint8_t*>(pixels));
 }
 
+gl::Error FramebufferD3D::blit(const gl::State &state, const gl::Rectangle &sourceArea, const gl::Rectangle &destArea,
+                               GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer)
+{
+    bool blitRenderTarget = false;
+    if ((mask & GL_COLOR_BUFFER_BIT) &&
+        sourceFramebuffer->getReadColorbuffer() != nullptr &&
+        std::any_of(mColorBuffers.begin(), mColorBuffers.end(), [](const gl::FramebufferAttachment* attachment){ return attachment != nullptr; }))
+    {
+        blitRenderTarget = true;
+    }
+
+    bool blitStencil = false;
+    if ((mask & GL_STENCIL_BUFFER_BIT) &&
+        sourceFramebuffer->getStencilbuffer() != nullptr &&
+        mStencilbuffer != nullptr)
+    {
+        blitStencil = true;
+    }
+
+    bool blitDepth = false;
+    if ((mask & GL_DEPTH_BUFFER_BIT) &&
+        sourceFramebuffer->getDepthbuffer() != nullptr &&
+        mDepthbuffer != nullptr)
+    {
+        blitDepth = true;
+    }
+
+    if (blitRenderTarget || blitDepth || blitStencil)
+    {
+        const gl::Rectangle *scissor = state.isScissorTestEnabled() ? &state.getScissor() : NULL;
+        gl::Error error = blit(sourceArea, destArea, scissor, blitRenderTarget, blitDepth, blitStencil,
+                               filter, sourceFramebuffer);
+        if (error.isError())
+        {
+            return error;
+        }
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
 GLenum FramebufferD3D::checkStatus() const
 {
     // D3D11 does not allow for overlapping RenderTargetViews, so ensure uniqueness