summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/program_manager.cc
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-27 00:48:03 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-27 00:48:03 +0000
commitae51d195b0e1bfaba2243f005a1aba675395595f (patch)
treed6990cd30404b49ad0b01db2126f971b601a94d6 /gpu/command_buffer/service/program_manager.cc
parent4b3540935a9769fb1634483027b70ee763ee431e (diff)
downloadchromium_src-ae51d195b0e1bfaba2243f005a1aba675395595f.zip
chromium_src-ae51d195b0e1bfaba2243f005a1aba675395595f.tar.gz
chromium_src-ae51d195b0e1bfaba2243f005a1aba675395595f.tar.bz2
Changes the code to use separate ids namspaces
for buffers, textures, programs, etc.. This is needed to pass GLES2 conformance tests. TEST=old unit tests BUG=none Review URL: http://codereview.chromium.org/1747013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45654 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service/program_manager.cc')
-rw-r--r--gpu/command_buffer/service/program_manager.cc51
1 files changed, 29 insertions, 22 deletions
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc
index 43b0148..581a185 100644
--- a/gpu/command_buffer/service/program_manager.cc
+++ b/gpu/command_buffer/service/program_manager.cc
@@ -18,25 +18,33 @@ bool ProgramManager::IsInvalidPrefix(const char* name, size_t length) {
memcmp(name, kInvalidPrefix, sizeof(kInvalidPrefix)) == 0);
}
+void ProgramManager::ProgramInfo::Reset() {
+ valid_ = false;
+ max_uniform_name_length_ = 0;
+ max_attrib_name_length_ = 0;
+ attrib_infos_.clear();
+ uniform_infos_.clear();
+ sampler_indices_.clear();
+ location_to_index_map_.clear();
+}
+
void ProgramManager::ProgramInfo::Update() {
+ Reset();
GLint num_attribs = 0;
GLint max_len = 0;
- max_uniform_name_length_ = 0;
- max_attrib_name_length_ = 0;
- glGetProgramiv(program_id_, GL_ACTIVE_ATTRIBUTES, &num_attribs);
- glGetProgramiv(program_id_, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_len);
+ glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTES, &num_attribs);
+ glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_len);
// TODO(gman): Should we check for error?
scoped_array<char> name_buffer(new char[max_len]);
- attrib_infos_.clear();
for (GLint ii = 0; ii < num_attribs; ++ii) {
GLsizei length;
GLsizei size;
GLenum type;
glGetActiveAttrib(
- program_id_, ii, max_len, &length, &size, &type, name_buffer.get());
+ service_id_, ii, max_len, &length, &size, &type, name_buffer.get());
if (!IsInvalidPrefix(name_buffer.get(), length)) {
// TODO(gman): Should we check for error?
- GLint location = glGetAttribLocation(program_id_, name_buffer.get());
+ GLint location = glGetAttribLocation(service_id_, name_buffer.get());
attrib_infos_.push_back(
VertexAttribInfo(size, type, name_buffer.get(), location));
max_attrib_name_length_ = std::max(max_attrib_name_length_, length);
@@ -44,10 +52,8 @@ void ProgramManager::ProgramInfo::Update() {
}
GLint num_uniforms;
- glGetProgramiv(program_id_, GL_ACTIVE_UNIFORMS, &num_uniforms);
- uniform_infos_.clear();
- sampler_indices_.clear();
- glGetProgramiv(program_id_, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max_len);
+ glGetProgramiv(service_id_, GL_ACTIVE_UNIFORMS, &num_uniforms);
+ glGetProgramiv(service_id_, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max_len);
name_buffer.reset(new char[max_len]);
GLint max_location = -1;
int index = 0; // this index tracks valid uniforms.
@@ -56,10 +62,10 @@ void ProgramManager::ProgramInfo::Update() {
GLsizei size;
GLenum type;
glGetActiveUniform(
- program_id_, ii, max_len, &length, &size, &type, name_buffer.get());
+ service_id_, ii, max_len, &length, &size, &type, name_buffer.get());
// TODO(gman): Should we check for error?
if (!IsInvalidPrefix(name_buffer.get(), length)) {
- GLint location = glGetUniformLocation(program_id_, name_buffer.get());
+ GLint location = glGetUniformLocation(service_id_, name_buffer.get());
const UniformInfo* info =
AddUniformInfo(size, type, location, name_buffer.get());
for (size_t jj = 0; jj < info->element_locations.size(); ++jj) {
@@ -87,6 +93,7 @@ void ProgramManager::ProgramInfo::Update() {
location_to_index_map_[info.element_locations[jj]] = ii;
}
}
+ valid_ = true;
}
GLint ProgramManager::ProgramInfo::GetUniformLocation(
@@ -165,7 +172,7 @@ const ProgramManager::ProgramInfo::UniformInfo*
for (GLsizei ii = 1; ii < info.size; ++ii) {
std::string element_name(name + "[" + IntToString(ii) + "]");
info.element_locations[ii] =
- glGetUniformLocation(program_id_, element_name.c_str());
+ glGetUniformLocation(service_id_, element_name.c_str());
}
// Sadly there is no way to tell if this is an array except if the name
// has an array string or the size > 1. That means an array of size 1 can
@@ -222,26 +229,26 @@ void ProgramManager::ProgramInfo::GetProgramiv(GLenum pname, GLint* params) {
*params = max_uniform_name_length_;
break;
default:
- glGetProgramiv(program_id_, pname, params);
+ glGetProgramiv(service_id_, pname, params);
break;
}
}
-void ProgramManager::CreateProgramInfo(GLuint program_id) {
+void ProgramManager::CreateProgramInfo(GLuint client_id, GLuint service_id) {
std::pair<ProgramInfoMap::iterator, bool> result =
program_infos_.insert(
- std::make_pair(program_id,
- ProgramInfo::Ref(new ProgramInfo(program_id))));
+ std::make_pair(client_id,
+ ProgramInfo::Ref(new ProgramInfo(service_id))));
DCHECK(result.second);
}
-ProgramManager::ProgramInfo* ProgramManager::GetProgramInfo(GLuint program_id) {
- ProgramInfoMap::iterator it = program_infos_.find(program_id);
+ProgramManager::ProgramInfo* ProgramManager::GetProgramInfo(GLuint client_id) {
+ ProgramInfoMap::iterator it = program_infos_.find(client_id);
return it != program_infos_.end() ? it->second : NULL;
}
-void ProgramManager::RemoveProgramInfo(GLuint program_id) {
- ProgramInfoMap::iterator it = program_infos_.find(program_id);
+void ProgramManager::RemoveProgramInfo(GLuint client_id) {
+ ProgramInfoMap::iterator it = program_infos_.find(client_id);
if (it != program_infos_.end()) {
it->second->MarkAsDeleted();
program_infos_.erase(it);