Add gl::Program::syncState and dirty bits.
Currently this handles uniform block bindings. Cleans up some logic in D3D.
Bug: angleproject:2747
Change-Id: I8c2989738d50a77d6f6d90a9ff11dceab6d3129c
Reviewed-on: https://chromium-review.googlesource.com/1172085
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index fbf9bfe..59f0e13 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -461,6 +461,7 @@
mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
+ mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
@@ -506,6 +507,7 @@
mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
+ mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
mImplementation->setErrorSet(&mErrors);
@@ -5797,6 +5799,10 @@
handleError(programObject->loadBinary(this, binaryFormat, binary, length));
mStateCache.onProgramExecutableChange(this);
+ if (programObject->isInUse())
+ {
+ mGLState.setObjectDirty(GL_PROGRAM);
+ }
}
void Context::uniform1ui(GLint location, GLuint v0)
@@ -6166,6 +6172,11 @@
{
Program *programObject = getProgram(program);
programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
+
+ if (programObject->isInUse())
+ {
+ mGLState.setObjectDirty(GL_PROGRAM);
+ }
}
GLsync Context::fenceSync(GLenum condition, GLbitfield flags)