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

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

Issue 651543003: Disallow active attrib aliasing at shader program link time. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 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 475 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 } 486 }
487 #endif 487 #endif
488 488
489 valid_ = true; 489 valid_ = true;
490 } 490 }
491 491
492 void Program::ExecuteBindAttribLocationCalls() { 492 void Program::ExecuteBindAttribLocationCalls() {
493 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); 493 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin();
494 it != bind_attrib_location_map_.end(); ++it) { 494 it != bind_attrib_location_map_.end(); ++it) {
495 const std::string* mapped_name = GetAttribMappedName(it->first); 495 const std::string* mapped_name = GetAttribMappedName(it->first);
496 if (mapped_name && *mapped_name != it->first) 496 if (mapped_name)
Ken Russell (switch to Gerrit) 2014/10/11 03:29:03 Do you know why this test used to be there and wha
Zhenyao Mo 2014/10/11 04:30:08 It's used to be there because we do call glBindAtt
497 glBindAttribLocation(service_id_, it->second, mapped_name->c_str()); 497 glBindAttribLocation(service_id_, it->second, mapped_name->c_str());
498 } 498 }
499 } 499 }
500 500
501 bool Program::Link(ShaderManager* manager, 501 bool Program::Link(ShaderManager* manager,
502 ShaderTranslator* vertex_translator, 502 ShaderTranslator* vertex_translator,
503 ShaderTranslator* fragment_translator, 503 ShaderTranslator* fragment_translator,
504 Program::VaryingsPackingOption varyings_packing_option, 504 Program::VaryingsPackingOption varyings_packing_option,
505 const ShaderCacheCallback& shader_callback) { 505 const ShaderCacheCallback& shader_callback) {
506 ClearLinkStatus(); 506 ClearLinkStatus();
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 return ProgramManager::MakeFakeLocation( 648 return ProgramManager::MakeFakeLocation(
649 info.fake_location_base, index); 649 info.fake_location_base, index);
650 } 650 }
651 } 651 }
652 } 652 }
653 } 653 }
654 return -1; 654 return -1;
655 } 655 }
656 656
657 GLint Program::GetAttribLocation( 657 GLint Program::GetAttribLocation(
658 const std::string& name) const { 658 const std::string& original_name) const {
659 for (GLuint ii = 0; ii < attrib_infos_.size(); ++ii) { 659 for (GLuint ii = 0; ii < attrib_infos_.size(); ++ii) {
660 const VertexAttrib& info = attrib_infos_[ii]; 660 const VertexAttrib& info = attrib_infos_[ii];
661 if (info.name == name) { 661 if (info.name == original_name) {
662 return info.location; 662 return info.location;
663 } 663 }
664 } 664 }
665 return -1; 665 return -1;
666 } 666 }
667 667
668 const Program::UniformInfo* 668 const Program::UniformInfo*
669 Program::GetUniformInfoByFakeLocation( 669 Program::GetUniformInfoByFakeLocation(
670 GLint fake_location, GLint* real_location, GLint* array_index) const { 670 GLint fake_location, GLint* real_location, GLint* array_index) const {
671 DCHECK(real_location); 671 DCHECK(real_location);
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
982 return false; 982 return false;
983 } 983 }
984 } 984 }
985 return true; 985 return true;
986 } 986 }
987 987
988 bool Program::DetectAttribLocationBindingConflicts() const { 988 bool Program::DetectAttribLocationBindingConflicts() const {
989 std::set<GLint> location_binding_used; 989 std::set<GLint> location_binding_used;
990 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); 990 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin();
991 it != bind_attrib_location_map_.end(); ++it) { 991 it != bind_attrib_location_map_.end(); ++it) {
992 // Find out if an attribute is declared in this program's shaders. 992 // Find out if an attribute is statically used in this program's shaders.
993 bool active = false; 993 const sh::Attribute* attrib = NULL;
994 const std::string* mapped_name = GetAttribMappedName(it->first);
995 if (!mapped_name)
996 continue;
994 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { 997 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) {
995 if (!attached_shaders_[ii].get() || !attached_shaders_[ii]->valid()) 998 if (!attached_shaders_[ii].get() || !attached_shaders_[ii]->valid())
996 continue; 999 continue;
997 if (attached_shaders_[ii]->GetAttribInfo(it->first)) { 1000 attrib = attached_shaders_[ii]->GetAttribInfo(*mapped_name);
998 active = true; 1001 if (attrib) {
999 break; 1002 if (attrib->staticUse)
1003 break;
1004 else
1005 attrib = NULL;
1000 } 1006 }
1001 } 1007 }
1002 if (active) { 1008 if (attrib) {
1003 std::pair<std::set<GLint>::iterator, bool> result = 1009 size_t num_of_locations = 1;
1004 location_binding_used.insert(it->second); 1010 switch (attrib->type) {
1005 if (!result.second) 1011 case GL_FLOAT_MAT2:
1006 return true; 1012 num_of_locations = 2;
1013 break;
1014 case GL_FLOAT_MAT3:
1015 num_of_locations = 3;
1016 break;
1017 case GL_FLOAT_MAT4:
1018 num_of_locations = 4;
1019 break;
1020 default:
1021 break;
1022 }
1023 for (size_t ii = 0; ii < num_of_locations; ++ii) {
1024 GLint loc = it->second + ii;
1025 std::pair<std::set<GLint>::iterator, bool> result =
1026 location_binding_used.insert(loc);
1027 if (!result.second)
1028 return true;
1029 }
1007 } 1030 }
1008 } 1031 }
1009 return false; 1032 return false;
1010 } 1033 }
1011 1034
1012 bool Program::DetectUniformsMismatch(std::string* conflicting_name) const { 1035 bool Program::DetectUniformsMismatch(std::string* conflicting_name) const {
1013 typedef std::map<std::string, const sh::Uniform*> UniformPointerMap; 1036 typedef std::map<std::string, const sh::Uniform*> UniformPointerMap;
1014 UniformPointerMap uniform_pointer_map; 1037 UniformPointerMap uniform_pointer_map;
1015 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { 1038 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) {
1016 const UniformMap& shader_uniforms = attached_shaders_[ii]->uniform_map(); 1039 const UniformMap& shader_uniforms = attached_shaders_[ii]->uniform_map();
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 DCHECK(program); 1373 DCHECK(program);
1351 program->ClearUniforms(&zero_); 1374 program->ClearUniforms(&zero_);
1352 } 1375 }
1353 1376
1354 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { 1377 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) {
1355 return index + element * 0x10000; 1378 return index + element * 0x10000;
1356 } 1379 }
1357 1380
1358 } // namespace gles2 1381 } // namespace gles2
1359 } // namespace gpu 1382 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698