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/1254041
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 68fa842..374e174 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -5715,8 +5715,11 @@
     //      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 @@
     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);
     }
 }