Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Side by Side Diff: gpu/command_buffer/service/program_manager.cc

Issue 566023002: Clean up interfaces between Shader / ShaderTranslator / ANGLE side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/program_manager.h ('k') | gpu/command_buffer/service/program_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698