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 |