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 |