| 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/program_manager.h" | 5 #include "gpu/command_buffer/service/program_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 << "unless the driver is buggy:" | 515 << "unless the driver is buggy:" |
| 516 << "\n--original-shader--\n" << (source ? *source : std::string()) | 516 << "\n--original-shader--\n" << (source ? *source : std::string()) |
| 517 << "\n--translated-shader--\n" << shader_src << "\n--info-log--\n" | 517 << "\n--translated-shader--\n" << shader_src << "\n--info-log--\n" |
| 518 << *shader->log_info(); | 518 << *shader->log_info(); |
| 519 } | 519 } |
| 520 } | 520 } |
| 521 | 521 |
| 522 bool Program::Link(ShaderManager* manager, | 522 bool Program::Link(ShaderManager* manager, |
| 523 ShaderTranslator* vertex_translator, | 523 ShaderTranslator* vertex_translator, |
| 524 ShaderTranslator* fragment_translator, | 524 ShaderTranslator* fragment_translator, |
| 525 Program::VaryingsPackingOption varyings_packing_option, |
| 525 const ShaderCacheCallback& shader_callback) { | 526 const ShaderCacheCallback& shader_callback) { |
| 526 ClearLinkStatus(); | 527 ClearLinkStatus(); |
| 527 if (!CanLink()) { | 528 if (!CanLink()) { |
| 528 set_log_info("missing shaders"); | 529 set_log_info("missing shaders"); |
| 529 return false; | 530 return false; |
| 530 } | 531 } |
| 531 if (DetectAttribLocationBindingConflicts()) { | 532 if (DetectAttribLocationBindingConflicts()) { |
| 532 set_log_info("glBindAttribLocation() conflicts"); | 533 set_log_info("glBindAttribLocation() conflicts"); |
| 533 return false; | 534 return false; |
| 534 } | 535 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 545 "not declared in vertex shader: " + conflicting_name; | 546 "not declared in vertex shader: " + conflicting_name; |
| 546 set_log_info(ProcessLogInfo(info_log).c_str()); | 547 set_log_info(ProcessLogInfo(info_log).c_str()); |
| 547 return false; | 548 return false; |
| 548 } | 549 } |
| 549 if (DetectGlobalNameConflicts(&conflicting_name)) { | 550 if (DetectGlobalNameConflicts(&conflicting_name)) { |
| 550 std::string info_log = "Name conflicts between an uniform and an " | 551 std::string info_log = "Name conflicts between an uniform and an " |
| 551 "attribute: " + conflicting_name; | 552 "attribute: " + conflicting_name; |
| 552 set_log_info(ProcessLogInfo(info_log).c_str()); | 553 set_log_info(ProcessLogInfo(info_log).c_str()); |
| 553 return false; | 554 return false; |
| 554 } | 555 } |
| 555 if (!CheckVaryingsPacking()) { | 556 if (!CheckVaryingsPacking(varyings_packing_option)) { |
| 556 set_log_info("Varyings over maximum register limit"); | 557 set_log_info("Varyings over maximum register limit"); |
| 557 return false; | 558 return false; |
| 558 } | 559 } |
| 559 | 560 |
| 560 TimeTicks before_time = TimeTicks::HighResNow(); | 561 TimeTicks before_time = TimeTicks::HighResNow(); |
| 561 bool link = true; | 562 bool link = true; |
| 562 ProgramCache* cache = manager_->program_cache_; | 563 ProgramCache* cache = manager_->program_cache_; |
| 563 if (cache) { | 564 if (cache) { |
| 564 DCHECK(attached_shaders_[0]->signature_source() && | 565 DCHECK(attached_shaders_[0]->signature_source() && |
| 565 attached_shaders_[1]->signature_source()); | 566 attached_shaders_[1]->signature_source()); |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1090 for (int ii = 0; ii < 2; ++ii) { | 1091 for (int ii = 0; ii < 2; ++ii) { |
| 1091 if (uniforms[ii]->find(iter->first) != uniforms[ii]->end()) { | 1092 if (uniforms[ii]->find(iter->first) != uniforms[ii]->end()) { |
| 1092 *conflicting_name = iter->first; | 1093 *conflicting_name = iter->first; |
| 1093 return true; | 1094 return true; |
| 1094 } | 1095 } |
| 1095 } | 1096 } |
| 1096 } | 1097 } |
| 1097 return false; | 1098 return false; |
| 1098 } | 1099 } |
| 1099 | 1100 |
| 1100 bool Program::CheckVaryingsPacking() const { | 1101 bool Program::CheckVaryingsPacking( |
| 1102 Program::VaryingsPackingOption option) const { |
| 1101 DCHECK(attached_shaders_[0] && | 1103 DCHECK(attached_shaders_[0] && |
| 1102 attached_shaders_[0]->shader_type() == GL_VERTEX_SHADER && | 1104 attached_shaders_[0]->shader_type() == GL_VERTEX_SHADER && |
| 1103 attached_shaders_[1] && | 1105 attached_shaders_[1] && |
| 1104 attached_shaders_[1]->shader_type() == GL_FRAGMENT_SHADER); | 1106 attached_shaders_[1]->shader_type() == GL_FRAGMENT_SHADER); |
| 1105 const ShaderTranslator::VariableMap* vertex_varyings = | 1107 const ShaderTranslator::VariableMap* vertex_varyings = |
| 1106 &(attached_shaders_[0]->varying_map()); | 1108 &(attached_shaders_[0]->varying_map()); |
| 1107 const ShaderTranslator::VariableMap* fragment_varyings = | 1109 const ShaderTranslator::VariableMap* fragment_varyings = |
| 1108 &(attached_shaders_[1]->varying_map()); | 1110 &(attached_shaders_[1]->varying_map()); |
| 1109 | 1111 |
| 1110 std::map<std::string, ShVariableInfo> combined_map; | 1112 std::map<std::string, ShVariableInfo> combined_map; |
| 1111 | 1113 |
| 1112 for (ShaderTranslator::VariableMap::const_iterator iter = | 1114 for (ShaderTranslator::VariableMap::const_iterator iter = |
| 1113 fragment_varyings->begin(); | 1115 fragment_varyings->begin(); |
| 1114 iter != fragment_varyings->end(); ++iter) { | 1116 iter != fragment_varyings->end(); ++iter) { |
| 1115 if (!iter->second.static_use) | 1117 if (!iter->second.static_use && option == kCountOnlyStaticallyUsed) |
| 1116 continue; | 1118 continue; |
| 1117 if (!IsBuiltInVarying(iter->first)) { | 1119 if (!IsBuiltInVarying(iter->first)) { |
| 1118 ShaderTranslator::VariableMap::const_iterator vertex_iter = | 1120 ShaderTranslator::VariableMap::const_iterator vertex_iter = |
| 1119 vertex_varyings->find(iter->first); | 1121 vertex_varyings->find(iter->first); |
| 1120 if (vertex_iter == vertex_varyings->end() || | 1122 if (vertex_iter == vertex_varyings->end() || |
| 1121 !vertex_iter->second.static_use) | 1123 (!vertex_iter->second.static_use && |
| 1124 option == kCountOnlyStaticallyUsed)) |
| 1122 continue; | 1125 continue; |
| 1123 } | 1126 } |
| 1124 | 1127 |
| 1125 ShVariableInfo var; | 1128 ShVariableInfo var; |
| 1126 var.type = static_cast<ShDataType>(iter->second.type); | 1129 var.type = static_cast<ShDataType>(iter->second.type); |
| 1127 var.size = iter->second.size; | 1130 var.size = iter->second.size; |
| 1128 combined_map[iter->first] = var; | 1131 combined_map[iter->first] = var; |
| 1129 } | 1132 } |
| 1130 | 1133 |
| 1131 if (combined_map.size() == 0) | 1134 if (combined_map.size() == 0) |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1360 DCHECK(program); | 1363 DCHECK(program); |
| 1361 program->ClearUniforms(&zero_); | 1364 program->ClearUniforms(&zero_); |
| 1362 } | 1365 } |
| 1363 | 1366 |
| 1364 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { | 1367 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { |
| 1365 return index + element * 0x10000; | 1368 return index + element * 0x10000; |
| 1366 } | 1369 } |
| 1367 | 1370 |
| 1368 } // namespace gles2 | 1371 } // namespace gles2 |
| 1369 } // namespace gpu | 1372 } // namespace gpu |
| OLD | NEW |