| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 Program::Program(ProgramManager* manager, GLuint service_id) | 204 Program::Program(ProgramManager* manager, GLuint service_id) |
| 205 : manager_(manager), | 205 : manager_(manager), |
| 206 use_count_(0), | 206 use_count_(0), |
| 207 max_attrib_name_length_(0), | 207 max_attrib_name_length_(0), |
| 208 max_uniform_name_length_(0), | 208 max_uniform_name_length_(0), |
| 209 service_id_(service_id), | 209 service_id_(service_id), |
| 210 deleted_(false), | 210 deleted_(false), |
| 211 valid_(false), | 211 valid_(false), |
| 212 link_status_(false), | 212 link_status_(false), |
| 213 uniforms_cleared_(false), | 213 uniforms_cleared_(false), |
| 214 num_uniforms_(0) { | 214 num_uniforms_(0), |
| 215 transform_feedback_buffer_mode_(GL_NONE) { |
| 215 manager_->StartTracking(this); | 216 manager_->StartTracking(this); |
| 216 } | 217 } |
| 217 | 218 |
| 218 void Program::Reset() { | 219 void Program::Reset() { |
| 219 valid_ = false; | 220 valid_ = false; |
| 220 link_status_ = false; | 221 link_status_ = false; |
| 221 num_uniforms_ = 0; | 222 num_uniforms_ = 0; |
| 222 max_uniform_name_length_ = 0; | 223 max_uniform_name_length_ = 0; |
| 223 max_attrib_name_length_ = 0; | 224 max_attrib_name_length_ = 0; |
| 224 attrib_infos_.clear(); | 225 attrib_infos_.clear(); |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 | 526 |
| 526 TimeTicks before_time = TimeTicks::Now(); | 527 TimeTicks before_time = TimeTicks::Now(); |
| 527 bool link = true; | 528 bool link = true; |
| 528 ProgramCache* cache = manager_->program_cache_; | 529 ProgramCache* cache = manager_->program_cache_; |
| 529 if (cache) { | 530 if (cache) { |
| 530 DCHECK(!attached_shaders_[0]->last_compiled_source().empty() && | 531 DCHECK(!attached_shaders_[0]->last_compiled_source().empty() && |
| 531 !attached_shaders_[1]->last_compiled_source().empty()); | 532 !attached_shaders_[1]->last_compiled_source().empty()); |
| 532 ProgramCache::LinkedProgramStatus status = cache->GetLinkedProgramStatus( | 533 ProgramCache::LinkedProgramStatus status = cache->GetLinkedProgramStatus( |
| 533 attached_shaders_[0]->last_compiled_signature(), | 534 attached_shaders_[0]->last_compiled_signature(), |
| 534 attached_shaders_[1]->last_compiled_signature(), | 535 attached_shaders_[1]->last_compiled_signature(), |
| 535 &bind_attrib_location_map_); | 536 &bind_attrib_location_map_, |
| 537 transform_feedback_varyings_, |
| 538 transform_feedback_buffer_mode_); |
| 536 | 539 |
| 537 if (status == ProgramCache::LINK_SUCCEEDED) { | 540 if (status == ProgramCache::LINK_SUCCEEDED) { |
| 538 ProgramCache::ProgramLoadResult success = | 541 ProgramCache::ProgramLoadResult success = |
| 539 cache->LoadLinkedProgram(service_id(), | 542 cache->LoadLinkedProgram(service_id(), |
| 540 attached_shaders_[0].get(), | 543 attached_shaders_[0].get(), |
| 541 attached_shaders_[1].get(), | 544 attached_shaders_[1].get(), |
| 542 &bind_attrib_location_map_, | 545 &bind_attrib_location_map_, |
| 546 transform_feedback_varyings_, |
| 547 transform_feedback_buffer_mode_, |
| 543 shader_callback); | 548 shader_callback); |
| 544 link = success != ProgramCache::PROGRAM_LOAD_SUCCESS; | 549 link = success != ProgramCache::PROGRAM_LOAD_SUCCESS; |
| 545 UMA_HISTOGRAM_BOOLEAN("GPU.ProgramCache.LoadBinarySuccess", !link); | 550 UMA_HISTOGRAM_BOOLEAN("GPU.ProgramCache.LoadBinarySuccess", !link); |
| 546 } | 551 } |
| 547 } | 552 } |
| 548 | 553 |
| 549 if (link) { | 554 if (link) { |
| 550 CompileAttachedShaders(); | 555 CompileAttachedShaders(); |
| 551 | 556 |
| 552 if (!CanLink()) { | 557 if (!CanLink()) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 GLint success = 0; | 606 GLint success = 0; |
| 602 glGetProgramiv(service_id(), GL_LINK_STATUS, &success); | 607 glGetProgramiv(service_id(), GL_LINK_STATUS, &success); |
| 603 if (success == GL_TRUE) { | 608 if (success == GL_TRUE) { |
| 604 Update(); | 609 Update(); |
| 605 if (link) { | 610 if (link) { |
| 606 if (cache) { | 611 if (cache) { |
| 607 cache->SaveLinkedProgram(service_id(), | 612 cache->SaveLinkedProgram(service_id(), |
| 608 attached_shaders_[0].get(), | 613 attached_shaders_[0].get(), |
| 609 attached_shaders_[1].get(), | 614 attached_shaders_[1].get(), |
| 610 &bind_attrib_location_map_, | 615 &bind_attrib_location_map_, |
| 616 transform_feedback_varyings_, |
| 617 transform_feedback_buffer_mode_, |
| 611 shader_callback); | 618 shader_callback); |
| 612 } | 619 } |
| 613 UMA_HISTOGRAM_CUSTOM_COUNTS( | 620 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 614 "GPU.ProgramCache.BinaryCacheMissTime", | 621 "GPU.ProgramCache.BinaryCacheMissTime", |
| 615 static_cast<base::HistogramBase::Sample>( | 622 static_cast<base::HistogramBase::Sample>( |
| 616 (TimeTicks::Now() - before_time).InMicroseconds()), | 623 (TimeTicks::Now() - before_time).InMicroseconds()), |
| 617 0, | 624 0, |
| 618 static_cast<base::HistogramBase::Sample>( | 625 static_cast<base::HistogramBase::Sample>( |
| 619 TimeDelta::FromSeconds(10).InMicroseconds()), | 626 TimeDelta::FromSeconds(10).InMicroseconds()), |
| 620 50); | 627 50); |
| (...skipping 975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1596 } | 1603 } |
| 1597 glGetActiveUniformsiv( | 1604 glGetActiveUniformsiv( |
| 1598 program, count, &indices[0], kPname[pname_index], ¶ms[0]); | 1605 program, count, &indices[0], kPname[pname_index], ¶ms[0]); |
| 1599 for (GLsizei ii = 0; ii < count; ++ii) { | 1606 for (GLsizei ii = 0; ii < count; ++ii) { |
| 1600 entries[kStride * ii + pname_index] = params[ii]; | 1607 entries[kStride * ii + pname_index] = params[ii]; |
| 1601 } | 1608 } |
| 1602 } | 1609 } |
| 1603 return true; | 1610 return true; |
| 1604 } | 1611 } |
| 1605 | 1612 |
| 1613 void Program::TransformFeedbackVaryings(GLsizei count, |
| 1614 const char* const* varyings, |
| 1615 GLenum buffer_mode) { |
| 1616 transform_feedback_varyings_.clear(); |
| 1617 for (GLsizei i = 0; i < count; ++i) { |
| 1618 transform_feedback_varyings_.push_back(std::string(varyings[i])); |
| 1619 } |
| 1620 transform_feedback_buffer_mode_ = buffer_mode; |
| 1621 } |
| 1622 |
| 1606 Program::~Program() { | 1623 Program::~Program() { |
| 1607 if (manager_) { | 1624 if (manager_) { |
| 1608 if (manager_->have_context_) { | 1625 if (manager_->have_context_) { |
| 1609 glDeleteProgram(service_id()); | 1626 glDeleteProgram(service_id()); |
| 1610 } | 1627 } |
| 1611 manager_->StopTracking(this); | 1628 manager_->StopTracking(this); |
| 1612 manager_ = NULL; | 1629 manager_ = NULL; |
| 1613 } | 1630 } |
| 1614 } | 1631 } |
| 1615 | 1632 |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1728 DCHECK(program); | 1745 DCHECK(program); |
| 1729 program->ClearUniforms(&zero_); | 1746 program->ClearUniforms(&zero_); |
| 1730 } | 1747 } |
| 1731 | 1748 |
| 1732 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { | 1749 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { |
| 1733 return index + element * 0x10000; | 1750 return index + element * 0x10000; |
| 1734 } | 1751 } |
| 1735 | 1752 |
| 1736 } // namespace gles2 | 1753 } // namespace gles2 |
| 1737 } // namespace gpu | 1754 } // namespace gpu |
| OLD | NEW |