diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-25 18:35:36 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-25 18:35:36 +0000 |
commit | 43c2f1f8071ddcf6ef9c4402d248e63375cda943 (patch) | |
tree | e38d7d14722630bcaa73c781c4d0d4d917cc45e6 /gpu/command_buffer/service/program_manager.cc | |
parent | ca82a57b77b455e132feaf8f010643f91af07759 (diff) | |
download | chromium_src-43c2f1f8071ddcf6ef9c4402d248e63375cda943.zip chromium_src-43c2f1f8071ddcf6ef9c4402d248e63375cda943.tar.gz chromium_src-43c2f1f8071ddcf6ef9c4402d248e63375cda943.tar.bz2 |
Make Command Buffer limit count for glUniformXXv calls.
TEST=unit tests
BUG=77233
R=zmo@chromium.org,
Review URL: http://codereview.chromium.org/6713094
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@79421 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service/program_manager.cc')
-rw-r--r-- | gpu/command_buffer/service/program_manager.cc | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc index b52c017..ed52341 100644 --- a/gpu/command_buffer/service/program_manager.cc +++ b/gpu/command_buffer/service/program_manager.cc @@ -61,7 +61,7 @@ void ProgramManager::ProgramInfo::Reset() { uniform_infos_.clear(); sampler_indices_.clear(); attrib_location_to_index_map_.clear(); - uniform_location_to_index_map_.clear(); + location_infos_.clear(); UpdateLogInfo(); } @@ -157,14 +157,14 @@ void ProgramManager::ProgramInfo::Update() { } } // Create uniform location to index map. - uniform_location_to_index_map_.resize(max_location + 1); + location_infos_.resize(max_location + 1); for (GLint ii = 0; ii <= max_location; ++ii) { - uniform_location_to_index_map_[ii] = -1; + location_infos_[ii] = LocationInfo(-1, -1); } for (size_t ii = 0; ii < uniform_infos_.size(); ++ii) { const UniformInfo& info = uniform_infos_[ii]; for (size_t jj = 0; jj < info.element_locations.size(); ++jj) { - uniform_location_to_index_map_[info.element_locations[jj]] = ii; + location_infos_[info.element_locations[jj]] = LocationInfo(ii, jj); } } valid_ = true; @@ -217,17 +217,18 @@ GLint ProgramManager::ProgramInfo::GetAttribLocation( return -1; } -bool ProgramManager::ProgramInfo::GetUniformTypeByLocation( - GLint location, GLenum* type) const { - if (location >= 0 && - static_cast<size_t>(location) < uniform_location_to_index_map_.size()) { - GLint index = uniform_location_to_index_map_[location]; - if (index >= 0) { - *type = uniform_infos_[index].type; - return true; +const ProgramManager::ProgramInfo::UniformInfo* + ProgramManager::ProgramInfo::GetUniformInfoByLocation( + GLint location, GLint* array_index) const { + DCHECK(array_index); + if (location >= 0 && static_cast<size_t>(location) < location_infos_.size()) { + const LocationInfo& info = location_infos_[location]; + if (info.uniform_index >= 0) { + *array_index = info.array_index; + return &uniform_infos_[info.uniform_index]; } } - return false; + return NULL; } // Note: This is only valid to call right after a program has been linked @@ -313,13 +314,14 @@ const ProgramManager::ProgramInfo::UniformInfo* bool ProgramManager::ProgramInfo::SetSamplers( GLint location, GLsizei count, const GLint* value) { - if (location >= 0 && - static_cast<size_t>(location) < uniform_location_to_index_map_.size()) { - GLint index = uniform_location_to_index_map_[location]; - if (index >= 0) { - UniformInfo& info = uniform_infos_[index]; - if (info.IsSampler() && count <= info.size) { - std::copy(value, value + count, info.texture_units.begin()); + if (location >= 0 && static_cast<size_t>(location) < location_infos_.size()) { + const LocationInfo& location_info = location_infos_[location]; + if (location_info.uniform_index >= 0) { + UniformInfo& info = uniform_infos_[location_info.uniform_index]; + count = std::min(info.size - location_info.array_index, count); + if (info.IsSampler() && count > 0) { + std::copy(value, value + count, + info.texture_units.begin() + location_info.array_index); return true; } } |