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> |
| 11 #include <memory> |
11 #include <set> | 12 #include <set> |
12 #include <utility> | 13 #include <utility> |
13 #include <vector> | 14 #include <vector> |
14 | 15 |
15 #include "base/command_line.h" | 16 #include "base/command_line.h" |
16 #include "base/containers/hash_tables.h" | 17 #include "base/containers/hash_tables.h" |
17 #include "base/logging.h" | 18 #include "base/logging.h" |
18 #include "base/memory/scoped_ptr.h" | |
19 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
20 #include "base/numerics/safe_math.h" | 20 #include "base/numerics/safe_math.h" |
21 #include "base/strings/string_number_conversions.h" | 21 #include "base/strings/string_number_conversions.h" |
22 #include "base/strings/string_util.h" | 22 #include "base/strings/string_util.h" |
23 #include "base/strings/stringprintf.h" | 23 #include "base/strings/stringprintf.h" |
24 #include "base/time/time.h" | 24 #include "base/time/time.h" |
25 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 25 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
26 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 26 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
27 #include "gpu/command_buffer/service/feature_info.h" | 27 #include "gpu/command_buffer/service/feature_info.h" |
28 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 28 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 return output + input.as_string(); | 313 return output + input.as_string(); |
314 } | 314 } |
315 | 315 |
316 void Program::UpdateLogInfo() { | 316 void Program::UpdateLogInfo() { |
317 GLint max_len = 0; | 317 GLint max_len = 0; |
318 glGetProgramiv(service_id_, GL_INFO_LOG_LENGTH, &max_len); | 318 glGetProgramiv(service_id_, GL_INFO_LOG_LENGTH, &max_len); |
319 if (max_len == 0) { | 319 if (max_len == 0) { |
320 set_log_info(NULL); | 320 set_log_info(NULL); |
321 return; | 321 return; |
322 } | 322 } |
323 scoped_ptr<char[]> temp(new char[max_len]); | 323 std::unique_ptr<char[]> temp(new char[max_len]); |
324 GLint len = 0; | 324 GLint len = 0; |
325 glGetProgramInfoLog(service_id_, max_len, &len, temp.get()); | 325 glGetProgramInfoLog(service_id_, max_len, &len, temp.get()); |
326 DCHECK(max_len == 0 || len < max_len); | 326 DCHECK(max_len == 0 || len < max_len); |
327 DCHECK(len == 0 || temp[len] == '\0'); | 327 DCHECK(len == 0 || temp[len] == '\0'); |
328 std::string log(temp.get(), len); | 328 std::string log(temp.get(), len); |
329 set_log_info(ProcessLogInfo(log).c_str()); | 329 set_log_info(ProcessLogInfo(log).c_str()); |
330 } | 330 } |
331 | 331 |
332 void Program::ClearUniforms(std::vector<uint8_t>* zero_buffer) { | 332 void Program::ClearUniforms(std::vector<uint8_t>* zero_buffer) { |
333 DCHECK(zero_buffer); | 333 DCHECK(zero_buffer); |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 Reset(); | 457 Reset(); |
458 UpdateLogInfo(); | 458 UpdateLogInfo(); |
459 link_status_ = true; | 459 link_status_ = true; |
460 uniforms_cleared_ = false; | 460 uniforms_cleared_ = false; |
461 GLint num_attribs = 0; | 461 GLint num_attribs = 0; |
462 GLint max_len = 0; | 462 GLint max_len = 0; |
463 GLint max_location = -1; | 463 GLint max_location = -1; |
464 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTES, &num_attribs); | 464 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTES, &num_attribs); |
465 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_len); | 465 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_len); |
466 // TODO(gman): Should we check for error? | 466 // TODO(gman): Should we check for error? |
467 scoped_ptr<char[]> name_buffer(new char[max_len]); | 467 std::unique_ptr<char[]> name_buffer(new char[max_len]); |
468 for (GLint ii = 0; ii < num_attribs; ++ii) { | 468 for (GLint ii = 0; ii < num_attribs; ++ii) { |
469 GLsizei length = 0; | 469 GLsizei length = 0; |
470 GLsizei size = 0; | 470 GLsizei size = 0; |
471 GLenum type = 0; | 471 GLenum type = 0; |
472 glGetActiveAttrib( | 472 glGetActiveAttrib( |
473 service_id_, ii, max_len, &length, &size, &type, name_buffer.get()); | 473 service_id_, ii, max_len, &length, &size, &type, name_buffer.get()); |
474 DCHECK(max_len == 0 || length < max_len); | 474 DCHECK(max_len == 0 || length < max_len); |
475 DCHECK(length == 0 || name_buffer[length] == '\0'); | 475 DCHECK(length == 0 || name_buffer[length] == '\0'); |
476 std::string original_name; | 476 std::string original_name; |
477 GetVertexAttribData(name_buffer.get(), &original_name, &type); | 477 GetVertexAttribData(name_buffer.get(), &original_name, &type); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 glGetProgramiv(service_id_, GL_ACTIVE_UNIFORMS, &num_uniforms); | 545 glGetProgramiv(service_id_, GL_ACTIVE_UNIFORMS, &num_uniforms); |
546 if (num_uniforms <= 0) | 546 if (num_uniforms <= 0) |
547 return; | 547 return; |
548 | 548 |
549 uniform_infos_.resize(num_uniforms); | 549 uniform_infos_.resize(num_uniforms); |
550 | 550 |
551 GLint name_buffer_length = 0; | 551 GLint name_buffer_length = 0; |
552 glGetProgramiv(service_id_, GL_ACTIVE_UNIFORM_MAX_LENGTH, | 552 glGetProgramiv(service_id_, GL_ACTIVE_UNIFORM_MAX_LENGTH, |
553 &name_buffer_length); | 553 &name_buffer_length); |
554 DCHECK(name_buffer_length > 0); | 554 DCHECK(name_buffer_length > 0); |
555 scoped_ptr<char[]> name_buffer(new char[name_buffer_length]); | 555 std::unique_ptr<char[]> name_buffer(new char[name_buffer_length]); |
556 | 556 |
557 size_t unused_client_location_cursor = 0; | 557 size_t unused_client_location_cursor = 0; |
558 | 558 |
559 for (GLint uniform_index = 0; uniform_index < num_uniforms; ++uniform_index) { | 559 for (GLint uniform_index = 0; uniform_index < num_uniforms; ++uniform_index) { |
560 GLsizei name_length = 0; | 560 GLsizei name_length = 0; |
561 GLsizei size = 0; | 561 GLsizei size = 0; |
562 GLenum type = GL_NONE; | 562 GLenum type = GL_NONE; |
563 glGetActiveUniform(service_id_, uniform_index, name_buffer_length, | 563 glGetActiveUniform(service_id_, uniform_index, name_buffer_length, |
564 &name_length, &size, &type, name_buffer.get()); | 564 &name_length, &size, &type, name_buffer.get()); |
565 DCHECK(name_length < name_buffer_length); | 565 DCHECK(name_length < name_buffer_length); |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 glGetProgramInterfaceiv(service_id_, GL_FRAGMENT_INPUT_NV, | 719 glGetProgramInterfaceiv(service_id_, GL_FRAGMENT_INPUT_NV, |
720 GL_ACTIVE_RESOURCES, &num_fragment_inputs); | 720 GL_ACTIVE_RESOURCES, &num_fragment_inputs); |
721 if (num_fragment_inputs <= 0) | 721 if (num_fragment_inputs <= 0) |
722 return; | 722 return; |
723 | 723 |
724 GLint max_len = 0; | 724 GLint max_len = 0; |
725 glGetProgramInterfaceiv(service_id_, GL_FRAGMENT_INPUT_NV, GL_MAX_NAME_LENGTH, | 725 glGetProgramInterfaceiv(service_id_, GL_FRAGMENT_INPUT_NV, GL_MAX_NAME_LENGTH, |
726 &max_len); | 726 &max_len); |
727 DCHECK(max_len > 0); | 727 DCHECK(max_len > 0); |
728 | 728 |
729 scoped_ptr<char[]> name_buffer(new char[max_len]); | 729 std::unique_ptr<char[]> name_buffer(new char[max_len]); |
730 | 730 |
731 Shader* fragment_shader = | 731 Shader* fragment_shader = |
732 attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get(); | 732 attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get(); |
733 | 733 |
734 const GLenum kQueryProperties[] = {GL_LOCATION, GL_TYPE, GL_ARRAY_SIZE}; | 734 const GLenum kQueryProperties[] = {GL_LOCATION, GL_TYPE, GL_ARRAY_SIZE}; |
735 | 735 |
736 std::vector<size_t> client_location_indices; | 736 std::vector<size_t> client_location_indices; |
737 for (GLint ii = 0; ii < num_fragment_inputs; ++ii) { | 737 for (GLint ii = 0; ii < num_fragment_inputs; ++ii) { |
738 GLsizei name_length = 0; | 738 GLsizei name_length = 0; |
739 glGetProgramResourceName(service_id_, GL_FRAGMENT_INPUT_NV, ii, max_len, | 739 glGetProgramResourceName(service_id_, GL_FRAGMENT_INPUT_NV, ii, max_len, |
(...skipping 1040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1780 } | 1780 } |
1781 | 1781 |
1782 ShVariableInfo var; | 1782 ShVariableInfo var; |
1783 var.type = static_cast<sh::GLenum>(key_value.second.type); | 1783 var.type = static_cast<sh::GLenum>(key_value.second.type); |
1784 var.size = std::max(1u, key_value.second.arraySize); | 1784 var.size = std::max(1u, key_value.second.arraySize); |
1785 combined_map[key_value.first] = var; | 1785 combined_map[key_value.first] = var; |
1786 } | 1786 } |
1787 | 1787 |
1788 if (combined_map.size() == 0) | 1788 if (combined_map.size() == 0) |
1789 return true; | 1789 return true; |
1790 scoped_ptr<ShVariableInfo[]> variables( | 1790 std::unique_ptr<ShVariableInfo[]> variables( |
1791 new ShVariableInfo[combined_map.size()]); | 1791 new ShVariableInfo[combined_map.size()]); |
1792 size_t index = 0; | 1792 size_t index = 0; |
1793 for (const auto& key_value : combined_map) { | 1793 for (const auto& key_value : combined_map) { |
1794 variables[index].type = key_value.second.type; | 1794 variables[index].type = key_value.second.type; |
1795 variables[index].size = key_value.second.size; | 1795 variables[index].size = key_value.second.size; |
1796 ++index; | 1796 ++index; |
1797 } | 1797 } |
1798 return ShCheckVariablesWithinPackingLimits( | 1798 return ShCheckVariablesWithinPackingLimits( |
1799 static_cast<int>(manager_->max_varying_vectors()), | 1799 static_cast<int>(manager_->max_varying_vectors()), |
1800 variables.get(), | 1800 variables.get(), |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2367 DCHECK(program); | 2367 DCHECK(program); |
2368 program->ClearUniforms(&zero_); | 2368 program->ClearUniforms(&zero_); |
2369 } | 2369 } |
2370 | 2370 |
2371 int32_t ProgramManager::MakeFakeLocation(int32_t index, int32_t element) { | 2371 int32_t ProgramManager::MakeFakeLocation(int32_t index, int32_t element) { |
2372 return index + element * 0x10000; | 2372 return index + element * 0x10000; |
2373 } | 2373 } |
2374 | 2374 |
2375 } // namespace gles2 | 2375 } // namespace gles2 |
2376 } // namespace gpu | 2376 } // namespace gpu |
OLD | NEW |