| Index: gpu/command_buffer/service/program_manager.cc
|
| diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc
|
| index 08112967c42349360fbccfed7325bbcd605b80cc..a6825362706841d8e7f32652af34336a7de2df65 100644
|
| --- a/gpu/command_buffer/service/program_manager.cc
|
| +++ b/gpu/command_buffer/service/program_manager.cc
|
| @@ -420,7 +420,8 @@ void Program::UpdateFragmentOutputBaseTypes() {
|
| fragment_output_type_mask_ = 0u;
|
| fragment_output_written_mask_ = 0u;
|
| Shader* fragment_shader =
|
| - attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get();
|
| + shaders_from_last_successful_link_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)]
|
| + .get();
|
| DCHECK(fragment_shader);
|
| for (auto const& output : fragment_shader->output_variable_list()) {
|
| int location = output.location;
|
| @@ -502,7 +503,7 @@ void Program::UpdateTransformFeedbackInfo() {
|
| effective_transform_feedback_buffer_mode_ = transform_feedback_buffer_mode_;
|
| effective_transform_feedback_varyings_ = transform_feedback_varyings_;
|
|
|
| - Shader* vertex_shader = attached_shaders_[0].get();
|
| + Shader* vertex_shader = shaders_from_last_successful_link_[0].get();
|
| DCHECK(vertex_shader);
|
|
|
| if (effective_transform_feedback_buffer_mode_ == GL_INTERLEAVED_ATTRIBS) {
|
| @@ -826,7 +827,7 @@ void Program::UpdateUniforms() {
|
| bool is_array = false;
|
| std::string client_name;
|
| for (size_t i = 0; i < kMaxAttachedShaders && client_name.empty(); ++i) {
|
| - const auto& shader = attached_shaders_[i];
|
| + const auto& shader = shaders_from_last_successful_link_[i];
|
| if (!shader)
|
| continue;
|
| const sh::ShaderVariable* info = nullptr;
|
| @@ -977,7 +978,8 @@ void Program::UpdateFragmentInputs() {
|
| std::unique_ptr<char[]> name_buffer(new char[max_len]);
|
|
|
| Shader* fragment_shader =
|
| - attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get();
|
| + shaders_from_last_successful_link_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)]
|
| + .get();
|
|
|
| const GLenum kQueryProperties[] = {GL_LOCATION, GL_TYPE, GL_ARRAY_SIZE};
|
|
|
| @@ -1084,7 +1086,8 @@ void Program::UpdateProgramOutputs() {
|
| return;
|
|
|
| Shader* fragment_shader =
|
| - attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get();
|
| + shaders_from_last_successful_link_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)]
|
| + .get();
|
|
|
| for (auto const& output_var : fragment_shader->output_variable_list()) {
|
| const std::string& service_name = output_var.mappedName;
|
| @@ -1390,6 +1393,8 @@ bool Program::Link(ShaderManager* manager,
|
| GLint success = 0;
|
| glGetProgramiv(service_id(), GL_LINK_STATUS, &success);
|
| if (success == GL_TRUE) {
|
| + for (size_t ii = 0; ii < kMaxAttachedShaders; ++ii)
|
| + shaders_from_last_successful_link_[ii] = attached_shaders_[ii];
|
| Update();
|
| if (link) {
|
| // ANGLE updates the translated shader sources on link.
|
| @@ -1551,7 +1556,7 @@ const std::string* Program::GetOriginalNameFromHashedName(
|
|
|
| const sh::Varying* Program::GetVaryingInfo(
|
| const std::string& hashed_name) const {
|
| - for (auto shader : attached_shaders_) {
|
| + for (auto shader : shaders_from_last_successful_link_) {
|
| if (shader) {
|
| const sh::Varying* info = shader->GetVaryingInfo(hashed_name);
|
| if (info)
|
| @@ -1563,7 +1568,7 @@ const sh::Varying* Program::GetVaryingInfo(
|
|
|
| const sh::InterfaceBlock* Program::GetInterfaceBlockInfo(
|
| const std::string& hashed_name) const {
|
| - for (auto shader : attached_shaders_) {
|
| + for (auto shader : shaders_from_last_successful_link_) {
|
| if (shader) {
|
| const sh::InterfaceBlock* info =
|
| shader->GetInterfaceBlockInfo(hashed_name);
|
| @@ -1641,7 +1646,9 @@ void Program::GetVertexAttribData(
|
| const std::string& name, std::string* original_name, GLenum* type) const {
|
| DCHECK(original_name);
|
| DCHECK(type);
|
| - Shader* shader = attached_shaders_[ShaderTypeToIndex(GL_VERTEX_SHADER)].get();
|
| + Shader* shader =
|
| + shaders_from_last_successful_link_[ShaderTypeToIndex(GL_VERTEX_SHADER)]
|
| + .get();
|
| if (shader) {
|
| // Vertex attributes can not be arrays or structs (GLSL ES 3.00.4, section
|
| // 4.3.4, "Input Variables"), so the top level sh::Attribute returns the
|
|
|