| 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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 // Signify the shader has been compiled, whether or not it is valid | 62 // Signify the shader has been compiled, whether or not it is valid |
| 63 // is dependent on the |valid_| member variable. | 63 // is dependent on the |valid_| member variable. |
| 64 shader_state_ = kShaderStateCompiled; | 64 shader_state_ = kShaderStateCompiled; |
| 65 valid_ = false; | 65 valid_ = false; |
| 66 | 66 |
| 67 // Translate GL ES 2.0 shader to Desktop GL shader and pass that to | 67 // Translate GL ES 2.0 shader to Desktop GL shader and pass that to |
| 68 // glShaderSource and then glCompileShader. | 68 // glShaderSource and then glCompileShader. |
| 69 const char* source_for_driver = last_compiled_source_.c_str(); | 69 const char* source_for_driver = last_compiled_source_.c_str(); |
| 70 ShaderTranslatorInterface* translator = translator_.get(); | 70 ShaderTranslatorInterface* translator = translator_.get(); |
| 71 if (translator) { | 71 if (translator) { |
| 72 bool success = translator->Translate(last_compiled_source_, | 72 bool success = translator->Translate( |
| 73 &log_info_, | 73 last_compiled_source_, &log_info_, &translated_source_, |
| 74 &translated_source_, | 74 &shader_version_, &attrib_map_, &uniform_map_, &varying_map_, |
| 75 &shader_version_, | 75 &interface_block_map_, &output_variable_list_, &name_map_); |
| 76 &attrib_map_, | |
| 77 &uniform_map_, | |
| 78 &varying_map_, | |
| 79 &interface_block_map_, | |
| 80 &name_map_); | |
| 81 if (!success) { | 76 if (!success) { |
| 82 return; | 77 return; |
| 83 } | 78 } |
| 84 source_for_driver = translated_source_.c_str(); | 79 source_for_driver = translated_source_.c_str(); |
| 85 } | 80 } |
| 86 | 81 |
| 87 glShaderSource(service_id_, 1, &source_for_driver, NULL); | 82 glShaderSource(service_id_, 1, &source_for_driver, NULL); |
| 88 glCompileShader(service_id_); | 83 glCompileShader(service_id_); |
| 89 | 84 |
| 90 if (source_type_ == kANGLE) { | 85 if (source_type_ == kANGLE) { |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 | 203 |
| 209 const std::string* Shader::GetInterfaceBlockMappedName( | 204 const std::string* Shader::GetInterfaceBlockMappedName( |
| 210 const std::string& original_name) const { | 205 const std::string& original_name) const { |
| 211 for (const auto& key_value : interface_block_map_) { | 206 for (const auto& key_value : interface_block_map_) { |
| 212 if (key_value.second.name == original_name) | 207 if (key_value.second.name == original_name) |
| 213 return &(key_value.first); | 208 return &(key_value.first); |
| 214 } | 209 } |
| 215 return NULL; | 210 return NULL; |
| 216 } | 211 } |
| 217 | 212 |
| 213 const std::string* Shader::GetOutputVariableMappedName( |
| 214 const std::string& original_name) const { |
| 215 for (const auto& value : output_variable_list_) { |
| 216 if (value.name == original_name) |
| 217 return &value.mappedName; |
| 218 } |
| 219 return nullptr; |
| 220 } |
| 221 |
| 218 const std::string* Shader::GetOriginalNameFromHashedName( | 222 const std::string* Shader::GetOriginalNameFromHashedName( |
| 219 const std::string& hashed_name) const { | 223 const std::string& hashed_name) const { |
| 220 NameMap::const_iterator it = name_map_.find(hashed_name); | 224 NameMap::const_iterator it = name_map_.find(hashed_name); |
| 221 if (it != name_map_.end()) | 225 if (it != name_map_.end()) |
| 222 return &(it->second); | 226 return &(it->second); |
| 223 return NULL; | 227 return NULL; |
| 224 } | 228 } |
| 225 | 229 |
| 226 const std::string* Shader::GetMappedName( | 230 const std::string* Shader::GetMappedName( |
| 227 const std::string& original_name) const { | 231 const std::string& original_name) const { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 242 return it != varying_map_.end() ? &it->second : NULL; | 246 return it != varying_map_.end() ? &it->second : NULL; |
| 243 } | 247 } |
| 244 | 248 |
| 245 const sh::InterfaceBlock* Shader::GetInterfaceBlockInfo( | 249 const sh::InterfaceBlock* Shader::GetInterfaceBlockInfo( |
| 246 const std::string& name) const { | 250 const std::string& name) const { |
| 247 InterfaceBlockMap::const_iterator it = | 251 InterfaceBlockMap::const_iterator it = |
| 248 interface_block_map_.find(GetTopVariableName(name)); | 252 interface_block_map_.find(GetTopVariableName(name)); |
| 249 return it != interface_block_map_.end() ? &it->second : NULL; | 253 return it != interface_block_map_.end() ? &it->second : NULL; |
| 250 } | 254 } |
| 251 | 255 |
| 256 const sh::OutputVariable* Shader::GetOutputVariableInfo( |
| 257 const std::string& name) const { |
| 258 std::string mapped_name = GetTopVariableName(name); |
| 259 // Number of output variables is expected to be so low that |
| 260 // a linear search of a list should be faster than using a map. |
| 261 for (const auto& value : output_variable_list_) { |
| 262 if (value.mappedName == mapped_name) |
| 263 return &value; |
| 264 } |
| 265 return nullptr; |
| 266 } |
| 267 |
| 252 ShaderManager::ShaderManager() {} | 268 ShaderManager::ShaderManager() {} |
| 253 | 269 |
| 254 ShaderManager::~ShaderManager() { | 270 ShaderManager::~ShaderManager() { |
| 255 DCHECK(shaders_.empty()); | 271 DCHECK(shaders_.empty()); |
| 256 } | 272 } |
| 257 | 273 |
| 258 void ShaderManager::Destroy(bool have_context) { | 274 void ShaderManager::Destroy(bool have_context) { |
| 259 while (!shaders_.empty()) { | 275 while (!shaders_.empty()) { |
| 260 if (have_context) { | 276 if (have_context) { |
| 261 Shader* shader = shaders_.begin()->second.get(); | 277 Shader* shader = shaders_.begin()->second.get(); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 | 350 |
| 335 void ShaderManager::UnuseShader(Shader* shader) { | 351 void ShaderManager::UnuseShader(Shader* shader) { |
| 336 DCHECK(shader); | 352 DCHECK(shader); |
| 337 DCHECK(IsOwned(shader)); | 353 DCHECK(IsOwned(shader)); |
| 338 shader->DecUseCount(); | 354 shader->DecUseCount(); |
| 339 RemoveShader(shader); | 355 RemoveShader(shader); |
| 340 } | 356 } |
| 341 | 357 |
| 342 } // namespace gles2 | 358 } // namespace gles2 |
| 343 } // namespace gpu | 359 } // namespace gpu |
| OLD | NEW |