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 |