Chromium Code Reviews| 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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 110 "gl_FrontFacing", | 110 "gl_FrontFacing", |
| 111 "gl_PointCoord" | 111 "gl_PointCoord" |
| 112 }; | 112 }; |
| 113 for (size_t ii = 0; ii < arraysize(kBuiltInVaryings); ++ii) { | 113 for (size_t ii = 0; ii < arraysize(kBuiltInVaryings); ++ii) { |
| 114 if (name == kBuiltInVaryings[ii]) | 114 if (name == kBuiltInVaryings[ii]) |
| 115 return true; | 115 return true; |
| 116 } | 116 } |
| 117 return false; | 117 return false; |
| 118 } | 118 } |
| 119 | 119 |
| 120 bool IsGpuDriverBugWorkaroundsDisabled() { | |
| 121 return CommandLine::ForCurrentProcess()->HasSwitch( | |
| 122 switches::kDisableGpuDriverBugWorkarounds); | |
| 123 } | |
| 124 | |
| 120 } // anonymous namespace. | 125 } // anonymous namespace. |
| 121 | 126 |
| 122 Program::UniformInfo::UniformInfo() | 127 Program::UniformInfo::UniformInfo() |
| 123 : size(0), | 128 : size(0), |
| 124 type(GL_NONE), | 129 type(GL_NONE), |
| 125 fake_location_base(0), | 130 fake_location_base(0), |
| 126 is_array(false) { | 131 is_array(false) { |
| 127 } | 132 } |
| 128 | 133 |
| 129 Program::UniformInfo::UniformInfo( | 134 Program::UniformInfo::UniformInfo( |
| (...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 546 "not declared in vertex shader: " + conflicting_name; | 551 "not declared in vertex shader: " + conflicting_name; |
| 547 set_log_info(ProcessLogInfo(info_log).c_str()); | 552 set_log_info(ProcessLogInfo(info_log).c_str()); |
| 548 return false; | 553 return false; |
| 549 } | 554 } |
| 550 if (DetectGlobalNameConflicts(&conflicting_name)) { | 555 if (DetectGlobalNameConflicts(&conflicting_name)) { |
| 551 std::string info_log = "Name conflicts between an uniform and an " | 556 std::string info_log = "Name conflicts between an uniform and an " |
| 552 "attribute: " + conflicting_name; | 557 "attribute: " + conflicting_name; |
| 553 set_log_info(ProcessLogInfo(info_log).c_str()); | 558 set_log_info(ProcessLogInfo(info_log).c_str()); |
| 554 return false; | 559 return false; |
| 555 } | 560 } |
| 556 if (!CheckVaryingsPacking()) { | 561 VaryingsPackingOption option = kCountOnlyStaticallyUsed; |
| 562 if (!IsGpuDriverBugWorkaroundsDisabled() && | |
|
Ken Russell (switch to Gerrit)
2014/02/04 00:34:37
It seems unfortunate to me that the Program object
Zhenyao Mo
2014/02/06 21:54:05
Refactored, so done.
| |
| 563 feature_info && | |
| 564 feature_info->workarounds().count_all_in_varyings_packing) | |
| 565 option = kCountAll; | |
| 566 if (!CheckVaryingsPacking(option)) { | |
| 557 set_log_info("Varyings over maximum register limit"); | 567 set_log_info("Varyings over maximum register limit"); |
| 558 return false; | 568 return false; |
| 559 } | 569 } |
| 560 | 570 |
| 561 TimeTicks before_time = TimeTicks::HighResNow(); | 571 TimeTicks before_time = TimeTicks::HighResNow(); |
| 562 bool link = true; | 572 bool link = true; |
| 563 ProgramCache* cache = manager_->program_cache_; | 573 ProgramCache* cache = manager_->program_cache_; |
| 564 if (cache) { | 574 if (cache) { |
| 565 DCHECK(attached_shaders_[0]->signature_source() && | 575 DCHECK(attached_shaders_[0]->signature_source() && |
| 566 attached_shaders_[1]->signature_source()); | 576 attached_shaders_[1]->signature_source()); |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1091 for (int ii = 0; ii < 2; ++ii) { | 1101 for (int ii = 0; ii < 2; ++ii) { |
| 1092 if (uniforms[ii]->find(iter->first) != uniforms[ii]->end()) { | 1102 if (uniforms[ii]->find(iter->first) != uniforms[ii]->end()) { |
| 1093 *conflicting_name = iter->first; | 1103 *conflicting_name = iter->first; |
| 1094 return true; | 1104 return true; |
| 1095 } | 1105 } |
| 1096 } | 1106 } |
| 1097 } | 1107 } |
| 1098 return false; | 1108 return false; |
| 1099 } | 1109 } |
| 1100 | 1110 |
| 1101 bool Program::CheckVaryingsPacking() const { | 1111 bool Program::CheckVaryingsPacking( |
| 1112 Program::VaryingsPackingOption option) const { | |
| 1102 DCHECK(attached_shaders_[0] && | 1113 DCHECK(attached_shaders_[0] && |
| 1103 attached_shaders_[0]->shader_type() == GL_VERTEX_SHADER && | 1114 attached_shaders_[0]->shader_type() == GL_VERTEX_SHADER && |
| 1104 attached_shaders_[1] && | 1115 attached_shaders_[1] && |
| 1105 attached_shaders_[1]->shader_type() == GL_FRAGMENT_SHADER); | 1116 attached_shaders_[1]->shader_type() == GL_FRAGMENT_SHADER); |
| 1106 const ShaderTranslator::VariableMap* vertex_varyings = | 1117 const ShaderTranslator::VariableMap* vertex_varyings = |
| 1107 &(attached_shaders_[0]->varying_map()); | 1118 &(attached_shaders_[0]->varying_map()); |
| 1108 const ShaderTranslator::VariableMap* fragment_varyings = | 1119 const ShaderTranslator::VariableMap* fragment_varyings = |
| 1109 &(attached_shaders_[1]->varying_map()); | 1120 &(attached_shaders_[1]->varying_map()); |
| 1110 | 1121 |
| 1111 std::map<std::string, ShVariableInfo> combined_map; | 1122 std::map<std::string, ShVariableInfo> combined_map; |
| 1112 | 1123 |
| 1113 for (ShaderTranslator::VariableMap::const_iterator iter = | 1124 for (ShaderTranslator::VariableMap::const_iterator iter = |
| 1114 fragment_varyings->begin(); | 1125 fragment_varyings->begin(); |
| 1115 iter != fragment_varyings->end(); ++iter) { | 1126 iter != fragment_varyings->end(); ++iter) { |
| 1116 if (!iter->second.static_use) | 1127 if (!iter->second.static_use && option == kCountOnlyStaticallyUsed) |
| 1117 continue; | 1128 continue; |
| 1118 if (!IsBuiltInVarying(iter->first)) { | 1129 if (!IsBuiltInVarying(iter->first)) { |
| 1119 ShaderTranslator::VariableMap::const_iterator vertex_iter = | 1130 ShaderTranslator::VariableMap::const_iterator vertex_iter = |
| 1120 vertex_varyings->find(iter->first); | 1131 vertex_varyings->find(iter->first); |
| 1121 if (vertex_iter == vertex_varyings->end() || | 1132 if (vertex_iter == vertex_varyings->end() || |
| 1122 !vertex_iter->second.static_use) | 1133 (!vertex_iter->second.static_use && |
| 1134 option == kCountOnlyStaticallyUsed)) | |
| 1123 continue; | 1135 continue; |
| 1124 } | 1136 } |
| 1125 | 1137 |
| 1126 ShVariableInfo var; | 1138 ShVariableInfo var; |
| 1127 var.type = static_cast<ShDataType>(iter->second.type); | 1139 var.type = static_cast<ShDataType>(iter->second.type); |
| 1128 var.size = iter->second.size; | 1140 var.size = iter->second.size; |
| 1129 combined_map[iter->first] = var; | 1141 combined_map[iter->first] = var; |
| 1130 } | 1142 } |
| 1131 | 1143 |
| 1132 if (combined_map.size() == 0) | 1144 if (combined_map.size() == 0) |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1244 manager_->StopTracking(this); | 1256 manager_->StopTracking(this); |
| 1245 manager_ = NULL; | 1257 manager_ = NULL; |
| 1246 } | 1258 } |
| 1247 } | 1259 } |
| 1248 | 1260 |
| 1249 | 1261 |
| 1250 ProgramManager::ProgramManager(ProgramCache* program_cache, | 1262 ProgramManager::ProgramManager(ProgramCache* program_cache, |
| 1251 uint32 max_varying_vectors) | 1263 uint32 max_varying_vectors) |
| 1252 : program_count_(0), | 1264 : program_count_(0), |
| 1253 have_context_(true), | 1265 have_context_(true), |
| 1254 disable_workarounds_( | |
| 1255 CommandLine::ForCurrentProcess()->HasSwitch( | |
| 1256 switches::kDisableGpuDriverBugWorkarounds)), | |
| 1257 program_cache_(program_cache), | 1266 program_cache_(program_cache), |
| 1258 max_varying_vectors_(max_varying_vectors) { } | 1267 max_varying_vectors_(max_varying_vectors) { } |
| 1259 | 1268 |
| 1260 ProgramManager::~ProgramManager() { | 1269 ProgramManager::~ProgramManager() { |
| 1261 DCHECK(programs_.empty()); | 1270 DCHECK(programs_.empty()); |
| 1262 } | 1271 } |
| 1263 | 1272 |
| 1264 void ProgramManager::Destroy(bool have_context) { | 1273 void ProgramManager::Destroy(bool have_context) { |
| 1265 have_context_ = have_context; | 1274 have_context_ = have_context; |
| 1266 programs_.clear(); | 1275 programs_.clear(); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1356 Program* program) { | 1365 Program* program) { |
| 1357 DCHECK(shader_manager); | 1366 DCHECK(shader_manager); |
| 1358 DCHECK(program); | 1367 DCHECK(program); |
| 1359 DCHECK(IsOwned(program)); | 1368 DCHECK(IsOwned(program)); |
| 1360 program->DecUseCount(); | 1369 program->DecUseCount(); |
| 1361 RemoveProgramInfoIfUnused(shader_manager, program); | 1370 RemoveProgramInfoIfUnused(shader_manager, program); |
| 1362 } | 1371 } |
| 1363 | 1372 |
| 1364 void ProgramManager::ClearUniforms(Program* program) { | 1373 void ProgramManager::ClearUniforms(Program* program) { |
| 1365 DCHECK(program); | 1374 DCHECK(program); |
| 1366 if (!disable_workarounds_) { | 1375 if (!IsGpuDriverBugWorkaroundsDisabled()) { |
|
Ken Russell (switch to Gerrit)
2014/02/04 00:34:37
Tying together these two bug workarounds (needing
Zhenyao Mo
2014/02/06 21:54:05
A previous CL fixed the ClearUniforms workaround a
| |
| 1367 program->ClearUniforms(&zero_); | 1376 program->ClearUniforms(&zero_); |
| 1368 } | 1377 } |
| 1369 } | 1378 } |
| 1370 | 1379 |
| 1371 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { | 1380 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { |
| 1372 return index + element * 0x10000; | 1381 return index + element * 0x10000; |
| 1373 } | 1382 } |
| 1374 | 1383 |
| 1375 } // namespace gles2 | 1384 } // namespace gles2 |
| 1376 } // namespace gpu | 1385 } // namespace gpu |
| OLD | NEW |