Implemented glInvalidateFramebuffer and glInvalidateSubFramebuffer.
TRAC #23133
Signed-off-by: Jamie Madill
Signed-off-by: Shannon Woods
Author: Geoff Lang
git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2335 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index c9b2b6b..2665072 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -3257,6 +3257,79 @@
}
}
+void Context::invalidateFrameBuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments,
+ GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ Framebuffer *frameBuffer = NULL;
+ switch (target)
+ {
+ case GL_FRAMEBUFFER:
+ case GL_DRAW_FRAMEBUFFER:
+ frameBuffer = getDrawFramebuffer();
+ break;
+ case GL_READ_FRAMEBUFFER:
+ frameBuffer = getReadFramebuffer();
+ break;
+ default:
+ UNREACHABLE();
+ }
+
+ if (frameBuffer && frameBuffer->completeness() == GL_FRAMEBUFFER_COMPLETE)
+ {
+ for (int i = 0; i < numAttachments; ++i)
+ {
+ rx::RenderTarget *renderTarget = NULL;
+
+ if (attachments[i] >= GL_COLOR_ATTACHMENT0 && attachments[i] <= GL_COLOR_ATTACHMENT15)
+ {
+ gl::Renderbuffer *renderBuffer = frameBuffer->getColorbuffer(attachments[i] - GL_COLOR_ATTACHMENT0);
+ if (renderBuffer)
+ {
+ renderTarget = renderBuffer->getRenderTarget();
+ }
+ }
+ else if (attachments[i] == GL_COLOR)
+ {
+ gl::Renderbuffer *renderBuffer = frameBuffer->getColorbuffer(0);
+ if (renderBuffer)
+ {
+ renderTarget = renderBuffer->getRenderTarget();
+ }
+ }
+ else
+ {
+ gl::Renderbuffer *renderBuffer = NULL;
+ switch (attachments[i])
+ {
+ case GL_DEPTH_ATTACHMENT:
+ case GL_DEPTH:
+ renderBuffer = frameBuffer->getDepthbuffer();
+ break;
+ case GL_STENCIL_ATTACHMENT:
+ case GL_STENCIL:
+ renderBuffer = frameBuffer->getStencilbuffer();
+ break;
+ case GL_DEPTH_STENCIL_ATTACHMENT:
+ renderBuffer = frameBuffer->getDepthOrStencilbuffer();
+ break;
+ default:
+ UNREACHABLE();
+ }
+
+ if (renderBuffer)
+ {
+ renderTarget = renderBuffer->getDepthStencil();
+ }
+ }
+
+ if (renderTarget)
+ {
+ renderTarget->invalidate(x, y, width, height);
+ }
+ }
+ }
+}
+
}
extern "C"