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 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 ProgramCache* cache = manager_->program_cache_; | 552 ProgramCache* cache = manager_->program_cache_; |
553 if (cache) { | 553 if (cache) { |
554 ProgramCache::LinkedProgramStatus status = cache->GetLinkedProgramStatus( | 554 ProgramCache::LinkedProgramStatus status = cache->GetLinkedProgramStatus( |
555 *attached_shaders_[0]->deferred_compilation_source(), | 555 *attached_shaders_[0]->deferred_compilation_source(), |
556 vertex_translator, | 556 vertex_translator, |
557 *attached_shaders_[1]->deferred_compilation_source(), | 557 *attached_shaders_[1]->deferred_compilation_source(), |
558 fragment_translator, | 558 fragment_translator, |
559 &bind_attrib_location_map_); | 559 &bind_attrib_location_map_); |
560 | 560 |
561 if (status == ProgramCache::LINK_SUCCEEDED) { | 561 if (status == ProgramCache::LINK_SUCCEEDED) { |
562 ProgramCache::ProgramLoadResult success = cache->LoadLinkedProgram( | 562 ProgramCache::ProgramLoadResult success = |
563 service_id(), | 563 cache->LoadLinkedProgram(service_id(), |
564 attached_shaders_[0], | 564 attached_shaders_[0].get(), |
565 vertex_translator, | 565 vertex_translator, |
566 attached_shaders_[1], | 566 attached_shaders_[1].get(), |
567 fragment_translator, | 567 fragment_translator, |
568 &bind_attrib_location_map_, | 568 &bind_attrib_location_map_, |
569 shader_callback); | 569 shader_callback); |
570 link = success != ProgramCache::PROGRAM_LOAD_SUCCESS; | 570 link = success != ProgramCache::PROGRAM_LOAD_SUCCESS; |
571 UMA_HISTOGRAM_BOOLEAN("GPU.ProgramCache.LoadBinarySuccess", !link); | 571 UMA_HISTOGRAM_BOOLEAN("GPU.ProgramCache.LoadBinarySuccess", !link); |
572 } | 572 } |
573 | 573 |
574 if (link) { | 574 if (link) { |
575 // compile our shaders if they're pending | 575 // compile our shaders if they're pending |
576 const int kShaders = Program::kMaxAttachedShaders; | 576 const int kShaders = Program::kMaxAttachedShaders; |
577 for (int i = 0; i < kShaders; ++i) { | 577 for (int i = 0; i < kShaders; ++i) { |
578 Shader* shader = attached_shaders_[i].get(); | 578 Shader* shader = attached_shaders_[i].get(); |
579 if (shader->compilation_status() == | 579 if (shader->compilation_status() == |
580 Shader::PENDING_DEFERRED_COMPILE) { | 580 Shader::PENDING_DEFERRED_COMPILE) { |
581 ShaderTranslator* translator = ShaderIndexToTranslator( | 581 ShaderTranslator* translator = ShaderIndexToTranslator( |
582 i, | 582 i, |
583 vertex_translator, | 583 vertex_translator, |
584 fragment_translator); | 584 fragment_translator); |
585 manager_->ForceCompileShader(shader->deferred_compilation_source(), | 585 manager_->ForceCompileShader(shader->deferred_compilation_source(), |
586 attached_shaders_[i], | 586 attached_shaders_[i].get(), |
587 translator, | 587 translator, |
588 feature_info); | 588 feature_info); |
589 DCHECK(shader->IsValid()); | 589 DCHECK(shader->IsValid()); |
590 } | 590 } |
591 } | 591 } |
592 } | 592 } |
593 } | 593 } |
594 | 594 |
595 if (link) { | 595 if (link) { |
596 ExecuteBindAttribLocationCalls(); | 596 ExecuteBindAttribLocationCalls(); |
597 before_time = TimeTicks::HighResNow(); | 597 before_time = TimeTicks::HighResNow(); |
598 if (cache && gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary) { | 598 if (cache && gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary) { |
599 glProgramParameteri(service_id(), | 599 glProgramParameteri(service_id(), |
600 PROGRAM_BINARY_RETRIEVABLE_HINT, | 600 PROGRAM_BINARY_RETRIEVABLE_HINT, |
601 GL_TRUE); | 601 GL_TRUE); |
602 } | 602 } |
603 glLinkProgram(service_id()); | 603 glLinkProgram(service_id()); |
604 } | 604 } |
605 | 605 |
606 GLint success = 0; | 606 GLint success = 0; |
607 glGetProgramiv(service_id(), GL_LINK_STATUS, &success); | 607 glGetProgramiv(service_id(), GL_LINK_STATUS, &success); |
608 if (success == GL_TRUE) { | 608 if (success == GL_TRUE) { |
609 Update(); | 609 Update(); |
610 if (link) { | 610 if (link) { |
611 if (cache) { | 611 if (cache) { |
612 cache->SaveLinkedProgram(service_id(), | 612 cache->SaveLinkedProgram(service_id(), |
613 attached_shaders_[0], | 613 attached_shaders_[0].get(), |
614 vertex_translator, | 614 vertex_translator, |
615 attached_shaders_[1], | 615 attached_shaders_[1].get(), |
616 fragment_translator, | 616 fragment_translator, |
617 &bind_attrib_location_map_, | 617 &bind_attrib_location_map_, |
618 shader_callback); | 618 shader_callback); |
619 } | 619 } |
620 UMA_HISTOGRAM_CUSTOM_COUNTS( | 620 UMA_HISTOGRAM_CUSTOM_COUNTS( |
621 "GPU.ProgramCache.BinaryCacheMissTime", | 621 "GPU.ProgramCache.BinaryCacheMissTime", |
622 (TimeTicks::HighResNow() - before_time).InMicroseconds(), | 622 (TimeTicks::HighResNow() - before_time).InMicroseconds(), |
623 0, | 623 0, |
624 TimeDelta::FromSeconds(10).InMicroseconds(), | 624 TimeDelta::FromSeconds(10).InMicroseconds(), |
625 50); | 625 50); |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
944 break; | 944 break; |
945 } | 945 } |
946 } | 946 } |
947 | 947 |
948 bool Program::AttachShader( | 948 bool Program::AttachShader( |
949 ShaderManager* shader_manager, | 949 ShaderManager* shader_manager, |
950 Shader* shader) { | 950 Shader* shader) { |
951 DCHECK(shader_manager); | 951 DCHECK(shader_manager); |
952 DCHECK(shader); | 952 DCHECK(shader); |
953 int index = ShaderTypeToIndex(shader->shader_type()); | 953 int index = ShaderTypeToIndex(shader->shader_type()); |
954 if (attached_shaders_[index] != NULL) { | 954 if (attached_shaders_[index].get() != NULL) { |
955 return false; | 955 return false; |
956 } | 956 } |
957 attached_shaders_[index] = scoped_refptr<Shader>(shader); | 957 attached_shaders_[index] = scoped_refptr<Shader>(shader); |
958 shader_manager->UseShader(shader); | 958 shader_manager->UseShader(shader); |
959 return true; | 959 return true; |
960 } | 960 } |
961 | 961 |
962 bool Program::DetachShader( | 962 bool Program::DetachShader( |
963 ShaderManager* shader_manager, | 963 ShaderManager* shader_manager, |
964 Shader* shader) { | 964 Shader* shader) { |
965 DCHECK(shader_manager); | 965 DCHECK(shader_manager); |
966 DCHECK(shader); | 966 DCHECK(shader); |
967 if (attached_shaders_[ShaderTypeToIndex(shader->shader_type())].get() != | 967 if (attached_shaders_[ShaderTypeToIndex(shader->shader_type())].get() != |
968 shader) { | 968 shader) { |
969 return false; | 969 return false; |
970 } | 970 } |
971 attached_shaders_[ShaderTypeToIndex(shader->shader_type())] = NULL; | 971 attached_shaders_[ShaderTypeToIndex(shader->shader_type())] = NULL; |
972 shader_manager->UnuseShader(shader); | 972 shader_manager->UnuseShader(shader); |
973 return true; | 973 return true; |
974 } | 974 } |
975 | 975 |
976 void Program::DetachShaders(ShaderManager* shader_manager) { | 976 void Program::DetachShaders(ShaderManager* shader_manager) { |
977 DCHECK(shader_manager); | 977 DCHECK(shader_manager); |
978 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { | 978 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { |
979 if (attached_shaders_[ii]) { | 979 if (attached_shaders_[ii].get()) { |
980 DetachShader(shader_manager, attached_shaders_[ii]); | 980 DetachShader(shader_manager, attached_shaders_[ii].get()); |
981 } | 981 } |
982 } | 982 } |
983 } | 983 } |
984 | 984 |
985 bool Program::CanLink() const { | 985 bool Program::CanLink() const { |
986 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { | 986 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { |
987 if (!attached_shaders_[ii] || !attached_shaders_[ii]->IsValid()) { | 987 if (!attached_shaders_[ii].get() || !attached_shaders_[ii]->IsValid()) { |
988 return false; | 988 return false; |
989 } | 989 } |
990 } | 990 } |
991 return true; | 991 return true; |
992 } | 992 } |
993 | 993 |
994 bool Program::DetectAttribLocationBindingConflicts() const { | 994 bool Program::DetectAttribLocationBindingConflicts() const { |
995 std::set<GLint> location_binding_used; | 995 std::set<GLint> location_binding_used; |
996 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); | 996 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); |
997 it != bind_attrib_location_map_.end(); ++it) { | 997 it != bind_attrib_location_map_.end(); ++it) { |
998 // Find out if an attribute is declared in this program's shaders. | 998 // Find out if an attribute is declared in this program's shaders. |
999 bool active = false; | 999 bool active = false; |
1000 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { | 1000 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { |
1001 if (!attached_shaders_[ii] || !attached_shaders_[ii]->IsValid()) | 1001 if (!attached_shaders_[ii].get() || !attached_shaders_[ii]->IsValid()) |
1002 continue; | 1002 continue; |
1003 if (attached_shaders_[ii]->GetAttribInfo(it->first)) { | 1003 if (attached_shaders_[ii]->GetAttribInfo(it->first)) { |
1004 active = true; | 1004 active = true; |
1005 break; | 1005 break; |
1006 } | 1006 } |
1007 } | 1007 } |
1008 if (active) { | 1008 if (active) { |
1009 std::pair<std::set<GLint>::iterator, bool> result = | 1009 std::pair<std::set<GLint>::iterator, bool> result = |
1010 location_binding_used.insert(it->second); | 1010 location_binding_used.insert(it->second); |
1011 if (!result.second) | 1011 if (!result.second) |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1138 } | 1138 } |
1139 | 1139 |
1140 Program* ProgramManager::CreateProgram( | 1140 Program* ProgramManager::CreateProgram( |
1141 GLuint client_id, GLuint service_id) { | 1141 GLuint client_id, GLuint service_id) { |
1142 std::pair<ProgramMap::iterator, bool> result = | 1142 std::pair<ProgramMap::iterator, bool> result = |
1143 programs_.insert( | 1143 programs_.insert( |
1144 std::make_pair(client_id, | 1144 std::make_pair(client_id, |
1145 scoped_refptr<Program>( | 1145 scoped_refptr<Program>( |
1146 new Program(this, service_id)))); | 1146 new Program(this, service_id)))); |
1147 DCHECK(result.second); | 1147 DCHECK(result.second); |
1148 return result.first->second; | 1148 return result.first->second.get(); |
1149 } | 1149 } |
1150 | 1150 |
1151 Program* ProgramManager::GetProgram(GLuint client_id) { | 1151 Program* ProgramManager::GetProgram(GLuint client_id) { |
1152 ProgramMap::iterator it = programs_.find(client_id); | 1152 ProgramMap::iterator it = programs_.find(client_id); |
1153 return it != programs_.end() ? it->second : NULL; | 1153 return it != programs_.end() ? it->second : NULL; |
1154 } | 1154 } |
1155 | 1155 |
1156 bool ProgramManager::GetClientId(GLuint service_id, GLuint* client_id) const { | 1156 bool ProgramManager::GetClientId(GLuint service_id, GLuint* client_id) const { |
1157 // This doesn't need to be fast. It's only used during slow queries. | 1157 // This doesn't need to be fast. It's only used during slow queries. |
1158 for (ProgramMap::const_iterator it = programs_.begin(); | 1158 for (ProgramMap::const_iterator it = programs_.begin(); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1230 program->ClearUniforms(&zero_); | 1230 program->ClearUniforms(&zero_); |
1231 } | 1231 } |
1232 } | 1232 } |
1233 | 1233 |
1234 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { | 1234 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { |
1235 return index + element * 0x10000; | 1235 return index + element * 0x10000; |
1236 } | 1236 } |
1237 | 1237 |
1238 } // namespace gles2 | 1238 } // namespace gles2 |
1239 } // namespace gpu | 1239 } // namespace gpu |
OLD | NEW |