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>2011-03-25 18:35:36 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-25 18:35:36 +0000
commit43c2f1f8071ddcf6ef9c4402d248e63375cda943 (patch)
treee38d7d14722630bcaa73c781c4d0d4d917cc45e6 /gpu/command_buffer/service/program_manager.cc
parentca82a57b77b455e132feaf8f010643f91af07759 (diff)
downloadchromium_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.cc42
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;
}
}