Fix issues with ProgramGL.

 * Don't re-create the native GL program every link, some program state should
   persist between re-linking such as bound attribute locations.
 * Forward glBindAttribLocation calls to the ProgramImpl, fixes some chromium
   rendering issues because chromium always binds attribute locations,
   sometimes with gaps.
 * Query the real attrib location before inserting it into the list of attribs.
   It was unsafe to rely on the attrib having the same location as its index
   into the active attributes.

BUG=angleproject:882

Change-Id: If14b4c4c2f5ebcdaa4f7c5a890b9519d6d4e6e43
Reviewed-on: https://chromium-review.googlesource.com/269991
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/ProgramImpl.h b/src/libANGLE/renderer/ProgramImpl.h
index f837930..c841c6a 100644
--- a/src/libANGLE/renderer/ProgramImpl.h
+++ b/src/libANGLE/renderer/ProgramImpl.h
@@ -51,6 +51,8 @@
                             int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
                             std::map<int, gl::VariableLocation> *outputVariables) = 0;
 
+    virtual void bindAttributeLocation(GLuint index, const std::string &name) = 0;
+
     virtual void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) = 0;
     virtual void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) = 0;
     virtual void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) = 0;