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

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

Issue 16293004: Update gpu/ to use scoped_refptr<T>::get() rather than implicit "operator T*" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 7 years, 6 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 | Annotate | Revision Log
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 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/memory_program_cache.cc ('k') | gpu/command_buffer/service/program_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698