| 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 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 | 514 |
| 515 void Program::ExecuteBindAttribLocationCalls() { | 515 void Program::ExecuteBindAttribLocationCalls() { |
| 516 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); | 516 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); |
| 517 it != bind_attrib_location_map_.end(); ++it) { | 517 it != bind_attrib_location_map_.end(); ++it) { |
| 518 const std::string* mapped_name = GetAttribMappedName(it->first); | 518 const std::string* mapped_name = GetAttribMappedName(it->first); |
| 519 if (mapped_name && *mapped_name != it->first) | 519 if (mapped_name && *mapped_name != it->first) |
| 520 glBindAttribLocation(service_id_, it->second, mapped_name->c_str()); | 520 glBindAttribLocation(service_id_, it->second, mapped_name->c_str()); |
| 521 } | 521 } |
| 522 } | 522 } |
| 523 | 523 |
| 524 void ProgramManager::DoCompileShader( | |
| 525 Shader* shader, | |
| 526 ShaderTranslator* translator, | |
| 527 ProgramManager::TranslatedShaderSourceType translated_shader_source_type) { | |
| 528 // Translate GL ES 2.0 shader to Desktop GL shader and pass that to | |
| 529 // glShaderSource and then glCompileShader. | |
| 530 const std::string* source = shader->source(); | |
| 531 const char* shader_src = source ? source->c_str() : ""; | |
| 532 if (translator) { | |
| 533 if (!translator->Translate(shader_src)) { | |
| 534 shader->SetStatus(false, translator->info_log(), NULL); | |
| 535 return; | |
| 536 } | |
| 537 shader_src = translator->translated_shader(); | |
| 538 if (translated_shader_source_type != kANGLE) | |
| 539 shader->UpdateTranslatedSource(shader_src); | |
| 540 } | |
| 541 | |
| 542 glShaderSource(shader->service_id(), 1, &shader_src, NULL); | |
| 543 glCompileShader(shader->service_id()); | |
| 544 if (translated_shader_source_type == kANGLE) { | |
| 545 GLint max_len = 0; | |
| 546 glGetShaderiv(shader->service_id(), | |
| 547 GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, | |
| 548 &max_len); | |
| 549 scoped_ptr<char[]> temp(new char[max_len]); | |
| 550 GLint len = 0; | |
| 551 glGetTranslatedShaderSourceANGLE( | |
| 552 shader->service_id(), max_len, &len, temp.get()); | |
| 553 DCHECK(max_len == 0 || len < max_len); | |
| 554 DCHECK(len == 0 || temp[len] == '\0'); | |
| 555 shader->UpdateTranslatedSource(max_len ? temp.get() : NULL); | |
| 556 } | |
| 557 | |
| 558 GLint status = GL_FALSE; | |
| 559 glGetShaderiv(shader->service_id(), GL_COMPILE_STATUS, &status); | |
| 560 if (status) { | |
| 561 shader->SetStatus(true, "", translator); | |
| 562 } else { | |
| 563 // We cannot reach here if we are using the shader translator. | |
| 564 // All invalid shaders must be rejected by the translator. | |
| 565 // All translated shaders must compile. | |
| 566 GLint max_len = 0; | |
| 567 glGetShaderiv(shader->service_id(), GL_INFO_LOG_LENGTH, &max_len); | |
| 568 scoped_ptr<char[]> temp(new char[max_len]); | |
| 569 GLint len = 0; | |
| 570 glGetShaderInfoLog(shader->service_id(), max_len, &len, temp.get()); | |
| 571 DCHECK(max_len == 0 || len < max_len); | |
| 572 DCHECK(len == 0 || temp[len] == '\0'); | |
| 573 shader->SetStatus(false, std::string(temp.get(), len).c_str(), NULL); | |
| 574 LOG_IF(ERROR, translator) | |
| 575 << "Shader translator allowed/produced an invalid shader " | |
| 576 << "unless the driver is buggy:" | |
| 577 << "\n--original-shader--\n" << (source ? *source : std::string()) | |
| 578 << "\n--translated-shader--\n" << shader_src << "\n--info-log--\n" | |
| 579 << *shader->log_info(); | |
| 580 } | |
| 581 } | |
| 582 | |
| 583 bool Program::Link(ShaderManager* manager, | 524 bool Program::Link(ShaderManager* manager, |
| 584 ShaderTranslator* vertex_translator, | 525 ShaderTranslator* vertex_translator, |
| 585 ShaderTranslator* fragment_translator, | 526 ShaderTranslator* fragment_translator, |
| 586 Program::VaryingsPackingOption varyings_packing_option, | 527 Program::VaryingsPackingOption varyings_packing_option, |
| 587 const ShaderCacheCallback& shader_callback) { | 528 const ShaderCacheCallback& shader_callback) { |
| 588 ClearLinkStatus(); | 529 ClearLinkStatus(); |
| 589 if (!CanLink()) { | 530 if (!CanLink()) { |
| 590 set_log_info("missing shaders"); | 531 set_log_info("missing shaders"); |
| 591 return false; | 532 return false; |
| 592 } | 533 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 616 } | 557 } |
| 617 if (!CheckVaryingsPacking(varyings_packing_option)) { | 558 if (!CheckVaryingsPacking(varyings_packing_option)) { |
| 618 set_log_info("Varyings over maximum register limit"); | 559 set_log_info("Varyings over maximum register limit"); |
| 619 return false; | 560 return false; |
| 620 } | 561 } |
| 621 | 562 |
| 622 TimeTicks before_time = TimeTicks::HighResNow(); | 563 TimeTicks before_time = TimeTicks::HighResNow(); |
| 623 bool link = true; | 564 bool link = true; |
| 624 ProgramCache* cache = manager_->program_cache_; | 565 ProgramCache* cache = manager_->program_cache_; |
| 625 if (cache) { | 566 if (cache) { |
| 626 DCHECK(attached_shaders_[0]->signature_source() && | 567 DCHECK(!attached_shaders_[0]->signature_source().empty() && |
| 627 attached_shaders_[1]->signature_source()); | 568 !attached_shaders_[1]->signature_source().empty()); |
| 628 ProgramCache::LinkedProgramStatus status = cache->GetLinkedProgramStatus( | 569 ProgramCache::LinkedProgramStatus status = cache->GetLinkedProgramStatus( |
| 629 *attached_shaders_[0]->signature_source(), | 570 attached_shaders_[0]->signature_source(), |
| 630 vertex_translator, | 571 vertex_translator, |
| 631 *attached_shaders_[1]->signature_source(), | 572 attached_shaders_[1]->signature_source(), |
| 632 fragment_translator, | 573 fragment_translator, |
| 633 &bind_attrib_location_map_); | 574 &bind_attrib_location_map_); |
| 634 | 575 |
| 635 if (status == ProgramCache::LINK_SUCCEEDED) { | 576 if (status == ProgramCache::LINK_SUCCEEDED) { |
| 636 ProgramCache::ProgramLoadResult success = | 577 ProgramCache::ProgramLoadResult success = |
| 637 cache->LoadLinkedProgram(service_id(), | 578 cache->LoadLinkedProgram(service_id(), |
| 638 attached_shaders_[0].get(), | 579 attached_shaders_[0].get(), |
| 639 vertex_translator, | 580 vertex_translator, |
| 640 attached_shaders_[1].get(), | 581 attached_shaders_[1].get(), |
| 641 fragment_translator, | 582 fragment_translator, |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1034 DCHECK(shader_manager); | 975 DCHECK(shader_manager); |
| 1035 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { | 976 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { |
| 1036 if (attached_shaders_[ii].get()) { | 977 if (attached_shaders_[ii].get()) { |
| 1037 DetachShader(shader_manager, attached_shaders_[ii].get()); | 978 DetachShader(shader_manager, attached_shaders_[ii].get()); |
| 1038 } | 979 } |
| 1039 } | 980 } |
| 1040 } | 981 } |
| 1041 | 982 |
| 1042 bool Program::CanLink() const { | 983 bool Program::CanLink() const { |
| 1043 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { | 984 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { |
| 1044 if (!attached_shaders_[ii].get() || !attached_shaders_[ii]->IsValid()) { | 985 if (!attached_shaders_[ii].get() || !attached_shaders_[ii]->valid()) { |
| 1045 return false; | 986 return false; |
| 1046 } | 987 } |
| 1047 } | 988 } |
| 1048 return true; | 989 return true; |
| 1049 } | 990 } |
| 1050 | 991 |
| 1051 bool Program::DetectAttribLocationBindingConflicts() const { | 992 bool Program::DetectAttribLocationBindingConflicts() const { |
| 1052 std::set<GLint> location_binding_used; | 993 std::set<GLint> location_binding_used; |
| 1053 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); | 994 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); |
| 1054 it != bind_attrib_location_map_.end(); ++it) { | 995 it != bind_attrib_location_map_.end(); ++it) { |
| 1055 // Find out if an attribute is declared in this program's shaders. | 996 // Find out if an attribute is declared in this program's shaders. |
| 1056 bool active = false; | 997 bool active = false; |
| 1057 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { | 998 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { |
| 1058 if (!attached_shaders_[ii].get() || !attached_shaders_[ii]->IsValid()) | 999 if (!attached_shaders_[ii].get() || !attached_shaders_[ii]->valid()) |
| 1059 continue; | 1000 continue; |
| 1060 if (attached_shaders_[ii]->GetAttribInfo(it->first)) { | 1001 if (attached_shaders_[ii]->GetAttribInfo(it->first)) { |
| 1061 active = true; | 1002 active = true; |
| 1062 break; | 1003 break; |
| 1063 } | 1004 } |
| 1064 } | 1005 } |
| 1065 if (active) { | 1006 if (active) { |
| 1066 std::pair<std::set<GLint>::iterator, bool> result = | 1007 std::pair<std::set<GLint>::iterator, bool> result = |
| 1067 location_binding_used.insert(it->second); | 1008 location_binding_used.insert(it->second); |
| 1068 if (!result.second) | 1009 if (!result.second) |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1424 DCHECK(program); | 1365 DCHECK(program); |
| 1425 program->ClearUniforms(&zero_); | 1366 program->ClearUniforms(&zero_); |
| 1426 } | 1367 } |
| 1427 | 1368 |
| 1428 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { | 1369 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { |
| 1429 return index + element * 0x10000; | 1370 return index + element * 0x10000; |
| 1430 } | 1371 } |
| 1431 | 1372 |
| 1432 } // namespace gles2 | 1373 } // namespace gles2 |
| 1433 } // namespace gpu | 1374 } // namespace gpu |
| OLD | NEW |