Add workaround to always call useProgram after a successful link.

This workaround is meant to reproduce the behavior of the
use_current_program_after_successful_link workaround in
Chromium (http://crbug.com/110263)

The workaround was shown to be unnecessary for MacOSX 10.9 and
higher (http://crrev.com/39eb535b).

BUG=349137

Change-Id: I3023f053aa1593ba7044a889dd47746b8f7e0581
Reviewed-on: https://chromium-review.googlesource.com/337780
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/gl/ProgramGL.cpp b/src/libANGLE/renderer/gl/ProgramGL.cpp
index cac1985..71d73fd 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -13,6 +13,7 @@
 #include "libANGLE/renderer/gl/FunctionsGL.h"
 #include "libANGLE/renderer/gl/ShaderGL.h"
 #include "libANGLE/renderer/gl/StateManagerGL.h"
+#include "libANGLE/renderer/gl/WorkaroundsGL.h"
 #include "platform/Platform.h"
 
 namespace rx
@@ -20,8 +21,13 @@
 
 ProgramGL::ProgramGL(const gl::Program::Data &data,
                      const FunctionsGL *functions,
+                     const WorkaroundsGL &workarounds,
                      StateManagerGL *stateManager)
-    : ProgramImpl(data), mFunctions(functions), mStateManager(stateManager), mProgramID(0)
+    : ProgramImpl(data),
+      mFunctions(functions),
+      mWorkarounds(workarounds),
+      mStateManager(stateManager),
+      mProgramID(0)
 {
     ASSERT(mFunctions);
     ASSERT(mStateManager);
@@ -144,6 +150,11 @@
         return LinkResult(false, gl::Error(GL_NO_ERROR));
     }
 
+    if (mWorkarounds.alwaysCallUseProgramAfterLink)
+    {
+        mStateManager->forceUseProgram(mProgramID);
+    }
+
     // Query the uniform information
     ASSERT(mUniformRealLocationMap.empty());
     const auto &uniforms = mData.getUniforms();