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> |
11 | 11 |
12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
16 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
17 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
19 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 19 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
20 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 20 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| 21 #include "gpu/command_buffer/service/feature_info.h" |
21 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 22 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
22 #include "gpu/command_buffer/service/gpu_switches.h" | 23 #include "gpu/command_buffer/service/gpu_switches.h" |
23 #include "gpu/command_buffer/service/program_cache.h" | 24 #include "gpu/command_buffer/service/program_cache.h" |
24 #include "gpu/command_buffer/service/shader_manager.h" | 25 #include "gpu/command_buffer/service/shader_manager.h" |
25 #include "gpu/command_buffer/service/shader_translator.h" | 26 #include "gpu/command_buffer/service/shader_translator.h" |
26 #include "third_party/re2/re2/re2.h" | 27 #include "third_party/re2/re2/re2.h" |
27 | 28 |
28 using base::TimeDelta; | 29 using base::TimeDelta; |
29 using base::TimeTicks; | 30 using base::TimeTicks; |
30 | 31 |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 | 454 |
454 void Program::ExecuteBindAttribLocationCalls() { | 455 void Program::ExecuteBindAttribLocationCalls() { |
455 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); | 456 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); |
456 it != bind_attrib_location_map_.end(); ++it) { | 457 it != bind_attrib_location_map_.end(); ++it) { |
457 const std::string* mapped_name = GetAttribMappedName(it->first); | 458 const std::string* mapped_name = GetAttribMappedName(it->first); |
458 if (mapped_name && *mapped_name != it->first) | 459 if (mapped_name && *mapped_name != it->first) |
459 glBindAttribLocation(service_id_, it->second, mapped_name->c_str()); | 460 glBindAttribLocation(service_id_, it->second, mapped_name->c_str()); |
460 } | 461 } |
461 } | 462 } |
462 | 463 |
463 void ProgramManager::DoCompileShader( | 464 void ProgramManager::DoCompileShader(Shader* shader, |
464 Shader* shader, | 465 ShaderTranslator* translator, |
465 ShaderTranslator* translator, | 466 FeatureInfo* feature_info) { |
466 ProgramManager::TranslatedShaderSourceType translated_shader_source_type) { | |
467 // Translate GL ES 2.0 shader to Desktop GL shader and pass that to | 467 // Translate GL ES 2.0 shader to Desktop GL shader and pass that to |
468 // glShaderSource and then glCompileShader. | 468 // glShaderSource and then glCompileShader. |
469 const std::string* source = shader->source(); | 469 const std::string* source = shader->source(); |
470 const char* shader_src = source ? source->c_str() : ""; | 470 const char* shader_src = source ? source->c_str() : ""; |
471 if (translator) { | 471 if (translator) { |
472 if (!translator->Translate(shader_src)) { | 472 if (!translator->Translate(shader_src)) { |
473 shader->SetStatus(false, translator->info_log(), NULL); | 473 shader->SetStatus(false, translator->info_log(), NULL); |
474 return; | 474 return; |
475 } | 475 } |
476 shader_src = translator->translated_shader(); | 476 shader_src = translator->translated_shader(); |
477 if (translated_shader_source_type != kANGLE) | 477 if (!feature_info->feature_flags().angle_translated_shader_source) |
478 shader->UpdateTranslatedSource(shader_src); | 478 shader->UpdateTranslatedSource(shader_src); |
479 } | 479 } |
480 | 480 |
481 glShaderSource(shader->service_id(), 1, &shader_src, NULL); | 481 glShaderSource(shader->service_id(), 1, &shader_src, NULL); |
482 glCompileShader(shader->service_id()); | 482 glCompileShader(shader->service_id()); |
483 if (translated_shader_source_type == kANGLE) { | 483 if (feature_info->feature_flags().angle_translated_shader_source) { |
484 GLint max_len = 0; | 484 GLint max_len = 0; |
485 glGetShaderiv(shader->service_id(), | 485 glGetShaderiv(shader->service_id(), |
486 GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, | 486 GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, |
487 &max_len); | 487 &max_len); |
488 scoped_ptr<char[]> temp(new char[max_len]); | 488 scoped_ptr<char[]> temp(new char[max_len]); |
489 GLint len = 0; | 489 GLint len = 0; |
490 glGetTranslatedShaderSourceANGLE( | 490 glGetTranslatedShaderSourceANGLE( |
491 shader->service_id(), max_len, &len, temp.get()); | 491 shader->service_id(), max_len, &len, temp.get()); |
492 DCHECK(max_len == 0 || len < max_len); | 492 DCHECK(max_len == 0 || len < max_len); |
493 DCHECK(len == 0 || temp[len] == '\0'); | 493 DCHECK(len == 0 || temp[len] == '\0'); |
(...skipping 21 matching lines...) Expand all 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 FeatureInfo* feature_info, |
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 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1230 manager_->StopTracking(this); | 1231 manager_->StopTracking(this); |
1231 manager_ = NULL; | 1232 manager_ = NULL; |
1232 } | 1233 } |
1233 } | 1234 } |
1234 | 1235 |
1235 | 1236 |
1236 ProgramManager::ProgramManager(ProgramCache* program_cache, | 1237 ProgramManager::ProgramManager(ProgramCache* program_cache, |
1237 uint32 max_varying_vectors) | 1238 uint32 max_varying_vectors) |
1238 : program_count_(0), | 1239 : program_count_(0), |
1239 have_context_(true), | 1240 have_context_(true), |
| 1241 disable_workarounds_( |
| 1242 CommandLine::ForCurrentProcess()->HasSwitch( |
| 1243 switches::kDisableGpuDriverBugWorkarounds)), |
1240 program_cache_(program_cache), | 1244 program_cache_(program_cache), |
1241 max_varying_vectors_(max_varying_vectors) { } | 1245 max_varying_vectors_(max_varying_vectors) { } |
1242 | 1246 |
1243 ProgramManager::~ProgramManager() { | 1247 ProgramManager::~ProgramManager() { |
1244 DCHECK(programs_.empty()); | 1248 DCHECK(programs_.empty()); |
1245 } | 1249 } |
1246 | 1250 |
1247 void ProgramManager::Destroy(bool have_context) { | 1251 void ProgramManager::Destroy(bool have_context) { |
1248 have_context_ = have_context; | 1252 have_context_ = have_context; |
1249 programs_.clear(); | 1253 programs_.clear(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1324 DCHECK(program); | 1328 DCHECK(program); |
1325 DCHECK(IsOwned(program)); | 1329 DCHECK(IsOwned(program)); |
1326 program->MarkAsDeleted(); | 1330 program->MarkAsDeleted(); |
1327 RemoveProgramInfoIfUnused(shader_manager, program); | 1331 RemoveProgramInfoIfUnused(shader_manager, program); |
1328 } | 1332 } |
1329 | 1333 |
1330 void ProgramManager::UseProgram(Program* program) { | 1334 void ProgramManager::UseProgram(Program* program) { |
1331 DCHECK(program); | 1335 DCHECK(program); |
1332 DCHECK(IsOwned(program)); | 1336 DCHECK(IsOwned(program)); |
1333 program->IncUseCount(); | 1337 program->IncUseCount(); |
| 1338 ClearUniforms(program); |
1334 } | 1339 } |
1335 | 1340 |
1336 void ProgramManager::UnuseProgram( | 1341 void ProgramManager::UnuseProgram( |
1337 ShaderManager* shader_manager, | 1342 ShaderManager* shader_manager, |
1338 Program* program) { | 1343 Program* program) { |
1339 DCHECK(shader_manager); | 1344 DCHECK(shader_manager); |
1340 DCHECK(program); | 1345 DCHECK(program); |
1341 DCHECK(IsOwned(program)); | 1346 DCHECK(IsOwned(program)); |
1342 program->DecUseCount(); | 1347 program->DecUseCount(); |
1343 RemoveProgramInfoIfUnused(shader_manager, program); | 1348 RemoveProgramInfoIfUnused(shader_manager, program); |
1344 } | 1349 } |
1345 | 1350 |
1346 void ProgramManager::ClearUniforms(Program* program) { | 1351 void ProgramManager::ClearUniforms(Program* program) { |
1347 DCHECK(program); | 1352 DCHECK(program); |
1348 program->ClearUniforms(&zero_); | 1353 if (!disable_workarounds_) { |
| 1354 program->ClearUniforms(&zero_); |
| 1355 } |
1349 } | 1356 } |
1350 | 1357 |
1351 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { | 1358 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { |
1352 return index + element * 0x10000; | 1359 return index + element * 0x10000; |
1353 } | 1360 } |
1354 | 1361 |
1355 } // namespace gles2 | 1362 } // namespace gles2 |
1356 } // namespace gpu | 1363 } // namespace gpu |
OLD | NEW |