OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 30 matching lines...) Expand all Loading... |
41 static const char kInvalidPrefix[] = { 'g', 'l', '_' }; | 41 static const char kInvalidPrefix[] = { 'g', 'l', '_' }; |
42 return (length >= sizeof(kInvalidPrefix) && | 42 return (length >= sizeof(kInvalidPrefix) && |
43 memcmp(name, kInvalidPrefix, sizeof(kInvalidPrefix)) == 0); | 43 memcmp(name, kInvalidPrefix, sizeof(kInvalidPrefix)) == 0); |
44 } | 44 } |
45 | 45 |
46 ProgramManager::ProgramInfo::ProgramInfo(GLuint service_id) | 46 ProgramManager::ProgramInfo::ProgramInfo(GLuint service_id) |
47 : use_count_(0), | 47 : use_count_(0), |
48 max_attrib_name_length_(0), | 48 max_attrib_name_length_(0), |
49 max_uniform_name_length_(0), | 49 max_uniform_name_length_(0), |
50 service_id_(service_id), | 50 service_id_(service_id), |
51 valid_(false) { | 51 valid_(false), |
| 52 link_status_(false) { |
52 } | 53 } |
53 | 54 |
54 void ProgramManager::ProgramInfo::Reset() { | 55 void ProgramManager::ProgramInfo::Reset() { |
55 valid_ = false; | 56 valid_ = false; |
| 57 link_status_ = false; |
56 max_uniform_name_length_ = 0; | 58 max_uniform_name_length_ = 0; |
57 max_attrib_name_length_ = 0; | 59 max_attrib_name_length_ = 0; |
58 attrib_infos_.clear(); | 60 attrib_infos_.clear(); |
59 uniform_infos_.clear(); | 61 uniform_infos_.clear(); |
60 sampler_indices_.clear(); | 62 sampler_indices_.clear(); |
61 attrib_location_to_index_map_.clear(); | 63 attrib_location_to_index_map_.clear(); |
62 uniform_location_to_index_map_.clear(); | 64 uniform_location_to_index_map_.clear(); |
63 UpdateLogInfo(); | 65 UpdateLogInfo(); |
64 } | 66 } |
65 | 67 |
66 void ProgramManager::ProgramInfo::UpdateLogInfo() { | 68 void ProgramManager::ProgramInfo::UpdateLogInfo() { |
67 GLint max_len = 0; | 69 GLint max_len = 0; |
68 glGetProgramiv(service_id_, GL_INFO_LOG_LENGTH, &max_len); | 70 glGetProgramiv(service_id_, GL_INFO_LOG_LENGTH, &max_len); |
69 scoped_array<char> temp(new char[max_len]); | 71 scoped_array<char> temp(new char[max_len]); |
70 GLint len = 0; | 72 GLint len = 0; |
71 glGetProgramInfoLog(service_id_, max_len, &len, temp.get()); | 73 glGetProgramInfoLog(service_id_, max_len, &len, temp.get()); |
72 DCHECK(max_len == 0 || len < max_len); | 74 DCHECK(max_len == 0 || len < max_len); |
73 DCHECK(len == 0 || temp[len] == '\0'); | 75 DCHECK(len == 0 || temp[len] == '\0'); |
74 set_log_info(std::string(temp.get(), len)); | 76 set_log_info(std::string(temp.get(), len)); |
75 } | 77 } |
76 | 78 |
77 void ProgramManager::ProgramInfo::Update() { | 79 void ProgramManager::ProgramInfo::Update() { |
78 Reset(); | 80 Reset(); |
| 81 link_status_ = true; |
79 GLint num_attribs = 0; | 82 GLint num_attribs = 0; |
80 GLint max_len = 0; | 83 GLint max_len = 0; |
81 GLint max_location = -1; | 84 GLint max_location = -1; |
82 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTES, &num_attribs); | 85 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTES, &num_attribs); |
83 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_len); | 86 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_len); |
84 // TODO(gman): Should we check for error? | 87 // TODO(gman): Should we check for error? |
85 scoped_array<char> name_buffer(new char[max_len]); | 88 scoped_array<char> name_buffer(new char[max_len]); |
86 for (GLint ii = 0; ii < num_attribs; ++ii) { | 89 for (GLint ii = 0; ii < num_attribs; ++ii) { |
87 GLsizei length = 0; | 90 GLsizei length = 0; |
88 GLsizei size = 0; | 91 GLsizei size = 0; |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 *params = max_attrib_name_length_ + 1; | 333 *params = max_attrib_name_length_ + 1; |
331 break; | 334 break; |
332 case GL_ACTIVE_UNIFORMS: | 335 case GL_ACTIVE_UNIFORMS: |
333 *params = uniform_infos_.size(); | 336 *params = uniform_infos_.size(); |
334 break; | 337 break; |
335 case GL_ACTIVE_UNIFORM_MAX_LENGTH: | 338 case GL_ACTIVE_UNIFORM_MAX_LENGTH: |
336 // Notice +1 to accomodate NULL terminator. | 339 // Notice +1 to accomodate NULL terminator. |
337 *params = max_uniform_name_length_ + 1; | 340 *params = max_uniform_name_length_ + 1; |
338 break; | 341 break; |
339 case GL_LINK_STATUS: | 342 case GL_LINK_STATUS: |
340 *params = valid_; | 343 *params = link_status_; |
341 break; | 344 break; |
342 case GL_INFO_LOG_LENGTH: | 345 case GL_INFO_LOG_LENGTH: |
343 // Notice +1 to accomodate NULL terminator. | 346 // Notice +1 to accomodate NULL terminator. |
344 *params = log_info_.size() + 1; | 347 *params = log_info_.size() + 1; |
345 break; | 348 break; |
346 case GL_VALIDATE_STATUS: | 349 case GL_VALIDATE_STATUS: |
347 if (!CanLink()) { | 350 if (!CanLink()) { |
348 *params = GL_FALSE; | 351 *params = GL_FALSE; |
349 } else { | 352 } else { |
350 glGetProgramiv(service_id_, pname, params); | 353 glGetProgramiv(service_id_, pname, params); |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 DCHECK(shader_manager); | 483 DCHECK(shader_manager); |
481 DCHECK(info); | 484 DCHECK(info); |
482 info->DecUseCount(); | 485 info->DecUseCount(); |
483 RemoveProgramInfoIfUnused(shader_manager, info); | 486 RemoveProgramInfoIfUnused(shader_manager, info); |
484 } | 487 } |
485 | 488 |
486 } // namespace gles2 | 489 } // namespace gles2 |
487 } // namespace gpu | 490 } // namespace gpu |
488 | 491 |
489 | 492 |
OLD | NEW |