Commit df836ff8 by Jamie Madill Committed by Commit Bot

Call onProgramExecutableChange in useProgram.

This cleans up the code slightly and removes a few if checks. Also fixes a potential edge case with ProgramBinary called on a program that is in-use. Bug: angleproject:2763 Change-Id: Ibe0ab20ed44f593bb6c2b0612871680a7df1a15f Reviewed-on: https://chromium-review.googlesource.com/1254041Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarYuly Novikov <ynovikov@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 0da73fed
......@@ -5715,8 +5715,11 @@ void Context::linkProgram(GLuint program)
// ProgramD3D.
if (programObject->isInUse())
{
// isLinked() which forces to resolve linking, will be called.
mGLState.onProgramExecutableChange(programObject);
if (programObject->isLinked())
{
mGLState.onProgramExecutableChange(programObject);
}
mStateCache.onProgramExecutableChange(this);
}
}
......@@ -5927,10 +5930,10 @@ void Context::programBinary(GLuint program, GLenum binaryFormat, const void *bin
ASSERT(programObject != nullptr);
handleError(programObject->loadBinary(this, binaryFormat, binary, length));
mStateCache.onProgramExecutableChange(this);
if (programObject->isInUse())
{
mGLState.setObjectDirty(GL_PROGRAM);
mGLState.onProgramExecutableChange(programObject);
mStateCache.onProgramExecutableChange(this);
}
}
......
......@@ -1344,11 +1344,13 @@ void State::setProgram(const Context *context, Program *newProgram)
if (mProgram)
{
newProgram->addRef();
mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
onProgramExecutableChange(newProgram);
}
mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
// Note that rendering is undefined if glUseProgram(0) is called. But ANGLE will generate
// an error if the app tries to draw in this case.
mDirtyBits.set(DIRTY_BIT_PROGRAM_BINDING);
mDirtyObjects.set(DIRTY_OBJECT_PROGRAM);
}
}
......@@ -2879,12 +2881,11 @@ void State::onProgramExecutableChange(Program *program)
// "If LinkProgram or ProgramBinary successfully re-links a program object
// that was already in use as a result of a previous call to UseProgram, then the
// generated executable code will be installed as part of the current rendering state."
if (program->isLinked() && mProgram == program)
{
mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
mDirtyObjects.set(DIRTY_OBJECT_PROGRAM);
}
ASSERT(program->isLinked());
mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
mDirtyObjects.set(DIRTY_OBJECT_PROGRAM);
}
void State::setSamplerDirty(size_t samplerIndex)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment