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);