Re-apply UBO binding workaround on program save.
The workaround which was previously defined to only apply on load
also seems to affect save on some AMD drivers.
BUG=angleproject:1637
BUG=angleproject:1897
Change-Id: Ia01a1420a484f3c2682ce97eaab18baccfb66a50
Reviewed-on: https://chromium-review.googlesource.com/558008
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/gl/ProgramGL.cpp b/src/libANGLE/renderer/gl/ProgramGL.cpp
index ec26143..2ea74e2 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -71,22 +71,12 @@
}
postLink();
-
- // Re-apply UBO bindings to work around driver bugs.
- const WorkaroundsGL &workaroundsGL = GetImplAs<ContextGL>(context)->getWorkaroundsGL();
- if (workaroundsGL.reapplyUBOBindingsAfterLoadingBinaryProgram)
- {
- const auto &blocks = mState.getUniformBlocks();
- for (size_t blockIndex : mState.getActiveUniformBlockBindingsMask())
- {
- setUniformBlockBinding(static_cast<GLuint>(blockIndex), blocks[blockIndex].binding);
- }
- }
+ reapplyUBOBindingsIfNeeded(context);
return true;
}
-void ProgramGL::save(gl::BinaryOutputStream *stream)
+void ProgramGL::save(const gl::Context *context, gl::BinaryOutputStream *stream)
{
GLint binaryLength = 0;
mFunctions->getProgramiv(mProgramID, GL_PROGRAM_BINARY_LENGTH, &binaryLength);
@@ -99,6 +89,22 @@
stream->writeInt(binaryFormat);
stream->writeInt(binaryLength);
stream->writeBytes(&binary[0], binaryLength);
+
+ reapplyUBOBindingsIfNeeded(context);
+}
+
+void ProgramGL::reapplyUBOBindingsIfNeeded(const gl::Context *context)
+{
+ // Re-apply UBO bindings to work around driver bugs.
+ const WorkaroundsGL &workaroundsGL = GetImplAs<ContextGL>(context)->getWorkaroundsGL();
+ if (workaroundsGL.reapplyUBOBindingsAfterUsingBinaryProgram)
+ {
+ const auto &blocks = mState.getUniformBlocks();
+ for (size_t blockIndex : mState.getActiveUniformBlockBindingsMask())
+ {
+ setUniformBlockBinding(static_cast<GLuint>(blockIndex), blocks[blockIndex].binding);
+ }
+ }
}
void ProgramGL::setBinaryRetrievableHint(bool retrievable)