Index: gpu/command_buffer/client/program_info_manager.cc |
diff --git a/gpu/command_buffer/client/program_info_manager.cc b/gpu/command_buffer/client/program_info_manager.cc |
index e167e38d91a8aa2f70b62ff8e379babff3afa42c..71963721e523d307ca238045eb1599c89a7663d4 100644 |
--- a/gpu/command_buffer/client/program_info_manager.cc |
+++ b/gpu/command_buffer/client/program_info_manager.cc |
@@ -4,248 +4,35 @@ |
#include "gpu/command_buffer/client/program_info_manager.h" |
-#include <string> |
+namespace { |
-#include "base/compiler_specific.h" |
-#include "base/containers/hash_tables.h" |
-#include "base/synchronization/lock.h" |
-#include "gpu/command_buffer/client/gles2_implementation.h" |
-#include "gpu/command_buffer/common/gles2_cmd_utils.h" |
- |
-namespace gpu { |
-namespace gles2 { |
- |
-class NonCachedProgramInfoManager : public ProgramInfoManager { |
- public: |
- NonCachedProgramInfoManager(); |
- ~NonCachedProgramInfoManager() override; |
- |
- void CreateInfo(GLuint program) override; |
- |
- void DeleteInfo(GLuint program) override; |
- |
- bool GetProgramiv(GLES2Implementation* gl, |
- GLuint program, |
- GLenum pname, |
- GLint* params) override; |
- |
- GLint GetAttribLocation(GLES2Implementation* gl, |
- GLuint program, |
- const char* name) override; |
- |
- GLint GetUniformLocation(GLES2Implementation* gl, |
- GLuint program, |
- const char* name) override; |
- |
- GLint GetFragDataLocation(GLES2Implementation* gl, |
- GLuint program, |
- const char* name) override; |
- |
- bool GetActiveAttrib(GLES2Implementation* gl, |
- GLuint program, |
- GLuint index, |
- GLsizei bufsize, |
- GLsizei* length, |
- GLint* size, |
- GLenum* type, |
- char* name) override; |
- |
- bool GetActiveUniform(GLES2Implementation* gl, |
- GLuint program, |
- GLuint index, |
- GLsizei bufsize, |
- GLsizei* length, |
- GLint* size, |
- GLenum* type, |
- char* name) override; |
-}; |
- |
-NonCachedProgramInfoManager::NonCachedProgramInfoManager() { |
-} |
- |
-NonCachedProgramInfoManager::~NonCachedProgramInfoManager() { |
-} |
- |
-void NonCachedProgramInfoManager::CreateInfo(GLuint /* program */) { |
-} |
- |
-void NonCachedProgramInfoManager::DeleteInfo(GLuint /* program */) { |
-} |
- |
-bool NonCachedProgramInfoManager::GetProgramiv( |
- GLES2Implementation* /* gl */, |
- GLuint /* program */, |
- GLenum /* pname */, |
- GLint* /* params */) { |
- return false; |
-} |
- |
-GLint NonCachedProgramInfoManager::GetAttribLocation( |
- GLES2Implementation* gl, GLuint program, const char* name) { |
- return gl->GetAttribLocationHelper(program, name); |
+template<typename T> static T LocalGetAs( |
+ const std::vector<int8>& data, uint32 offset, size_t size) { |
+ const int8* p = &data[0] + offset; |
+ if (offset + size > data.size()) { |
+ NOTREACHED(); |
+ return NULL; |
+ } |
+ return static_cast<T>(static_cast<const void*>(p)); |
} |
-GLint NonCachedProgramInfoManager::GetUniformLocation( |
- GLES2Implementation* gl, GLuint program, const char* name) { |
- return gl->GetUniformLocationHelper(program, name); |
-} |
+} // namespace anonymous |
-GLint NonCachedProgramInfoManager::GetFragDataLocation( |
- GLES2Implementation* gl, GLuint program, const char* name) { |
- return gl->GetFragDataLocationHelper(program, name); |
-} |
+namespace gpu { |
+namespace gles2 { |
-bool NonCachedProgramInfoManager::GetActiveAttrib( |
- GLES2Implementation* gl, |
- GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, |
- GLint* size, GLenum* type, char* name) { |
- return gl->GetActiveAttribHelper( |
- program, index, bufsize, length, size, type, name); |
+ProgramInfoManager::Program::VertexAttrib::VertexAttrib( |
+ GLsizei _size, GLenum _type, const std::string& _name, GLint _location) |
+ : size(_size), |
+ type(_type), |
+ location(_location), |
+ name(_name) { |
} |
-bool NonCachedProgramInfoManager::GetActiveUniform( |
- GLES2Implementation* gl, |
- GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, |
- GLint* size, GLenum* type, char* name) { |
- return gl->GetActiveUniformHelper( |
- program, index, bufsize, length, size, type, name); |
+ProgramInfoManager::Program::VertexAttrib::~VertexAttrib() { |
} |
-class CachedProgramInfoManager : public ProgramInfoManager { |
- public: |
- CachedProgramInfoManager(); |
- ~CachedProgramInfoManager() override; |
- |
- void CreateInfo(GLuint program) override; |
- |
- void DeleteInfo(GLuint program) override; |
- |
- bool GetProgramiv(GLES2Implementation* gl, |
- GLuint program, |
- GLenum pname, |
- GLint* params) override; |
- |
- GLint GetAttribLocation(GLES2Implementation* gl, |
- GLuint program, |
- const char* name) override; |
- |
- GLint GetUniformLocation(GLES2Implementation* gl, |
- GLuint program, |
- const char* name) override; |
- |
- GLint GetFragDataLocation(GLES2Implementation* gl, |
- GLuint program, |
- const char* name) override; |
- |
- bool GetActiveAttrib(GLES2Implementation* gl, |
- GLuint program, |
- GLuint index, |
- GLsizei bufsize, |
- GLsizei* length, |
- GLint* size, |
- GLenum* type, |
- char* name) override; |
- |
- bool GetActiveUniform(GLES2Implementation* gl, |
- GLuint program, |
- GLuint index, |
- GLsizei bufsize, |
- GLsizei* length, |
- GLint* size, |
- GLenum* type, |
- char* name) override; |
- |
- private: |
- class Program { |
- public: |
- struct UniformInfo { |
- UniformInfo(GLsizei _size, GLenum _type, const std::string& _name); |
- |
- 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) |
- : size(_size), |
- type(_type), |
- location(_location), |
- name(_name) { |
- } |
- GLsizei size; |
- GLenum type; |
- GLint location; |
- std::string name; |
- }; |
- |
- typedef std::vector<UniformInfo> UniformInfoVector; |
- typedef std::vector<VertexAttrib> AttribInfoVector; |
- |
- Program(); |
- |
- const AttribInfoVector& GetAttribInfos() const { |
- return attrib_infos_; |
- } |
- |
- const VertexAttrib* GetAttribInfo(GLint index) const { |
- return (static_cast<size_t>(index) < attrib_infos_.size()) ? |
- &attrib_infos_[index] : NULL; |
- } |
- |
- GLint GetAttribLocation(const std::string& name) const; |
- |
- const UniformInfo* GetUniformInfo(GLint index) const { |
- return (static_cast<size_t>(index) < uniform_infos_.size()) ? |
- &uniform_infos_[index] : NULL; |
- } |
- |
- // 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 { return cached_; } |
- |
- private: |
- bool cached_; |
- |
- GLsizei max_attrib_name_length_; |
- |
- // Attrib by index. |
- AttribInfoVector attrib_infos_; |
- |
- GLsizei max_uniform_name_length_; |
- |
- // Uniform info by index. |
- UniformInfoVector 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_; |
-}; |
- |
-CachedProgramInfoManager::Program::UniformInfo::UniformInfo( |
+ProgramInfoManager::Program::UniformInfo::UniformInfo( |
GLsizei _size, GLenum _type, const std::string& _name) |
: size(_size), |
type(_type), |
@@ -254,15 +41,21 @@ CachedProgramInfoManager::Program::UniformInfo::UniformInfo( |
DCHECK(!(size > 1 && !is_array)); |
} |
-CachedProgramInfoManager::Program::Program() |
+ProgramInfoManager::Program::UniformInfo::~UniformInfo() { |
+} |
+ |
+ProgramInfoManager::Program::Program() |
: cached_(false), |
max_attrib_name_length_(0), |
max_uniform_name_length_(0), |
link_status_(false) { |
} |
+ProgramInfoManager::Program::~Program() { |
+} |
+ |
// TODO(gman): Add a faster lookup. |
-GLint CachedProgramInfoManager::Program::GetAttribLocation( |
+GLint ProgramInfoManager::Program::GetAttribLocation( |
const std::string& name) const { |
for (GLuint ii = 0; ii < attrib_infos_.size(); ++ii) { |
const VertexAttrib& info = attrib_infos_[ii]; |
@@ -273,7 +66,19 @@ GLint CachedProgramInfoManager::Program::GetAttribLocation( |
return -1; |
} |
-GLint CachedProgramInfoManager::Program::GetUniformLocation( |
+const ProgramInfoManager::Program::VertexAttrib* |
+ProgramInfoManager::Program::GetAttribInfo(GLint index) const { |
+ return (static_cast<size_t>(index) < attrib_infos_.size()) ? |
+ &attrib_infos_[index] : NULL; |
+} |
+ |
+const ProgramInfoManager::Program::UniformInfo* |
+ProgramInfoManager::Program::GetUniformInfo(GLint index) const { |
+ return (static_cast<size_t>(index) < uniform_infos_.size()) ? |
+ &uniform_infos_[index] : NULL; |
+} |
+ |
+GLint ProgramInfoManager::Program::GetUniformLocation( |
const std::string& name) const { |
bool getting_array_location = false; |
size_t open_pos = std::string::npos; |
@@ -302,7 +107,7 @@ GLint CachedProgramInfoManager::Program::GetUniformLocation( |
return -1; |
} |
-GLint CachedProgramInfoManager::Program::GetFragDataLocation( |
+GLint ProgramInfoManager::Program::GetFragDataLocation( |
const std::string& name) const { |
base::hash_map<std::string, GLint>::const_iterator iter = |
frag_data_locations_.find(name); |
@@ -311,12 +116,12 @@ GLint CachedProgramInfoManager::Program::GetFragDataLocation( |
return iter->second; |
} |
-void CachedProgramInfoManager::Program::CacheFragDataLocation( |
+void ProgramInfoManager::Program::CacheFragDataLocation( |
const std::string& name, GLint loc) { |
frag_data_locations_[name] = loc; |
} |
-bool CachedProgramInfoManager::Program::GetProgramiv( |
+bool ProgramInfoManager::Program::GetProgramiv( |
GLenum pname, GLint* params) { |
switch (pname) { |
case GL_LINK_STATUS: |
@@ -340,17 +145,7 @@ bool CachedProgramInfoManager::Program::GetProgramiv( |
return false; |
} |
-template<typename T> static T LocalGetAs( |
- const std::vector<int8>& data, uint32 offset, size_t size) { |
- const int8* p = &data[0] + offset; |
- if (offset + size > data.size()) { |
- NOTREACHED(); |
- return NULL; |
- } |
- return static_cast<T>(static_cast<const void*>(p)); |
-} |
- |
-void CachedProgramInfoManager::Program::Update( |
+void ProgramInfoManager::Program::Update( |
GLES2Implementation* gl, |
GLuint program, |
const std::vector<int8>& result) { |
@@ -409,16 +204,19 @@ void CachedProgramInfoManager::Program::Update( |
cached_ = true; |
} |
-CachedProgramInfoManager::CachedProgramInfoManager() { |
+bool ProgramInfoManager::Program::cached() const { |
+ return cached_; |
} |
-CachedProgramInfoManager::~CachedProgramInfoManager() { |
+ProgramInfoManager::ProgramInfoManager() { |
} |
-CachedProgramInfoManager::Program* |
- CachedProgramInfoManager::GetProgramInfo( |
- GLES2Implementation* gl, GLuint program) { |
+ProgramInfoManager::~ProgramInfoManager() { |
+} |
+ |
+ProgramInfoManager::Program* ProgramInfoManager::GetProgramInfo( |
+ GLES2Implementation* gl, GLuint program) { |
lock_.AssertAcquired(); |
ProgramInfoMap::iterator it = program_infos_.find(program); |
if (it == program_infos_.end()) { |
@@ -444,7 +242,7 @@ CachedProgramInfoManager::Program* |
return info; |
} |
-void CachedProgramInfoManager::CreateInfo(GLuint program) { |
+void ProgramInfoManager::CreateInfo(GLuint program) { |
base::AutoLock auto_lock(lock_); |
program_infos_.erase(program); |
std::pair<ProgramInfoMap::iterator, bool> result = |
@@ -453,12 +251,12 @@ void CachedProgramInfoManager::CreateInfo(GLuint program) { |
DCHECK(result.second); |
} |
-void CachedProgramInfoManager::DeleteInfo(GLuint program) { |
+void ProgramInfoManager::DeleteInfo(GLuint program) { |
base::AutoLock auto_lock(lock_); |
program_infos_.erase(program); |
} |
-bool CachedProgramInfoManager::GetProgramiv( |
+bool ProgramInfoManager::GetProgramiv( |
GLES2Implementation* gl, GLuint program, GLenum pname, GLint* params) { |
base::AutoLock auto_lock(lock_); |
Program* info = GetProgramInfo(gl, program); |
@@ -468,7 +266,7 @@ bool CachedProgramInfoManager::GetProgramiv( |
return info->GetProgramiv(pname, params); |
} |
-GLint CachedProgramInfoManager::GetAttribLocation( |
+GLint ProgramInfoManager::GetAttribLocation( |
GLES2Implementation* gl, GLuint program, const char* name) { |
{ |
base::AutoLock auto_lock(lock_); |
@@ -480,7 +278,7 @@ GLint CachedProgramInfoManager::GetAttribLocation( |
return gl->GetAttribLocationHelper(program, name); |
} |
-GLint CachedProgramInfoManager::GetUniformLocation( |
+GLint ProgramInfoManager::GetUniformLocation( |
GLES2Implementation* gl, GLuint program, const char* name) { |
{ |
base::AutoLock auto_lock(lock_); |
@@ -492,7 +290,7 @@ GLint CachedProgramInfoManager::GetUniformLocation( |
return gl->GetUniformLocationHelper(program, name); |
} |
-GLint CachedProgramInfoManager::GetFragDataLocation( |
+GLint ProgramInfoManager::GetFragDataLocation( |
GLES2Implementation* gl, GLuint program, const char* name) { |
// TODO(zmo): make FragData locations part of the ProgramInfo that are |
// fetched altogether from the service side. See crbug.com/452104. |
@@ -516,7 +314,7 @@ GLint CachedProgramInfoManager::GetFragDataLocation( |
return loc; |
} |
-bool CachedProgramInfoManager::GetActiveAttrib( |
+bool ProgramInfoManager::GetActiveAttrib( |
GLES2Implementation* gl, |
GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, |
GLint* size, GLenum* type, char* name) { |
@@ -552,7 +350,7 @@ bool CachedProgramInfoManager::GetActiveAttrib( |
program, index, bufsize, length, size, type, name); |
} |
-bool CachedProgramInfoManager::GetActiveUniform( |
+bool ProgramInfoManager::GetActiveUniform( |
GLES2Implementation* gl, |
GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, |
GLint* size, GLenum* type, char* name) { |
@@ -588,21 +386,6 @@ bool CachedProgramInfoManager::GetActiveUniform( |
program, index, bufsize, length, size, type, name); |
} |
-ProgramInfoManager::ProgramInfoManager() { |
-} |
- |
-ProgramInfoManager::~ProgramInfoManager() { |
-} |
- |
-ProgramInfoManager* ProgramInfoManager::Create( |
- bool shared_resources_across_processes) { |
- if (shared_resources_across_processes) { |
- return new NonCachedProgramInfoManager(); |
- } else { |
- return new CachedProgramInfoManager(); |
- } |
-} |
- |
} // namespace gles2 |
} // namespace gpu |