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

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

Issue 2958763003: Fix a bug in shader/program relationship. (Closed)
Patch Set: comments Created 3 years, 5 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
« no previous file with comments | « gpu/command_buffer/service/program_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 for (uint32_t ii = 0; ii < vertex_input_base_type_mask_.size(); ++ii) { 413 for (uint32_t ii = 0; ii < vertex_input_base_type_mask_.size(); ++ii) {
414 vertex_input_base_type_mask_[ii] = 0u; 414 vertex_input_base_type_mask_[ii] = 0u;
415 vertex_input_active_mask_[ii] = 0u; 415 vertex_input_active_mask_[ii] = 0u;
416 } 416 }
417 } 417 }
418 418
419 void Program::UpdateFragmentOutputBaseTypes() { 419 void Program::UpdateFragmentOutputBaseTypes() {
420 fragment_output_type_mask_ = 0u; 420 fragment_output_type_mask_ = 0u;
421 fragment_output_written_mask_ = 0u; 421 fragment_output_written_mask_ = 0u;
422 Shader* fragment_shader = 422 Shader* fragment_shader =
423 attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get(); 423 shaders_from_last_successful_link_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)]
424 .get();
424 DCHECK(fragment_shader); 425 DCHECK(fragment_shader);
425 for (auto const& output : fragment_shader->output_variable_list()) { 426 for (auto const& output : fragment_shader->output_variable_list()) {
426 int location = output.location; 427 int location = output.location;
427 DCHECK(location == -1 || 428 DCHECK(location == -1 ||
428 (location >= 0 && 429 (location >= 0 &&
429 location < static_cast<int>(manager_->max_draw_buffers()))); 430 location < static_cast<int>(manager_->max_draw_buffers())));
430 if (location == -1) 431 if (location == -1)
431 location = 0; 432 location = 0;
432 if (ProgramManager::HasBuiltInPrefix(output.name)) { 433 if (ProgramManager::HasBuiltInPrefix(output.name)) {
433 if (output.name != "gl_FragColor" && output.name != "gl_FragData") 434 if (output.name != "gl_FragColor" && output.name != "gl_FragData")
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 496
496 void Program::SetUniformBlockBinding(GLuint index, GLuint binding) { 497 void Program::SetUniformBlockBinding(GLuint index, GLuint binding) {
497 DCHECK_GT(uniform_block_size_info_.size(), index); 498 DCHECK_GT(uniform_block_size_info_.size(), index);
498 uniform_block_size_info_[index].binding = binding; 499 uniform_block_size_info_[index].binding = binding;
499 } 500 }
500 501
501 void Program::UpdateTransformFeedbackInfo() { 502 void Program::UpdateTransformFeedbackInfo() {
502 effective_transform_feedback_buffer_mode_ = transform_feedback_buffer_mode_; 503 effective_transform_feedback_buffer_mode_ = transform_feedback_buffer_mode_;
503 effective_transform_feedback_varyings_ = transform_feedback_varyings_; 504 effective_transform_feedback_varyings_ = transform_feedback_varyings_;
504 505
505 Shader* vertex_shader = attached_shaders_[0].get(); 506 Shader* vertex_shader = shaders_from_last_successful_link_[0].get();
506 DCHECK(vertex_shader); 507 DCHECK(vertex_shader);
507 508
508 if (effective_transform_feedback_buffer_mode_ == GL_INTERLEAVED_ATTRIBS) { 509 if (effective_transform_feedback_buffer_mode_ == GL_INTERLEAVED_ATTRIBS) {
509 transform_feedback_data_size_per_vertex_.resize(1); 510 transform_feedback_data_size_per_vertex_.resize(1);
510 } else { 511 } else {
511 transform_feedback_data_size_per_vertex_.resize( 512 transform_feedback_data_size_per_vertex_.resize(
512 effective_transform_feedback_varyings_.size()); 513 effective_transform_feedback_varyings_.size());
513 } 514 }
514 515
515 base::CheckedNumeric<GLsizeiptr> total = 0; 516 base::CheckedNumeric<GLsizeiptr> total = 0;
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 if (!ProgramManager::HasBuiltInPrefix(service_name)) { 820 if (!ProgramManager::HasBuiltInPrefix(service_name)) {
820 service_location = 821 service_location =
821 glGetUniformLocation(service_id_, service_name.c_str()); 822 glGetUniformLocation(service_id_, service_name.c_str());
822 } 823 }
823 824
824 // Determine the client name of the uniform and whether it is an array 825 // Determine the client name of the uniform and whether it is an array
825 // or not. 826 // or not.
826 bool is_array = false; 827 bool is_array = false;
827 std::string client_name; 828 std::string client_name;
828 for (size_t i = 0; i < kMaxAttachedShaders && client_name.empty(); ++i) { 829 for (size_t i = 0; i < kMaxAttachedShaders && client_name.empty(); ++i) {
829 const auto& shader = attached_shaders_[i]; 830 const auto& shader = shaders_from_last_successful_link_[i];
830 if (!shader) 831 if (!shader)
831 continue; 832 continue;
832 const sh::ShaderVariable* info = nullptr; 833 const sh::ShaderVariable* info = nullptr;
833 const sh::Uniform* uniform = shader->GetUniformInfo(service_name); 834 const sh::Uniform* uniform = shader->GetUniformInfo(service_name);
834 if (uniform && 835 if (uniform &&
835 uniform->findInfoByMappedName(service_name, &info, &client_name)) { 836 uniform->findInfoByMappedName(service_name, &info, &client_name)) {
836 DCHECK(!client_name.empty()); 837 DCHECK(!client_name.empty());
837 is_array = info->arraySize > 0; 838 is_array = info->arraySize > 0;
838 type = info->type; 839 type = info->type;
839 size = std::max(1u, info->arraySize); 840 size = std::max(1u, info->arraySize);
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
970 return; 971 return;
971 972
972 GLint max_len = 0; 973 GLint max_len = 0;
973 glGetProgramInterfaceiv(service_id_, GL_FRAGMENT_INPUT_NV, GL_MAX_NAME_LENGTH, 974 glGetProgramInterfaceiv(service_id_, GL_FRAGMENT_INPUT_NV, GL_MAX_NAME_LENGTH,
974 &max_len); 975 &max_len);
975 DCHECK(max_len > 0); 976 DCHECK(max_len > 0);
976 977
977 std::unique_ptr<char[]> name_buffer(new char[max_len]); 978 std::unique_ptr<char[]> name_buffer(new char[max_len]);
978 979
979 Shader* fragment_shader = 980 Shader* fragment_shader =
980 attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get(); 981 shaders_from_last_successful_link_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)]
982 .get();
981 983
982 const GLenum kQueryProperties[] = {GL_LOCATION, GL_TYPE, GL_ARRAY_SIZE}; 984 const GLenum kQueryProperties[] = {GL_LOCATION, GL_TYPE, GL_ARRAY_SIZE};
983 985
984 std::vector<size_t> client_location_indices; 986 std::vector<size_t> client_location_indices;
985 for (GLint ii = 0; ii < num_fragment_inputs; ++ii) { 987 for (GLint ii = 0; ii < num_fragment_inputs; ++ii) {
986 GLsizei name_length = 0; 988 GLsizei name_length = 0;
987 glGetProgramResourceName(service_id_, GL_FRAGMENT_INPUT_NV, ii, max_len, 989 glGetProgramResourceName(service_id_, GL_FRAGMENT_INPUT_NV, ii, max_len,
988 &name_length, name_buffer.get()); 990 &name_length, name_buffer.get());
989 DCHECK(name_length < max_len); 991 DCHECK(name_length < max_len);
990 DCHECK(name_length == 0 || name_buffer[name_length] == '\0'); 992 DCHECK(name_length == 0 || name_buffer[name_length] == '\0');
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1077 &fragment_input_infos_[i]); 1079 &fragment_input_infos_[i]);
1078 } 1080 }
1079 } 1081 }
1080 1082
1081 void Program::UpdateProgramOutputs() { 1083 void Program::UpdateProgramOutputs() {
1082 if (!feature_info().gl_version_info().is_es3_capable || 1084 if (!feature_info().gl_version_info().is_es3_capable ||
1083 feature_info().disable_shader_translator()) 1085 feature_info().disable_shader_translator())
1084 return; 1086 return;
1085 1087
1086 Shader* fragment_shader = 1088 Shader* fragment_shader =
1087 attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get(); 1089 shaders_from_last_successful_link_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)]
1090 .get();
1088 1091
1089 for (auto const& output_var : fragment_shader->output_variable_list()) { 1092 for (auto const& output_var : fragment_shader->output_variable_list()) {
1090 const std::string& service_name = output_var.mappedName; 1093 const std::string& service_name = output_var.mappedName;
1091 // A fragment shader can have gl_FragColor, gl_SecondaryFragColor, etc 1094 // A fragment shader can have gl_FragColor, gl_SecondaryFragColor, etc
1092 // built-ins as its output, as well as custom varyings. We are interested 1095 // built-ins as its output, as well as custom varyings. We are interested
1093 // only in custom varyings, client is allowed to bind only them. 1096 // only in custom varyings, client is allowed to bind only them.
1094 if (ProgramManager::HasBuiltInPrefix(service_name)) 1097 if (ProgramManager::HasBuiltInPrefix(service_name))
1095 continue; 1098 continue;
1096 1099
1097 std::string client_name = output_var.name; 1100 std::string client_name = output_var.name;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 void Program::ExecuteBindAttribLocationCalls() { 1146 void Program::ExecuteBindAttribLocationCalls() {
1144 for (const auto& key_value : bind_attrib_location_map_) { 1147 for (const auto& key_value : bind_attrib_location_map_) {
1145 const std::string* mapped_name = GetAttribMappedName(key_value.first); 1148 const std::string* mapped_name = GetAttribMappedName(key_value.first);
1146 if (mapped_name) 1149 if (mapped_name)
1147 glBindAttribLocation(service_id_, key_value.second, mapped_name->c_str()); 1150 glBindAttribLocation(service_id_, key_value.second, mapped_name->c_str());
1148 } 1151 }
1149 } 1152 }
1150 1153
1151 bool Program::ExecuteTransformFeedbackVaryingsCall() { 1154 bool Program::ExecuteTransformFeedbackVaryingsCall() {
1152 if (!transform_feedback_varyings_.empty()) { 1155 if (!transform_feedback_varyings_.empty()) {
1156 // This is called before program linking, so refer to attached_shaders_.
1153 Shader* vertex_shader = attached_shaders_[0].get(); 1157 Shader* vertex_shader = attached_shaders_[0].get();
1154 if (!vertex_shader) { 1158 if (!vertex_shader) {
1155 set_log_info("TransformFeedbackVaryings: missing vertex shader"); 1159 set_log_info("TransformFeedbackVaryings: missing vertex shader");
1156 return false; 1160 return false;
1157 } 1161 }
1158 1162
1159 std::vector<const char*> mapped_names; 1163 std::vector<const char*> mapped_names;
1160 mapped_names.reserve(transform_feedback_varyings_.size()); 1164 mapped_names.reserve(transform_feedback_varyings_.size());
1161 for (StringVector::const_iterator it = 1165 for (StringVector::const_iterator it =
1162 transform_feedback_varyings_.begin(); 1166 transform_feedback_varyings_.begin();
(...skipping 14 matching lines...) Expand all
1177 } 1181 }
1178 1182
1179 return true; 1183 return true;
1180 } 1184 }
1181 1185
1182 void Program::ExecuteProgramOutputBindCalls() { 1186 void Program::ExecuteProgramOutputBindCalls() {
1183 if (feature_info().disable_shader_translator()) { 1187 if (feature_info().disable_shader_translator()) {
1184 return; 1188 return;
1185 } 1189 }
1186 1190
1191 // This is called before program linking, so refer to attached_shaders_.
1187 Shader* fragment_shader = 1192 Shader* fragment_shader =
1188 attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get(); 1193 attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get();
1189 DCHECK(fragment_shader && fragment_shader->valid()); 1194 DCHECK(fragment_shader && fragment_shader->valid());
1190 1195
1191 if (fragment_shader->shader_version() != 100) { 1196 if (fragment_shader->shader_version() != 100) {
1192 // ES SL 1.00 does not have mechanism for introducing variables that could 1197 // ES SL 1.00 does not have mechanism for introducing variables that could
1193 // be bound. This means that ES SL 1.00 binding calls would be to 1198 // be bound. This means that ES SL 1.00 binding calls would be to
1194 // non-existing variable names. Binding calls are only executed with ES SL 1199 // non-existing variable names. Binding calls are only executed with ES SL
1195 // 3.00 and higher. 1200 // 3.00 and higher.
1196 for (auto const& output_var : fragment_shader->output_variable_list()) { 1201 for (auto const& output_var : fragment_shader->output_variable_list()) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1275 ClearLinkStatus(); 1280 ClearLinkStatus();
1276 1281
1277 if (!AttachedShadersExist()) { 1282 if (!AttachedShadersExist()) {
1278 set_log_info("missing shaders"); 1283 set_log_info("missing shaders");
1279 return false; 1284 return false;
1280 } 1285 }
1281 1286
1282 TimeTicks before_time = TimeTicks::Now(); 1287 TimeTicks before_time = TimeTicks::Now();
1283 bool link = true; 1288 bool link = true;
1284 ProgramCache* cache = manager_->program_cache_; 1289 ProgramCache* cache = manager_->program_cache_;
1290 // This is called before program linking, so refer to attached_shaders_.
1285 if (cache && 1291 if (cache &&
1286 !attached_shaders_[0]->last_compiled_source().empty() && 1292 !attached_shaders_[0]->last_compiled_source().empty() &&
1287 !attached_shaders_[1]->last_compiled_source().empty()) { 1293 !attached_shaders_[1]->last_compiled_source().empty()) {
1288 ProgramCache::LinkedProgramStatus status = cache->GetLinkedProgramStatus( 1294 ProgramCache::LinkedProgramStatus status = cache->GetLinkedProgramStatus(
1289 attached_shaders_[0]->last_compiled_signature(), 1295 attached_shaders_[0]->last_compiled_signature(),
1290 attached_shaders_[1]->last_compiled_signature(), 1296 attached_shaders_[1]->last_compiled_signature(),
1291 &bind_attrib_location_map_, 1297 &bind_attrib_location_map_,
1292 transform_feedback_varyings_, 1298 transform_feedback_varyings_,
1293 transform_feedback_buffer_mode_); 1299 transform_feedback_buffer_mode_);
1294 1300
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1383 glProgramParameteri(service_id(), 1389 glProgramParameteri(service_id(),
1384 PROGRAM_BINARY_RETRIEVABLE_HINT, 1390 PROGRAM_BINARY_RETRIEVABLE_HINT,
1385 GL_TRUE); 1391 GL_TRUE);
1386 } 1392 }
1387 glLinkProgram(service_id()); 1393 glLinkProgram(service_id());
1388 } 1394 }
1389 1395
1390 GLint success = 0; 1396 GLint success = 0;
1391 glGetProgramiv(service_id(), GL_LINK_STATUS, &success); 1397 glGetProgramiv(service_id(), GL_LINK_STATUS, &success);
1392 if (success == GL_TRUE) { 1398 if (success == GL_TRUE) {
1399 for (size_t ii = 0; ii < kMaxAttachedShaders; ++ii)
1400 shaders_from_last_successful_link_[ii] = attached_shaders_[ii];
1393 Update(); 1401 Update();
1394 if (link) { 1402 if (link) {
1403 // Here it makes no difference because attached_shaders_ and
1404 // shaders_from_last_successful_link_ are still the same.
1395 // ANGLE updates the translated shader sources on link. 1405 // ANGLE updates the translated shader sources on link.
1396 for (auto shader : attached_shaders_) { 1406 for (auto shader : attached_shaders_) {
1397 shader->RefreshTranslatedShaderSource(); 1407 shader->RefreshTranslatedShaderSource();
1398 } 1408 }
1399 if (cache) { 1409 if (cache) {
1400 cache->SaveLinkedProgram( 1410 cache->SaveLinkedProgram(
1401 service_id(), attached_shaders_[0].get(), 1411 service_id(), attached_shaders_[0].get(),
1402 attached_shaders_[1].get(), &bind_attrib_location_map_, 1412 attached_shaders_[1].get(), &bind_attrib_location_map_,
1403 effective_transform_feedback_varyings_, 1413 effective_transform_feedback_varyings_,
1404 effective_transform_feedback_buffer_mode_, client); 1414 effective_transform_feedback_buffer_mode_, client);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1505 return true; 1515 return true;
1506 size_t location_index = 1516 size_t location_index =
1507 GetUniformLocationIndexFromFakeLocation(fake_location); 1517 GetUniformLocationIndexFromFakeLocation(fake_location);
1508 if (location_index >= uniform_locations_.size()) 1518 if (location_index >= uniform_locations_.size())
1509 return false; 1519 return false;
1510 return uniform_locations_[location_index].IsInactive(); 1520 return uniform_locations_[location_index].IsInactive();
1511 } 1521 }
1512 1522
1513 const std::string* Program::GetAttribMappedName( 1523 const std::string* Program::GetAttribMappedName(
1514 const std::string& original_name) const { 1524 const std::string& original_name) const {
1525 // This is called by DetectAttribLocationBindingConflicts() and
1526 // ExecuteBindAttribLocationCalls(). Both are called before program linking,
1527 // so refer to attached_shaders_.
1515 for (auto shader : attached_shaders_) { 1528 for (auto shader : attached_shaders_) {
1516 if (shader) { 1529 if (shader) {
1517 const std::string* mapped_name = 1530 const std::string* mapped_name =
1518 shader->GetAttribMappedName(original_name); 1531 shader->GetAttribMappedName(original_name);
1519 if (mapped_name) 1532 if (mapped_name)
1520 return mapped_name; 1533 return mapped_name;
1521 } 1534 }
1522 } 1535 }
1523 return nullptr; 1536 return nullptr;
1524 } 1537 }
1525 1538
1526 const std::string* Program::GetUniformMappedName( 1539 const std::string* Program::GetUniformMappedName(
1527 const std::string& original_name) const { 1540 const std::string& original_name) const {
1541 // This is called by DetectUniformLocationBindingConflicts(), which is called
1542 // before program linking, so refer to attached_shaders_.
1528 for (auto shader : attached_shaders_) { 1543 for (auto shader : attached_shaders_) {
1529 if (shader) { 1544 if (shader) {
1530 const std::string* mapped_name = 1545 const std::string* mapped_name =
1531 shader->GetUniformMappedName(original_name); 1546 shader->GetUniformMappedName(original_name);
1532 if (mapped_name) 1547 if (mapped_name)
1533 return mapped_name; 1548 return mapped_name;
1534 } 1549 }
1535 } 1550 }
1536 return nullptr; 1551 return nullptr;
1537 } 1552 }
1538 1553
1539 const std::string* Program::GetOriginalNameFromHashedName( 1554 const std::string* Program::GetOriginalNameFromHashedName(
1540 const std::string& hashed_name) const { 1555 const std::string& hashed_name) const {
1556 // This is called by ProcessLogInfo(), which could in turn be called by
1557 // UpdateLogInfo(). All these cases are either before program linking, or
1558 // right after program linking and shader attachments haven't been changed,
1559 // so refer to attached_shaders_.
1560 // TODO(zmo): The only exception is for Validate(), for which
1561 // shaders_from_last_successful_link_ should be used. This is minor issue
1562 // though, leading to log information from ValidateProgram() could end up
1563 // with hashed variable names.
1541 for (auto shader : attached_shaders_) { 1564 for (auto shader : attached_shaders_) {
1542 if (shader) { 1565 if (shader) {
1543 const std::string* original_name = 1566 const std::string* original_name =
1544 shader->GetOriginalNameFromHashedName(hashed_name); 1567 shader->GetOriginalNameFromHashedName(hashed_name);
1545 if (original_name) 1568 if (original_name)
1546 return original_name; 1569 return original_name;
1547 } 1570 }
1548 } 1571 }
1549 return nullptr; 1572 return nullptr;
1550 } 1573 }
1551 1574
1552 const sh::Varying* Program::GetVaryingInfo( 1575 const sh::Varying* Program::GetVaryingInfo(
1553 const std::string& hashed_name) const { 1576 const std::string& hashed_name) const {
1554 for (auto shader : attached_shaders_) { 1577 for (auto shader : shaders_from_last_successful_link_) {
1555 if (shader) { 1578 if (shader) {
1556 const sh::Varying* info = shader->GetVaryingInfo(hashed_name); 1579 const sh::Varying* info = shader->GetVaryingInfo(hashed_name);
1557 if (info) 1580 if (info)
1558 return info; 1581 return info;
1559 } 1582 }
1560 } 1583 }
1561 return nullptr; 1584 return nullptr;
1562 } 1585 }
1563 1586
1564 const sh::InterfaceBlock* Program::GetInterfaceBlockInfo( 1587 const sh::InterfaceBlock* Program::GetInterfaceBlockInfo(
1565 const std::string& hashed_name) const { 1588 const std::string& hashed_name) const {
1566 for (auto shader : attached_shaders_) { 1589 for (auto shader : shaders_from_last_successful_link_) {
1567 if (shader) { 1590 if (shader) {
1568 const sh::InterfaceBlock* info = 1591 const sh::InterfaceBlock* info =
1569 shader->GetInterfaceBlockInfo(hashed_name); 1592 shader->GetInterfaceBlockInfo(hashed_name);
1570 if (info) 1593 if (info)
1571 return info; 1594 return info;
1572 } 1595 }
1573 } 1596 }
1574 return nullptr; 1597 return nullptr;
1575 } 1598 }
1576 1599
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1634 bind_program_output_location_index_map_[name] = 1657 bind_program_output_location_index_map_[name] =
1635 std::make_pair(color_name, index); 1658 std::make_pair(color_name, index);
1636 bind_program_output_location_index_map_[name + "[0]"] = 1659 bind_program_output_location_index_map_[name + "[0]"] =
1637 std::make_pair(color_name, index); 1660 std::make_pair(color_name, index);
1638 } 1661 }
1639 1662
1640 void Program::GetVertexAttribData( 1663 void Program::GetVertexAttribData(
1641 const std::string& name, std::string* original_name, GLenum* type) const { 1664 const std::string& name, std::string* original_name, GLenum* type) const {
1642 DCHECK(original_name); 1665 DCHECK(original_name);
1643 DCHECK(type); 1666 DCHECK(type);
1644 Shader* shader = attached_shaders_[ShaderTypeToIndex(GL_VERTEX_SHADER)].get(); 1667 Shader* shader =
1668 shaders_from_last_successful_link_[ShaderTypeToIndex(GL_VERTEX_SHADER)]
1669 .get();
1645 if (shader) { 1670 if (shader) {
1646 // Vertex attributes can not be arrays or structs (GLSL ES 3.00.4, section 1671 // Vertex attributes can not be arrays or structs (GLSL ES 3.00.4, section
1647 // 4.3.4, "Input Variables"), so the top level sh::Attribute returns the 1672 // 4.3.4, "Input Variables"), so the top level sh::Attribute returns the
1648 // information we need. 1673 // information we need.
1649 const sh::Attribute* info = shader->GetAttribInfo(name); 1674 const sh::Attribute* info = shader->GetAttribInfo(name);
1650 if (info) { 1675 if (info) {
1651 *original_name = info->name; 1676 *original_name = info->name;
1652 *type = info->type; 1677 *type = info->type;
1653 return; 1678 return;
1654 } 1679 }
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1793 for (auto shader : attached_shaders_) { 1818 for (auto shader : attached_shaders_) {
1794 if (!shader || !shader->valid()) { 1819 if (!shader || !shader->valid()) {
1795 return false; 1820 return false;
1796 } 1821 }
1797 } 1822 }
1798 return true; 1823 return true;
1799 } 1824 }
1800 1825
1801 bool Program::DetectShaderVersionMismatch() const { 1826 bool Program::DetectShaderVersionMismatch() const {
1802 int version = Shader::kUndefinedShaderVersion; 1827 int version = Shader::kUndefinedShaderVersion;
1828 // This is called before program linking, so refer to attached_shaders_.
1803 for (auto shader : attached_shaders_) { 1829 for (auto shader : attached_shaders_) {
1804 if (shader) { 1830 if (shader) {
1805 if (version != Shader::kUndefinedShaderVersion && 1831 if (version != Shader::kUndefinedShaderVersion &&
1806 shader->shader_version() != version) { 1832 shader->shader_version() != version) {
1807 return true; 1833 return true;
1808 } 1834 }
1809 version = shader->shader_version(); 1835 version = shader->shader_version();
1810 DCHECK(version != Shader::kUndefinedShaderVersion); 1836 DCHECK(version != Shader::kUndefinedShaderVersion);
1811 } 1837 }
1812 } 1838 }
(...skipping 864 matching lines...) Expand 10 before | Expand all | Expand 10 after
2677 DCHECK(program); 2703 DCHECK(program);
2678 program->ClearUniforms(&zero_); 2704 program->ClearUniforms(&zero_);
2679 } 2705 }
2680 2706
2681 int32_t ProgramManager::MakeFakeLocation(int32_t index, int32_t element) { 2707 int32_t ProgramManager::MakeFakeLocation(int32_t index, int32_t element) {
2682 return index + element * 0x10000; 2708 return index + element * 0x10000;
2683 } 2709 }
2684 2710
2685 } // namespace gles2 2711 } // namespace gles2
2686 } // namespace gpu 2712 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/program_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698