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

Side by Side Diff: gpu/command_buffer/service/program_manager.cc

Issue 6969100: Hook up shader long variable name mapping with GPU command buffer port. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/program_manager.h" 5 #include "gpu/command_buffer/service/program_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 for (GLint ii = 0; ii < num_attribs; ++ii) { 95 for (GLint ii = 0; ii < num_attribs; ++ii) {
96 GLsizei length = 0; 96 GLsizei length = 0;
97 GLsizei size = 0; 97 GLsizei size = 0;
98 GLenum type = 0; 98 GLenum type = 0;
99 glGetActiveAttrib( 99 glGetActiveAttrib(
100 service_id_, ii, max_len, &length, &size, &type, name_buffer.get()); 100 service_id_, ii, max_len, &length, &size, &type, name_buffer.get());
101 DCHECK(max_len == 0 || length < max_len); 101 DCHECK(max_len == 0 || length < max_len);
102 DCHECK(length == 0 || name_buffer[length] == '\0'); 102 DCHECK(length == 0 || name_buffer[length] == '\0');
103 if (!IsInvalidPrefix(name_buffer.get(), length)) { 103 if (!IsInvalidPrefix(name_buffer.get(), length)) {
104 std::string name; 104 std::string name;
105 GetCorrectedVariableInfo(false, name_buffer.get(), &name, &size, &type); 105 std::string original_name;
106 GetCorrectedVariableInfo(
107 false, name_buffer.get(), &name, &original_name, &size, &type);
106 // TODO(gman): Should we check for error? 108 // TODO(gman): Should we check for error?
107 GLint location = glGetAttribLocation(service_id_, name_buffer.get()); 109 GLint location = glGetAttribLocation(service_id_, name_buffer.get());
108 if (location > max_location) { 110 if (location > max_location) {
109 max_location = location; 111 max_location = location;
110 } 112 }
111 attrib_infos_.push_back(VertexAttribInfo(size, type, name, location)); 113 attrib_infos_.push_back(
112 max_attrib_name_length_ = std::max(max_attrib_name_length_, length); 114 VertexAttribInfo(size, type, original_name, location));
115 max_attrib_name_length_ = std::max(
116 max_attrib_name_length_, static_cast<GLsizei>(original_name.size()));
113 } 117 }
114 } 118 }
115 119
116 // Create attrib location to index map. 120 // Create attrib location to index map.
117 attrib_location_to_index_map_.resize(max_location + 1); 121 attrib_location_to_index_map_.resize(max_location + 1);
118 for (GLint ii = 0; ii <= max_location; ++ii) { 122 for (GLint ii = 0; ii <= max_location; ++ii) {
119 attrib_location_to_index_map_[ii] = -1; 123 attrib_location_to_index_map_[ii] = -1;
120 } 124 }
121 for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) { 125 for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) {
122 const VertexAttribInfo& info = attrib_infos_[ii]; 126 const VertexAttribInfo& info = attrib_infos_[ii];
(...skipping 12 matching lines...) Expand all
135 GLsizei size = 0; 139 GLsizei size = 0;
136 GLenum type = 0; 140 GLenum type = 0;
137 glGetActiveUniform( 141 glGetActiveUniform(
138 service_id_, ii, max_len, &length, &size, &type, name_buffer.get()); 142 service_id_, ii, max_len, &length, &size, &type, name_buffer.get());
139 DCHECK(max_len == 0 || length < max_len); 143 DCHECK(max_len == 0 || length < max_len);
140 DCHECK(length == 0 || name_buffer[length] == '\0'); 144 DCHECK(length == 0 || name_buffer[length] == '\0');
141 // TODO(gman): Should we check for error? 145 // TODO(gman): Should we check for error?
142 if (!IsInvalidPrefix(name_buffer.get(), length)) { 146 if (!IsInvalidPrefix(name_buffer.get(), length)) {
143 GLint location = glGetUniformLocation(service_id_, name_buffer.get()); 147 GLint location = glGetUniformLocation(service_id_, name_buffer.get());
144 std::string name; 148 std::string name;
145 GetCorrectedVariableInfo(true, name_buffer.get(), &name, &size, &type); 149 std::string original_name;
146 const UniformInfo* info = AddUniformInfo(size, type, location, name); 150 GetCorrectedVariableInfo(
151 true, name_buffer.get(), &name, &original_name, &size, &type);
152 const UniformInfo* info =
153 AddUniformInfo(size, type, location, name, original_name);
147 for (size_t jj = 0; jj < info->element_locations.size(); ++jj) { 154 for (size_t jj = 0; jj < info->element_locations.size(); ++jj) {
148 if (info->element_locations[jj] > max_location) { 155 if (info->element_locations[jj] > max_location) {
149 max_location = info->element_locations[jj]; 156 max_location = info->element_locations[jj];
150 } 157 }
151 } 158 }
152 if (info->IsSampler()) { 159 if (info->IsSampler()) {
153 sampler_indices_.push_back(index); 160 sampler_indices_.push_back(index);
154 } 161 }
155 max_uniform_name_length_ = 162 max_uniform_name_length_ =
156 std::max(max_uniform_name_length_, 163 std::max(max_uniform_name_length_,
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 } 264 }
258 } 265 }
259 return NULL; 266 return NULL;
260 } 267 }
261 268
262 // Note: This is only valid to call right after a program has been linked 269 // Note: This is only valid to call right after a program has been linked
263 // successfully. 270 // successfully.
264 void ProgramManager::ProgramInfo::GetCorrectedVariableInfo( 271 void ProgramManager::ProgramInfo::GetCorrectedVariableInfo(
265 bool use_uniforms, 272 bool use_uniforms,
266 const std::string& name, std::string* corrected_name, 273 const std::string& name, std::string* corrected_name,
274 std::string* original_name,
267 GLsizei* size, GLenum* type) const { 275 GLsizei* size, GLenum* type) const {
268 DCHECK(corrected_name); 276 DCHECK(corrected_name);
277 DCHECK(original_name);
269 DCHECK(size); 278 DCHECK(size);
270 DCHECK(type); 279 DCHECK(type);
271 const char* kArraySpec = "[0]"; 280 const char* kArraySpec = "[0]";
272 for (int jj = 0; jj < 2; ++jj) { 281 for (int jj = 0; jj < 2; ++jj) {
273 std::string test_name(name + ((jj == 1) ? kArraySpec : "")); 282 std::string test_name(name + ((jj == 1) ? kArraySpec : ""));
274 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { 283 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) {
275 ShaderManager::ShaderInfo* shader_info = attached_shaders_[ii].get(); 284 ShaderManager::ShaderInfo* shader_info = attached_shaders_[ii].get();
276 if (shader_info) { 285 if (shader_info) {
277 const ShaderManager::ShaderInfo::VariableInfo* variable_info = 286 const ShaderManager::ShaderInfo::VariableInfo* variable_info =
278 use_uniforms ? shader_info->GetUniformInfo(test_name) : 287 use_uniforms ? shader_info->GetUniformInfo(test_name) :
279 shader_info->GetAttribInfo(test_name); 288 shader_info->GetAttribInfo(test_name);
280 // Note: There is an assuption here that if an attrib is defined in more 289 // Note: There is an assuption here that if an attrib is defined in more
281 // than 1 attached shader their types and sizes match. Should we check 290 // than 1 attached shader their types and sizes match. Should we check
282 // for that case? 291 // for that case?
283 if (variable_info) { 292 if (variable_info) {
284 *corrected_name = test_name; 293 *corrected_name = test_name;
294 *original_name = variable_info->name;
285 *type = variable_info->type; 295 *type = variable_info->type;
286 *size = variable_info->size; 296 *size = variable_info->size;
287 return; 297 return;
288 } 298 }
289 } 299 }
290 } 300 }
291 } 301 }
292 *corrected_name = name; 302 *corrected_name = name;
303 *original_name = name;
293 } 304 }
294 305
295 const ProgramManager::ProgramInfo::UniformInfo* 306 const ProgramManager::ProgramInfo::UniformInfo*
296 ProgramManager::ProgramInfo::AddUniformInfo( 307 ProgramManager::ProgramInfo::AddUniformInfo(
297 GLsizei size, GLenum type, GLint location, const std::string& name) { 308 GLsizei size, GLenum type, GLint location, const std::string& name,
309 const std::string& original_name) {
298 const char* kArraySpec = "[0]"; 310 const char* kArraySpec = "[0]";
299 uniform_infos_.push_back(UniformInfo(size, type, name)); 311 uniform_infos_.push_back(UniformInfo(size, type, original_name));
300 UniformInfo& info = uniform_infos_.back(); 312 UniformInfo& info = uniform_infos_.back();
301 info.element_locations.resize(size); 313 info.element_locations.resize(size);
302 info.element_locations[0] = location; 314 info.element_locations[0] = location;
303 DCHECK_GE(size, 0); 315 DCHECK_GE(size, 0);
304 size_t num_texture_units = info.IsSampler() ? static_cast<size_t>(size) : 0u; 316 size_t num_texture_units = info.IsSampler() ? static_cast<size_t>(size) : 0u;
305 info.texture_units.clear(); 317 info.texture_units.clear();
306 info.texture_units.resize(num_texture_units, 0); 318 info.texture_units.resize(num_texture_units, 0);
307 319
308 if (size > 1) { 320 if (size > 1) {
309 // Sadly there is no way to tell if this is an array except if the name
310 // has an array string or the size > 1. That means an array of size 1 can
311 // be ambiguous.
312 //
313 // For now we just make sure that if the size is > 1 then the name must have
314 // an array spec.
315
316 // Go through the array element locations looking for a match. 321 // Go through the array element locations looking for a match.
317 // We can skip the first element because it's the same as the 322 // We can skip the first element because it's the same as the
318 // the location without the array operators. 323 // the location without the array operators.
319 size_t array_pos = name.rfind(kArraySpec); 324 size_t array_pos = name.rfind(kArraySpec);
320 std::string base_name = name; 325 std::string base_name = name;
321 if (name.size() > 3) { 326 if (name.size() > 3) {
322 if (array_pos != name.size() - 3) { 327 if (array_pos != name.size() - 3) {
323 info.name = name + kArraySpec; 328 info.name = name + kArraySpec;
324 } else { 329 } else {
325 base_name = name.substr(0, name.size() - 3); 330 base_name = name.substr(0, name.size() - 3);
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 DCHECK(info); 542 DCHECK(info);
538 DCHECK(IsOwned(info)); 543 DCHECK(IsOwned(info));
539 info->DecUseCount(); 544 info->DecUseCount();
540 RemoveProgramInfoIfUnused(shader_manager, info); 545 RemoveProgramInfoIfUnused(shader_manager, info);
541 } 546 }
542 547
543 } // namespace gles2 548 } // namespace gles2
544 } // namespace gpu 549 } // namespace gpu
545 550
546 551
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/program_manager.h ('k') | gpu/command_buffer/service/program_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698