| 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_cache.h" | 5 #include "gpu/command_buffer/service/program_cache.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "gpu/command_buffer/service/shader_manager.h" | 9 #include "gpu/command_buffer/service/shader_manager.h" |
| 10 | 10 |
| 11 namespace gpu { | 11 namespace gpu { |
| 12 namespace gles2 { | 12 namespace gles2 { |
| 13 | 13 |
| 14 ProgramCache::ProgramCache() {} | 14 ProgramCache::ProgramCache() {} |
| 15 ProgramCache::~ProgramCache() {} | 15 ProgramCache::~ProgramCache() {} |
| 16 | 16 |
| 17 void ProgramCache::Clear() { | 17 void ProgramCache::Clear() { |
| 18 ClearBackend(); | 18 ClearBackend(); |
| 19 link_status_.clear(); | 19 link_status_.clear(); |
| 20 } | 20 } |
| 21 | 21 |
| 22 ProgramCache::LinkedProgramStatus ProgramCache::GetLinkedProgramStatus( | 22 ProgramCache::LinkedProgramStatus ProgramCache::GetLinkedProgramStatus( |
| 23 const std::string& untranslated_a, | 23 const std::string& shader_signature_a, |
| 24 const ShaderTranslatorInterface* translator_a, | 24 const std::string& shader_signature_b, |
| 25 const std::string& untranslated_b, | |
| 26 const ShaderTranslatorInterface* translator_b, | |
| 27 const std::map<std::string, GLint>* bind_attrib_location_map) const { | 25 const std::map<std::string, GLint>* bind_attrib_location_map) const { |
| 28 char a_sha[kHashLength]; | 26 char a_sha[kHashLength]; |
| 29 char b_sha[kHashLength]; | 27 char b_sha[kHashLength]; |
| 30 ComputeShaderHash(untranslated_a, translator_a, a_sha); | 28 ComputeShaderHash(shader_signature_a, a_sha); |
| 31 ComputeShaderHash(untranslated_b, translator_b, b_sha); | 29 ComputeShaderHash(shader_signature_b, b_sha); |
| 32 | 30 |
| 33 char sha[kHashLength]; | 31 char sha[kHashLength]; |
| 34 ComputeProgramHash(a_sha, | 32 ComputeProgramHash(a_sha, |
| 35 b_sha, | 33 b_sha, |
| 36 bind_attrib_location_map, | 34 bind_attrib_location_map, |
| 37 sha); | 35 sha); |
| 38 const std::string sha_string(sha, kHashLength); | 36 const std::string sha_string(sha, kHashLength); |
| 39 | 37 |
| 40 LinkStatusMap::const_iterator found = link_status_.find(sha_string); | 38 LinkStatusMap::const_iterator found = link_status_.find(sha_string); |
| 41 if (found == link_status_.end()) { | 39 if (found == link_status_.end()) { |
| 42 return ProgramCache::LINK_UNKNOWN; | 40 return ProgramCache::LINK_UNKNOWN; |
| 43 } else { | 41 } else { |
| 44 return found->second; | 42 return found->second; |
| 45 } | 43 } |
| 46 } | 44 } |
| 47 | 45 |
| 48 void ProgramCache::LinkedProgramCacheSuccess( | 46 void ProgramCache::LinkedProgramCacheSuccess( |
| 49 const std::string& shader_a, | 47 const std::string& shader_signature_a, |
| 50 const ShaderTranslatorInterface* translator_a, | 48 const std::string& shader_signature_b, |
| 51 const std::string& shader_b, | |
| 52 const ShaderTranslatorInterface* translator_b, | |
| 53 const LocationMap* bind_attrib_location_map) { | 49 const LocationMap* bind_attrib_location_map) { |
| 54 char a_sha[kHashLength]; | 50 char a_sha[kHashLength]; |
| 55 char b_sha[kHashLength]; | 51 char b_sha[kHashLength]; |
| 56 ComputeShaderHash(shader_a, translator_a, a_sha); | 52 ComputeShaderHash(shader_signature_a, a_sha); |
| 57 ComputeShaderHash(shader_b, translator_b, b_sha); | 53 ComputeShaderHash(shader_signature_b, b_sha); |
| 58 char sha[kHashLength]; | 54 char sha[kHashLength]; |
| 59 ComputeProgramHash(a_sha, | 55 ComputeProgramHash(a_sha, |
| 60 b_sha, | 56 b_sha, |
| 61 bind_attrib_location_map, | 57 bind_attrib_location_map, |
| 62 sha); | 58 sha); |
| 63 const std::string sha_string(sha, kHashLength); | 59 const std::string sha_string(sha, kHashLength); |
| 64 | 60 |
| 65 LinkedProgramCacheSuccess(sha_string); | 61 LinkedProgramCacheSuccess(sha_string); |
| 66 } | 62 } |
| 67 | 63 |
| 68 void ProgramCache::LinkedProgramCacheSuccess(const std::string& program_hash) { | 64 void ProgramCache::LinkedProgramCacheSuccess(const std::string& program_hash) { |
| 69 link_status_[program_hash] = LINK_SUCCEEDED; | 65 link_status_[program_hash] = LINK_SUCCEEDED; |
| 70 } | 66 } |
| 71 | 67 |
| 72 void ProgramCache::ComputeShaderHash( | 68 void ProgramCache::ComputeShaderHash( |
| 73 const std::string& str, | 69 const std::string& str, |
| 74 const ShaderTranslatorInterface* translator, | |
| 75 char* result) const { | 70 char* result) const { |
| 76 std::string s(( | 71 base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(str.c_str()), |
| 77 translator ? translator->GetStringForOptionsThatWouldAffectCompilation() : | 72 str.length(), reinterpret_cast<unsigned char*>(result)); |
| 78 std::string()) + str); | |
| 79 base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(s.c_str()), | |
| 80 s.length(), reinterpret_cast<unsigned char*>(result)); | |
| 81 } | 73 } |
| 82 | 74 |
| 83 void ProgramCache::Evict(const std::string& program_hash) { | 75 void ProgramCache::Evict(const std::string& program_hash) { |
| 84 link_status_.erase(program_hash); | 76 link_status_.erase(program_hash); |
| 85 } | 77 } |
| 86 | 78 |
| 87 namespace { | 79 namespace { |
| 88 size_t CalculateMapSize(const std::map<std::string, GLint>* map) { | 80 size_t CalculateMapSize(const std::map<std::string, GLint>* map) { |
| 89 if (!map) { | 81 if (!map) { |
| 90 return 0; | 82 return 0; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 buffer[current_pos++] = static_cast<unsigned char>(value >> 8); | 119 buffer[current_pos++] = static_cast<unsigned char>(value >> 8); |
| 128 buffer[current_pos++] = static_cast<unsigned char>(value); | 120 buffer[current_pos++] = static_cast<unsigned char>(value); |
| 129 } | 121 } |
| 130 } | 122 } |
| 131 base::SHA1HashBytes(buffer.get(), | 123 base::SHA1HashBytes(buffer.get(), |
| 132 total_size, reinterpret_cast<unsigned char*>(result)); | 124 total_size, reinterpret_cast<unsigned char*>(result)); |
| 133 } | 125 } |
| 134 | 126 |
| 135 } // namespace gles2 | 127 } // namespace gles2 |
| 136 } // namespace gpu | 128 } // namespace gpu |
| OLD | NEW |