Unify duplicated code for both depth and stencil buffer in ValidateBlitFramebufferParameters()
Tested with angle_*_tests and WebGL CTS in Chrome Canary on Windows. Passed with no regressions.
Change-Id: Ied0a32ea75565ef19b8e87bed8bdd555b74edee3
Reviewed-on: https://chromium-review.googlesource.com/234110
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Dongseong Hwang <dongseong.hwang@intel.com>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index 8294d74..20d0a20 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -620,78 +620,45 @@
}
}
- if (mask & GL_DEPTH_BUFFER_BIT)
+ GLenum masks[] = {GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT};
+ GLenum attachments[] = {GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT};
+ for (size_t i = 0; i < 2; i++)
{
- gl::FramebufferAttachment *readDepthBuffer = readFramebuffer->getDepthbuffer();
- gl::FramebufferAttachment *drawDepthBuffer = drawFramebuffer->getDepthbuffer();
-
- if (readDepthBuffer && drawDepthBuffer)
+ if (mask & masks[i])
{
- if (readDepthBuffer->getActualFormat() != drawDepthBuffer->getActualFormat())
- {
- context->recordError(Error(GL_INVALID_OPERATION));
- return false;
- }
+ gl::FramebufferAttachment *readBuffer = readFramebuffer->getAttachment(attachments[i]);
+ gl::FramebufferAttachment *drawBuffer = drawFramebuffer->getAttachment(attachments[i]);
- if (readDepthBuffer->getSamples() > 0 && !sameBounds)
+ if (readBuffer && drawBuffer)
{
- context->recordError(Error(GL_INVALID_OPERATION));
- return false;
- }
-
- if (fromAngleExtension)
- {
- if (IsPartialBlit(context, readDepthBuffer, drawDepthBuffer,
- srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1))
- {
- ERR("Only whole-buffer depth and stencil blits are supported by this implementation.");
- context->recordError(Error(GL_INVALID_OPERATION)); // only whole-buffer copies are permitted
- return false;
- }
-
- if (readDepthBuffer->getSamples() != 0 || drawDepthBuffer->getSamples() != 0)
+ if (readBuffer->getActualFormat() != drawBuffer->getActualFormat())
{
context->recordError(Error(GL_INVALID_OPERATION));
return false;
}
- }
- }
- }
- if (mask & GL_STENCIL_BUFFER_BIT)
- {
- gl::FramebufferAttachment *readStencilBuffer = readFramebuffer->getStencilbuffer();
- gl::FramebufferAttachment *drawStencilBuffer = drawFramebuffer->getStencilbuffer();
-
- if (readStencilBuffer && drawStencilBuffer)
- {
- if (readStencilBuffer->getActualFormat() != drawStencilBuffer->getActualFormat())
- {
- context->recordError(Error(GL_INVALID_OPERATION));
- return false;
- }
-
- if (readStencilBuffer->getSamples() > 0 && !sameBounds)
- {
- context->recordError(Error(GL_INVALID_OPERATION));
- return false;
- }
-
- if (fromAngleExtension)
- {
- if (IsPartialBlit(context, readStencilBuffer, drawStencilBuffer,
- srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1))
- {
- ERR("Only whole-buffer depth and stencil blits are supported by this implementation.");
- context->recordError(Error(GL_INVALID_OPERATION)); // only whole-buffer copies are permitted
- return false;
- }
-
- if (readStencilBuffer->getSamples() != 0 || drawStencilBuffer->getSamples() != 0)
+ if (readBuffer->getSamples() > 0 && !sameBounds)
{
context->recordError(Error(GL_INVALID_OPERATION));
return false;
}
+
+ if (fromAngleExtension)
+ {
+ if (IsPartialBlit(context, readBuffer, drawBuffer,
+ srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1))
+ {
+ ERR("Only whole-buffer depth and stencil blits are supported by this implementation.");
+ context->recordError(Error(GL_INVALID_OPERATION)); // only whole-buffer copies are permitted
+ return false;
+ }
+
+ if (readBuffer->getSamples() != 0 || drawBuffer->getSamples() != 0)
+ {
+ context->recordError(Error(GL_INVALID_OPERATION));
+ return false;
+ }
+ }
}
}
}