Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1280)

Unified Diff: gpu/command_buffer/client/program_info_manager.cc

Issue 885443002: Roll Chrome into Mojo. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Rebase to ToT mojo Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/client/program_info_manager.h ('k') | gpu/command_buffer/cmd_buffer_functions.txt » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 f667d6dbdcc3736708c6723d4ca607588f73bf08..e167e38d91a8aa2f70b62ff8e379babff3afa42c 100644
--- a/gpu/command_buffer/client/program_info_manager.cc
+++ b/gpu/command_buffer/client/program_info_manager.cc
@@ -4,9 +4,10 @@
#include "gpu/command_buffer/client/program_info_manager.h"
-#include <map>
+#include <string>
#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"
@@ -36,6 +37,10 @@ class NonCachedProgramInfoManager : public ProgramInfoManager {
GLuint program,
const char* name) override;
+ GLint GetFragDataLocation(GLES2Implementation* gl,
+ GLuint program,
+ const char* name) override;
+
bool GetActiveAttrib(GLES2Implementation* gl,
GLuint program,
GLuint index,
@@ -85,6 +90,11 @@ GLint NonCachedProgramInfoManager::GetUniformLocation(
return gl->GetUniformLocationHelper(program, name);
}
+GLint NonCachedProgramInfoManager::GetFragDataLocation(
+ GLES2Implementation* gl, GLuint program, const char* name) {
+ return gl->GetFragDataLocationHelper(program, name);
+}
+
bool NonCachedProgramInfoManager::GetActiveAttrib(
GLES2Implementation* gl,
GLuint program, GLuint index, GLsizei bufsize, GLsizei* length,
@@ -123,6 +133,10 @@ class CachedProgramInfoManager : public ProgramInfoManager {
GLuint program,
const char* name) override;
+ GLint GetFragDataLocation(GLES2Implementation* gl,
+ GLuint program,
+ const char* name) override;
+
bool GetActiveAttrib(GLES2Implementation* gl,
GLuint program,
GLuint index,
@@ -191,6 +205,9 @@ class CachedProgramInfoManager : public ProgramInfoManager {
// 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.
@@ -213,14 +230,15 @@ class CachedProgramInfoManager : public ProgramInfoManager {
// 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);
- // TODO(gman): Switch to a faster container.
- typedef std::map<GLuint, Program> ProgramInfoMap;
+ typedef base::hash_map<GLuint, Program> ProgramInfoMap;
ProgramInfoMap program_infos_;
@@ -284,6 +302,20 @@ GLint CachedProgramInfoManager::Program::GetUniformLocation(
return -1;
}
+GLint CachedProgramInfoManager::Program::GetFragDataLocation(
+ const std::string& name) const {
+ base::hash_map<std::string, GLint>::const_iterator iter =
+ frag_data_locations_.find(name);
+ if (iter == frag_data_locations_.end())
+ return -1;
+ return iter->second;
+}
+
+void CachedProgramInfoManager::Program::CacheFragDataLocation(
+ const std::string& name, GLint loc) {
+ frag_data_locations_[name] = loc;
+}
+
bool CachedProgramInfoManager::Program::GetProgramiv(
GLenum pname, GLint* params) {
switch (pname) {
@@ -338,6 +370,7 @@ void CachedProgramInfoManager::Program::Update(
}
attrib_infos_.clear();
uniform_infos_.clear();
+ frag_data_locations_.clear();
max_attrib_name_length_ = 0;
max_uniform_name_length_ = 0;
const ProgramInput* inputs = LocalGetAs<const ProgramInput*>(
@@ -459,6 +492,30 @@ GLint CachedProgramInfoManager::GetUniformLocation(
return gl->GetUniformLocationHelper(program, name);
}
+GLint CachedProgramInfoManager::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.
+ {
+ base::AutoLock auto_lock(lock_);
+ Program* info = GetProgramInfo(gl, program);
+ if (info) {
+ GLint possible_loc = info->GetFragDataLocation(name);
+ if (possible_loc != -1)
+ return possible_loc;
+ }
+ }
+ GLint loc = gl->GetFragDataLocationHelper(program, name);
+ if (loc != -1) {
+ base::AutoLock auto_lock(lock_);
+ Program* info = GetProgramInfo(gl, program);
+ if (info) {
+ info->CacheFragDataLocation(name, loc);
+ }
+ }
+ return loc;
+}
+
bool CachedProgramInfoManager::GetActiveAttrib(
GLES2Implementation* gl,
GLuint program, GLuint index, GLsizei bufsize, GLsizei* length,
« no previous file with comments | « gpu/command_buffer/client/program_info_manager.h ('k') | gpu/command_buffer/cmd_buffer_functions.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698