| 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 |