Move UBO bindings into Program shared state.

Sharing the bindings with the Impl (read-only) allows us to clean out
the applyUniformBuffers method from the Impl class, and make it D3D-
only.

BUG=angleproject:1123

Change-Id: Icb51a90cb227bbbdd83319ea308b68aa1c4c325e
Reviewed-on: https://chromium-review.googlesource.com/293824
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index d886d40..8877fdf 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -972,11 +972,6 @@
     return mProgram->applyUniforms();
 }
 
-Error Program::applyUniformBuffers(const gl::Data &data)
-{
-    return mProgram->applyUniformBuffers(data, mUniformBlockBindings);
-}
-
 void Program::flagForDeletion()
 {
     mDeleteStatus = true;
@@ -1116,19 +1111,19 @@
 
 void Program::bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
 {
-    mUniformBlockBindings[uniformBlockIndex] = uniformBlockBinding;
+    mData.mUniformBlockBindings[uniformBlockIndex] = uniformBlockBinding;
 }
 
 GLuint Program::getUniformBlockBinding(GLuint uniformBlockIndex) const
 {
-    return mUniformBlockBindings[uniformBlockIndex];
+    return mData.getUniformBlockBinding(uniformBlockIndex);
 }
 
 void Program::resetUniformBlockBindings()
 {
     for (unsigned int blockId = 0; blockId < IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS; blockId++)
     {
-        mUniformBlockBindings[blockId] = 0;
+        mData.mUniformBlockBindings[blockId] = 0;
     }
 }
 
diff --git a/src/libANGLE/Program.h b/src/libANGLE/Program.h
index e348e20..deb16b2 100644
--- a/src/libANGLE/Program.h
+++ b/src/libANGLE/Program.h
@@ -175,6 +175,11 @@
             return mTransformFeedbackVaryingNames;
         }
         GLint getTransformFeedbackBufferMode() const { return mTransformFeedbackBufferMode; }
+        GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const
+        {
+            ASSERT(uniformBlockIndex < IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS);
+            return mUniformBlockBindings[uniformBlockIndex];
+        }
 
       private:
         friend class Program;
@@ -186,6 +191,8 @@
         std::vector<sh::Varying> mTransformFeedbackVaryingVars;
         GLenum mTransformFeedbackBufferMode;
 
+        GLuint mUniformBlockBindings[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS];
+
         // TODO(jmadill): move more state into Data.
     };
 
@@ -262,7 +269,6 @@
     void getUniformuiv(GLint location, GLuint *params);
 
     Error applyUniforms();
-    Error applyUniformBuffers(const gl::Data &data);
 
     void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const;
     void getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const;
@@ -339,8 +345,6 @@
 
     AttributeBindings mAttributeBindings;
 
-    GLuint mUniformBlockBindings[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS];
-
     bool mLinked;
     bool mDeleteStatus;   // Flag to indicate that the program can be deleted when no longer in use
 
diff --git a/src/libANGLE/renderer/ProgramImpl.h b/src/libANGLE/renderer/ProgramImpl.h
index 4cb1364..f29d862 100644
--- a/src/libANGLE/renderer/ProgramImpl.h
+++ b/src/libANGLE/renderer/ProgramImpl.h
@@ -81,7 +81,6 @@
     virtual bool validateSamplers(gl::InfoLog *infoLog, const gl::Caps &caps) = 0;
 
     virtual gl::Error applyUniforms() = 0;
-    virtual gl::Error applyUniformBuffers(const gl::Data &data, GLuint uniformBlockBindings[]) = 0;
 
     const std::vector<gl::LinkedUniform*> &getUniforms() const { return mUniforms; }
     const std::map<GLuint, gl::VariableLocation> &getUniformIndices() const { return mUniformIndex; }
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index ba5e0f6..8ff6ea5 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -1216,7 +1216,7 @@
     return gl::Error(GL_NO_ERROR);
 }
 
-gl::Error ProgramD3D::applyUniformBuffers(const gl::Data &data, GLuint uniformBlockBindings[])
+gl::Error ProgramD3D::applyUniformBuffers(const gl::Data &data)
 {
     mVertexUBOCache.clear();
     mFragmentUBOCache.clear();
@@ -1227,7 +1227,7 @@
     for (unsigned int uniformBlockIndex = 0; uniformBlockIndex < mUniformBlocks.size(); uniformBlockIndex++)
     {
         gl::UniformBlock *uniformBlock = mUniformBlocks[uniformBlockIndex];
-        GLuint blockBinding = uniformBlockBindings[uniformBlockIndex];
+        GLuint blockBinding            = mData.getUniformBlockBinding(uniformBlockIndex);
 
         ASSERT(uniformBlock);
 
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.h b/src/libANGLE/renderer/d3d/ProgramD3D.h
index afcf0a8..e938600 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.h
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.h
@@ -78,7 +78,7 @@
 
     void initializeUniformStorage();
     gl::Error applyUniforms();
-    gl::Error applyUniformBuffers(const gl::Data &data, GLuint uniformBlockBindings[]) override;
+    gl::Error applyUniformBuffers(const gl::Data &data);
     void assignUniformBlockRegister(gl::UniformBlock *uniformBlock,
                                     GLenum shader,
                                     unsigned int registerIndex,
diff --git a/src/libANGLE/renderer/d3d/RendererD3D.cpp b/src/libANGLE/renderer/d3d/RendererD3D.cpp
index 1a0083a..6a9e1b4 100644
--- a/src/libANGLE/renderer/d3d/RendererD3D.cpp
+++ b/src/libANGLE/renderer/d3d/RendererD3D.cpp
@@ -144,7 +144,7 @@
         return error;
     }
 
-    error = program->applyUniformBuffers(data);
+    error = programD3D->applyUniformBuffers(data);
     if (error.isError())
     {
         return error;
@@ -217,7 +217,7 @@
         return error;
     }
 
-    error = program->applyUniformBuffers(data);
+    error = programD3D->applyUniformBuffers(data);
     if (error.isError())
     {
         return error;
diff --git a/src/libANGLE/renderer/gl/ProgramGL.cpp b/src/libANGLE/renderer/gl/ProgramGL.cpp
index b1b2277..665c390 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -372,12 +372,6 @@
     return gl::Error(GL_NO_ERROR);
 }
 
-gl::Error ProgramGL::applyUniformBuffers(const gl::Data &data, GLuint uniformBlockBindings[])
-{
-    UNIMPLEMENTED();
-    return gl::Error(GL_INVALID_OPERATION);
-}
-
 void ProgramGL::reset()
 {
     ProgramImpl::reset();
diff --git a/src/libANGLE/renderer/gl/ProgramGL.h b/src/libANGLE/renderer/gl/ProgramGL.h
index d1ad4ae..8264b18 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.h
+++ b/src/libANGLE/renderer/gl/ProgramGL.h
@@ -79,7 +79,6 @@
                             const gl::Caps &caps);
 
     gl::Error applyUniforms() override;
-    gl::Error applyUniformBuffers(const gl::Data &data, GLuint uniformBlockBindings[]) override;
 
     void reset() override;