OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/shader_manager.h" | 5 #include "gpu/command_buffer/service/shader_manager.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 &interface_block_map_, | 79 &interface_block_map_, |
80 &name_map_); | 80 &name_map_); |
81 if (!success) { | 81 if (!success) { |
82 return; | 82 return; |
83 } | 83 } |
84 source_for_driver = translated_source_.c_str(); | 84 source_for_driver = translated_source_.c_str(); |
85 } | 85 } |
86 | 86 |
87 glShaderSource(service_id_, 1, &source_for_driver, NULL); | 87 glShaderSource(service_id_, 1, &source_for_driver, NULL); |
88 glCompileShader(service_id_); | 88 glCompileShader(service_id_); |
| 89 |
89 if (source_type_ == kANGLE) { | 90 if (source_type_ == kANGLE) { |
90 GLint max_len = 0; | 91 RefreshTranslatedShaderSource(); |
91 glGetShaderiv(service_id_, | 92 source_for_driver = translated_source_.c_str(); |
92 GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, | |
93 &max_len); | |
94 source_for_driver = "\0"; | |
95 translated_source_.resize(max_len); | |
96 if (max_len) { | |
97 GLint len = 0; | |
98 glGetTranslatedShaderSourceANGLE( | |
99 service_id_, translated_source_.size(), | |
100 &len, &translated_source_.at(0)); | |
101 DCHECK(max_len == 0 || len < max_len); | |
102 DCHECK(len == 0 || translated_source_[len] == '\0'); | |
103 translated_source_.resize(len); | |
104 source_for_driver = translated_source_.c_str(); | |
105 } | |
106 } | 93 } |
107 | 94 |
108 GLint status = GL_FALSE; | 95 GLint status = GL_FALSE; |
109 glGetShaderiv(service_id_, GL_COMPILE_STATUS, &status); | 96 glGetShaderiv(service_id_, GL_COMPILE_STATUS, &status); |
110 if (status == GL_TRUE) { | 97 if (status == GL_TRUE) { |
111 valid_ = true; | 98 valid_ = true; |
112 } else { | 99 } else { |
113 valid_ = false; | 100 valid_ = false; |
114 | 101 |
115 // We cannot reach here if we are using the shader translator. | 102 // We cannot reach here if we are using the shader translator. |
(...skipping 15 matching lines...) Expand all Loading... |
131 LOG_IF(ERROR, translator) | 118 LOG_IF(ERROR, translator) |
132 << "Shader translator allowed/produced an invalid shader " | 119 << "Shader translator allowed/produced an invalid shader " |
133 << "unless the driver is buggy:" | 120 << "unless the driver is buggy:" |
134 << "\n--Log from shader translator--\n" << translator_log | 121 << "\n--Log from shader translator--\n" << translator_log |
135 << "\n--original-shader--\n" << last_compiled_source_ | 122 << "\n--original-shader--\n" << last_compiled_source_ |
136 << "\n--translated-shader--\n" << source_for_driver | 123 << "\n--translated-shader--\n" << source_for_driver |
137 << "\n--info-log--\n" << log_info_; | 124 << "\n--info-log--\n" << log_info_; |
138 } | 125 } |
139 } | 126 } |
140 | 127 |
| 128 void Shader::RefreshTranslatedShaderSource() { |
| 129 if (source_type_ == kANGLE) { |
| 130 GLint max_len = 0; |
| 131 glGetShaderiv(service_id_, GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, |
| 132 &max_len); |
| 133 translated_source_.resize(max_len); |
| 134 if (max_len) { |
| 135 GLint len = 0; |
| 136 glGetTranslatedShaderSourceANGLE(service_id_, translated_source_.size(), |
| 137 &len, &translated_source_.at(0)); |
| 138 DCHECK(max_len == 0 || len < max_len); |
| 139 DCHECK(len == 0 || translated_source_[len] == '\0'); |
| 140 translated_source_.resize(len); |
| 141 } |
| 142 } |
| 143 } |
| 144 |
141 void Shader::IncUseCount() { | 145 void Shader::IncUseCount() { |
142 ++use_count_; | 146 ++use_count_; |
143 } | 147 } |
144 | 148 |
145 void Shader::DecUseCount() { | 149 void Shader::DecUseCount() { |
146 --use_count_; | 150 --use_count_; |
147 DCHECK_GE(use_count_, 0); | 151 DCHECK_GE(use_count_, 0); |
148 if (service_id_ && use_count_ == 0 && marked_for_deletion_) { | 152 if (service_id_ && use_count_ == 0 && marked_for_deletion_) { |
149 DeleteServiceID(); | 153 DeleteServiceID(); |
150 } | 154 } |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 | 334 |
331 void ShaderManager::UnuseShader(Shader* shader) { | 335 void ShaderManager::UnuseShader(Shader* shader) { |
332 DCHECK(shader); | 336 DCHECK(shader); |
333 DCHECK(IsOwned(shader)); | 337 DCHECK(IsOwned(shader)); |
334 shader->DecUseCount(); | 338 shader->DecUseCount(); |
335 RemoveShader(shader); | 339 RemoveShader(shader); |
336 } | 340 } |
337 | 341 |
338 } // namespace gles2 | 342 } // namespace gles2 |
339 } // namespace gpu | 343 } // namespace gpu |
OLD | NEW |