Implement dirty bits for Framebuffer.

The dirty bits set the stage for performance improvements in D3D, but
don't actually reduce any of the redundant work just yet.

BUG=angleproject:1260

Change-Id: Ib84e6a9b7aa40c37c41790f492361b22faaf4742
Reviewed-on: https://chromium-review.googlesource.com/318730
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tryjob-Request: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index daba660..b978ab2 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -2065,6 +2065,9 @@
                              GLsizei height,
                              GLint border)
 {
+    // Only sync the read FBO
+    mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
+
     Rectangle sourceArea(x, y, width, height);
 
     const Framebuffer *framebuffer = mState.getReadFramebuffer();
@@ -2086,6 +2089,9 @@
                                 GLsizei width,
                                 GLsizei height)
 {
+    // Only sync the read FBO
+    mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
+
     Offset destOffset(xoffset, yoffset, 0);
     Rectangle sourceArea(x, y, width, height);
 
@@ -2109,6 +2115,9 @@
                                 GLsizei width,
                                 GLsizei height)
 {
+    // Only sync the read FBO
+    mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
+
     Offset destOffset(xoffset, yoffset, zoffset);
     Rectangle sourceArea(x, y, width, height);
 
@@ -2152,6 +2161,8 @@
     {
         framebuffer->resetAttachment(attachment);
     }
+
+    mState.setObjectDirty(target);
 }
 
 void Context::framebufferRenderbuffer(GLenum target,
@@ -2172,6 +2183,8 @@
     {
         framebuffer->resetAttachment(attachment);
     }
+
+    mState.setObjectDirty(target);
 }
 
 void Context::framebufferTextureLayer(GLenum target,
@@ -2205,6 +2218,8 @@
     {
         framebuffer->resetAttachment(attachment);
     }
+
+    mState.setObjectDirty(target);
 }
 
 void Context::drawBuffers(GLsizei n, const GLenum *bufs)
@@ -2212,16 +2227,21 @@
     Framebuffer *framebuffer = mState.getDrawFramebuffer();
     ASSERT(framebuffer);
     framebuffer->setDrawBuffers(n, bufs);
+    mState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
 }
 
 void Context::readBuffer(GLenum mode)
 {
     Framebuffer *readFBO = mState.getReadFramebuffer();
     readFBO->setReadBuffer(mode);
+    mState.setObjectDirty(GL_READ_FRAMEBUFFER);
 }
 
 void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
 {
+    // Only sync the FBO
+    mState.syncDirtyObject(target);
+
     Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
     ASSERT(framebuffer);
 
@@ -2238,6 +2258,9 @@
                                     GLsizei numAttachments,
                                     const GLenum *attachments)
 {
+    // Only sync the FBO
+    mState.syncDirtyObject(target);
+
     Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
     ASSERT(framebuffer);
 
@@ -2260,6 +2283,9 @@
                                        GLsizei width,
                                        GLsizei height)
 {
+    // Only sync the FBO
+    mState.syncDirtyObject(target);
+
     Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
     ASSERT(framebuffer);