| 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 <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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |