| 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 81be345f7b8db7145ecfb8ef3a6863c295465c10..712b8ed489a0b6ed18c727b236d803665c57f25a 100644
|
| --- a/gpu/command_buffer/client/program_info_manager.h
|
| +++ b/gpu/command_buffer/client/program_info_manager.h
|
| @@ -6,48 +6,122 @@
|
| #define GPU_COMMAND_BUFFER_CLIENT_PROGRAM_INFO_MANAGER_H_
|
|
|
| #include <GLES2/gl2.h>
|
| +
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include "base/containers/hash_tables.h"
|
| +#include "base/synchronization/lock.h"
|
| #include "gles2_impl_export.h"
|
| +#include "gpu/command_buffer/client/gles2_implementation.h"
|
|
|
| namespace gpu {
|
| namespace gles2 {
|
|
|
| -class GLES2Implementation;
|
| -
|
| // Manages info about OpenGL ES Programs.
|
| class GLES2_IMPL_EXPORT ProgramInfoManager {
|
| public:
|
| - virtual ~ProgramInfoManager();
|
| + ProgramInfoManager();
|
| + ~ProgramInfoManager();
|
|
|
| - static ProgramInfoManager* Create(bool shared_resources_across_processes);
|
| + void CreateInfo(GLuint program);
|
|
|
| - virtual void CreateInfo(GLuint program) = 0;
|
| + void DeleteInfo(GLuint program);
|
|
|
| - virtual void DeleteInfo(GLuint program) = 0;
|
| + bool GetProgramiv(
|
| + GLES2Implementation* gl, GLuint program, GLenum pname, GLint* params);
|
|
|
| - virtual bool GetProgramiv(
|
| - GLES2Implementation* gl, GLuint program, GLenum pname, GLint* params) = 0;
|
| + GLint GetAttribLocation(
|
| + GLES2Implementation* gl, GLuint program, const char* name);
|
|
|
| - virtual GLint GetAttribLocation(
|
| - GLES2Implementation* gl, GLuint program, const char* name) = 0;
|
| + GLint GetUniformLocation(
|
| + GLES2Implementation* gl, GLuint program, const char* name);
|
|
|
| - virtual GLint GetUniformLocation(
|
| - GLES2Implementation* gl, GLuint program, const char* name) = 0;
|
| + GLint GetFragDataLocation(
|
| + GLES2Implementation* gl, GLuint program, const char* name);
|
|
|
| - virtual GLint GetFragDataLocation(
|
| - GLES2Implementation* gl, GLuint program, const char* name) = 0;
|
| + bool GetActiveAttrib(
|
| + GLES2Implementation* gl, GLuint program, GLuint index, GLsizei bufsize,
|
| + GLsizei* length, GLint* size, GLenum* type, char* name);
|
|
|
| - virtual bool GetActiveAttrib(
|
| - GLES2Implementation* gl,
|
| - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length,
|
| - GLint* size, GLenum* type, char* name) = 0;
|
| + bool GetActiveUniform(
|
| + GLES2Implementation* gl, GLuint program, GLuint index, GLsizei bufsize,
|
| + GLsizei* length, GLint* size, GLenum* type, char* name);
|
|
|
| - virtual bool GetActiveUniform(
|
| - GLES2Implementation* gl,
|
| - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length,
|
| - GLint* size, GLenum* type, char* name) = 0;
|
| + private:
|
| + class Program {
|
| + public:
|
| + struct UniformInfo {
|
| + UniformInfo(GLsizei _size, GLenum _type, const std::string& _name);
|
| + ~UniformInfo();
|
|
|
| - protected:
|
| - ProgramInfoManager();
|
| + GLsizei size;
|
| + GLenum type;
|
| + bool is_array;
|
| + std::string name;
|
| + std::vector<GLint> element_locations;
|
| + };
|
| + struct VertexAttrib {
|
| + VertexAttrib(GLsizei _size, GLenum _type, const std::string& _name,
|
| + GLint _location);
|
| + ~VertexAttrib();
|
| +
|
| + GLsizei size;
|
| + GLenum type;
|
| + GLint location;
|
| + std::string name;
|
| + };
|
| +
|
| + Program();
|
| + ~Program();
|
| +
|
| + const VertexAttrib* GetAttribInfo(GLint index) const;
|
| +
|
| + GLint GetAttribLocation(const std::string& name) const;
|
| +
|
| + const UniformInfo* GetUniformInfo(GLint index) const;
|
| +
|
| + // Gets the location of a uniform by name.
|
| + GLint GetUniformLocation(const std::string& name) const;
|
| +
|
| + GLint GetFragDataLocation(const std::string& name) const;
|
| + void CacheFragDataLocation(const std::string& name, GLint loc);
|
| +
|
| + bool GetProgramiv(GLenum pname, GLint* params);
|
| +
|
| + // Updates the program info after a successful link.
|
| + void Update(GLES2Implementation* gl,
|
| + GLuint program,
|
| + const std::vector<int8>& result);
|
| +
|
| + bool cached() const;
|
| +
|
| + private:
|
| + bool cached_;
|
| +
|
| + GLsizei max_attrib_name_length_;
|
| +
|
| + // Attrib by index.
|
| + std::vector<VertexAttrib> attrib_infos_;
|
| +
|
| + GLsizei max_uniform_name_length_;
|
| +
|
| + // Uniform info by index.
|
| + std::vector<UniformInfo> uniform_infos_;
|
| +
|
| + base::hash_map<std::string, GLint> frag_data_locations_;
|
| +
|
| + // This is true if glLinkProgram was successful last time it was called.
|
| + bool link_status_;
|
| + };
|
| +
|
| + Program* GetProgramInfo(GLES2Implementation* gl, GLuint program);
|
| +
|
| + typedef base::hash_map<GLuint, Program> ProgramInfoMap;
|
| +
|
| + ProgramInfoMap program_infos_;
|
| +
|
| + mutable base::Lock lock_;
|
| };
|
|
|
| } // namespace gles2
|
|
|