Some improvements for BlitFramebuffer.
This change can
1. Skip color blitting when draw buffers are disabled.
2. Skip depth/stencil blitting when depth/stencil buffer has no image.
3. Return early if possible.
4. Move the logic above from D3D backend to common part.
BUG=angleproject:1677
Change-Id: I1662d214b72fb8caa4a95c86d9b8a67984b6071a
Reviewed-on: https://chromium-review.googlesource.com/423135
Commit-Queue: Yunchao He <yunchao.he@intel.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/d3d/FramebufferD3D.cpp b/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
index f6eef6f..e86f913 100644
--- a/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
+++ b/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
@@ -263,38 +263,10 @@
{
const auto &glState = context->getGLState();
const gl::Framebuffer *sourceFramebuffer = glState.getReadFramebuffer();
- bool blitRenderTarget = false;
- if ((mask & GL_COLOR_BUFFER_BIT) && sourceFramebuffer->getReadColorbuffer() != nullptr &&
- mState.getFirstColorAttachment() != nullptr)
- {
- blitRenderTarget = true;
- }
-
- bool blitStencil = false;
- if ((mask & GL_STENCIL_BUFFER_BIT) && sourceFramebuffer->getStencilbuffer() != nullptr &&
- mState.getStencilAttachment() != nullptr)
- {
- blitStencil = true;
- }
-
- bool blitDepth = false;
- if ((mask & GL_DEPTH_BUFFER_BIT) && sourceFramebuffer->getDepthbuffer() != nullptr &&
- mState.getDepthAttachment() != nullptr)
- {
- blitDepth = true;
- }
-
- if (blitRenderTarget || blitDepth || blitStencil)
- {
- const gl::Rectangle *scissor =
- glState.isScissorTestEnabled() ? &glState.getScissor() : nullptr;
- gl::Error error = blitImpl(sourceArea, destArea, scissor, blitRenderTarget, blitDepth,
- blitStencil, filter, sourceFramebuffer);
- if (error.isError())
- {
- return error;
- }
- }
+ const gl::Rectangle *scissor = glState.isScissorTestEnabled() ? &glState.getScissor() : nullptr;
+ ANGLE_TRY(blitImpl(sourceArea, destArea, scissor, (mask & GL_COLOR_BUFFER_BIT) != 0,
+ (mask & GL_DEPTH_BUFFER_BIT) != 0, (mask & GL_STENCIL_BUFFER_BIT) != 0,
+ filter, sourceFramebuffer));
return gl::Error(GL_NO_ERROR);
}