| Index: gpu/command_buffer/client/program_info_manager.h
 | 
| diff --git a/gpu/command_buffer/client/program_info_manager.h b/gpu/command_buffer/client/program_info_manager.h
 | 
| index efbff73f08423072061b687f35d0810fbbdcf484..6f8a745c0b89d9af2106f1500d148842afad799f 100644
 | 
| --- a/gpu/command_buffer/client/program_info_manager.h
 | 
| +++ b/gpu/command_buffer/client/program_info_manager.h
 | 
| @@ -60,14 +60,39 @@ class GLES2_IMPL_EXPORT ProgramInfoManager {
 | 
|        GLES2Implementation* gl, GLuint program, GLuint index,
 | 
|        GLenum pname, GLint* params);
 | 
|  
 | 
| +  // Attempt to update the |index| uniform block binding.
 | 
| +  // It's no op if the program does not exist, or the |index| uniform block
 | 
| +  // is not in the cache, or binding >= GL_MAX_UNIFORM_BUFFER_BINDINGS.
 | 
| +  void UniformBlockBinding(
 | 
| +      GLES2Implementation* gl, GLuint program, GLuint index, GLuint binding);
 | 
| +
 | 
| +  bool GetTransformFeedbackVarying(
 | 
| +      GLES2Implementation* gl, GLuint program, GLuint index, GLsizei bufsize,
 | 
| +      GLsizei* length, GLsizei* size, GLenum* type, char* name);
 | 
| +
 | 
| +  bool GetUniformIndices(
 | 
| +      GLES2Implementation* gl, GLuint program, GLsizei count,
 | 
| +      const char* const* names, GLuint* indices);
 | 
| +
 | 
| +  bool GetActiveUniformsiv(
 | 
| +      GLES2Implementation* gl, GLuint program, GLsizei count,
 | 
| +      const GLuint* indices, GLenum pname, GLint* params);
 | 
| +
 | 
|   private:
 | 
|    friend class ProgramInfoManagerTest;
 | 
|  
 | 
| +  FRIEND_TEST_ALL_PREFIXES(ProgramInfoManagerTest, UpdateES2);
 | 
|    FRIEND_TEST_ALL_PREFIXES(ProgramInfoManagerTest, UpdateES3UniformBlocks);
 | 
| +  FRIEND_TEST_ALL_PREFIXES(ProgramInfoManagerTest,
 | 
| +                           UpdateES3TransformFeedbackVaryings);
 | 
| +  FRIEND_TEST_ALL_PREFIXES(ProgramInfoManagerTest,
 | 
| +                           GetActiveUniformsivCached);
 | 
|  
 | 
|    enum ProgramInfoType {
 | 
|      kES2,
 | 
|      kES3UniformBlocks,
 | 
| +    kES3TransformFeedbackVaryings,
 | 
| +    kES3Uniformsiv,
 | 
|      kNone,
 | 
|    };
 | 
|  
 | 
| @@ -84,6 +109,16 @@ class GLES2_IMPL_EXPORT ProgramInfoManager {
 | 
|        std::string name;
 | 
|        std::vector<GLint> element_locations;
 | 
|      };
 | 
| +    struct UniformES3 {
 | 
| +      UniformES3();
 | 
| +      ~UniformES3();
 | 
| +
 | 
| +      GLint block_index;
 | 
| +      GLint offset;
 | 
| +      GLint array_stride;
 | 
| +      GLint matrix_stride;
 | 
| +      GLint is_row_major;
 | 
| +    };
 | 
|      struct VertexAttrib {
 | 
|        VertexAttrib(GLsizei _size, GLenum _type, const std::string& _name,
 | 
|                     GLint _location);
 | 
| @@ -105,6 +140,14 @@ class GLES2_IMPL_EXPORT ProgramInfoManager {
 | 
|        GLboolean referenced_by_fragment_shader;
 | 
|        std::string name;
 | 
|      };
 | 
| +    struct TransformFeedbackVarying {
 | 
| +      TransformFeedbackVarying();
 | 
| +      ~TransformFeedbackVarying();
 | 
| +
 | 
| +      GLsizei size;
 | 
| +      GLenum type;
 | 
| +      std::string name;
 | 
| +    };
 | 
|  
 | 
|      Program();
 | 
|      ~Program();
 | 
| @@ -117,6 +160,11 @@ class GLES2_IMPL_EXPORT ProgramInfoManager {
 | 
|  
 | 
|      // Gets the location of a uniform by name.
 | 
|      GLint GetUniformLocation(const std::string& name) const;
 | 
| +    // Gets the index of a uniform by name. Return INVALID_INDEX in failure.
 | 
| +    GLuint GetUniformIndex(const std::string& name) const;
 | 
| +
 | 
| +    bool GetUniformsiv(
 | 
| +        GLsizei count, const GLuint* indices, GLenum pname, GLint* params);
 | 
|  
 | 
|      GLint GetFragDataLocation(const std::string& name) const;
 | 
|      void CacheFragDataLocation(const std::string& name, GLint loc);
 | 
| @@ -126,6 +174,11 @@ class GLES2_IMPL_EXPORT ProgramInfoManager {
 | 
|      // Gets the index of a uniform block by name.
 | 
|      GLuint GetUniformBlockIndex(const std::string& name) const;
 | 
|      const UniformBlock* GetUniformBlock(GLuint index) const;
 | 
| +    // Update the binding if the |index| uniform block is in the cache.
 | 
| +    void UniformBlockBinding(GLuint index, GLuint binding);
 | 
| +
 | 
| +    const TransformFeedbackVarying* GetTransformFeedbackVarying(
 | 
| +        GLuint index) const;
 | 
|  
 | 
|      // Updates the ES2 only program info after a successful link.
 | 
|      void UpdateES2(const std::vector<int8>& result);
 | 
| @@ -133,6 +186,12 @@ class GLES2_IMPL_EXPORT ProgramInfoManager {
 | 
|      // Updates the ES3 UniformBlock info after a successful link.
 | 
|      void UpdateES3UniformBlocks(const std::vector<int8>& result);
 | 
|  
 | 
| +    // Updates the ES3 Uniformsiv info after a successful link.
 | 
| +    void UpdateES3Uniformsiv(const std::vector<int8>& result);
 | 
| +
 | 
| +    // Updates the ES3 TransformFeedbackVaryings info after a successful link.
 | 
| +    void UpdateES3TransformFeedbackVaryings(const std::vector<int8>& result);
 | 
| +
 | 
|      bool IsCached(ProgramInfoType type) const;
 | 
|  
 | 
|     private:
 | 
| @@ -160,6 +219,17 @@ class GLES2_IMPL_EXPORT ProgramInfoManager {
 | 
|      // Uniform blocks by index.
 | 
|      std::vector<UniformBlock> uniform_blocks_;
 | 
|  
 | 
| +    bool cached_es3_transform_feedback_varyings_;
 | 
| +
 | 
| +    uint32_t transform_feedback_varying_max_length_;
 | 
| +
 | 
| +    // TransformFeedback varyings by index.
 | 
| +    std::vector<TransformFeedbackVarying> transform_feedback_varyings_;
 | 
| +
 | 
| +    bool cached_es3_uniformsiv_;
 | 
| +
 | 
| +    std::vector<UniformES3> uniforms_es3_;
 | 
| +
 | 
|      base::hash_map<std::string, GLint> frag_data_locations_;
 | 
|    };
 | 
|  
 | 
| 
 |