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 "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "gpu/command_buffer/service/mocks.h" | 8 #include "gpu/command_buffer/service/mocks.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
10 | 10 |
11 using ::testing::Return; | 11 using ::testing::Return; |
12 | 12 |
13 namespace gpu { | 13 namespace gpu { |
14 namespace gles2 { | 14 namespace gles2 { |
15 | 15 |
16 class NoBackendProgramCache : public ProgramCache { | 16 class NoBackendProgramCache : public ProgramCache { |
17 public: | 17 public: |
18 ProgramLoadResult LoadLinkedProgram( | 18 ProgramLoadResult LoadLinkedProgram( |
19 GLuint /* program */, | 19 GLuint /* program */, |
20 Shader* /* shader_a */, | 20 Shader* /* shader_a */, |
21 const ShaderTranslatorInterface* /* translator_a */, | |
22 Shader* /* shader_b */, | 21 Shader* /* shader_b */, |
23 const ShaderTranslatorInterface* /* translator_b */, | |
24 const LocationMap* /* bind_attrib_location_map */, | 22 const LocationMap* /* bind_attrib_location_map */, |
25 const ShaderCacheCallback& /* callback */) override { | 23 const ShaderCacheCallback& /* callback */) override { |
26 return PROGRAM_LOAD_SUCCESS; | 24 return PROGRAM_LOAD_SUCCESS; |
27 } | 25 } |
28 void SaveLinkedProgram(GLuint /* program */, | 26 void SaveLinkedProgram(GLuint /* program */, |
29 const Shader* /* shader_a */, | 27 const Shader* /* shader_a */, |
30 const ShaderTranslatorInterface* /* translator_b */, | |
31 const Shader* /* shader_b */, | 28 const Shader* /* shader_b */, |
32 const ShaderTranslatorInterface* /* translator_b */, | |
33 const LocationMap* /* bind_attrib_location_map */, | 29 const LocationMap* /* bind_attrib_location_map */, |
34 const ShaderCacheCallback& /* callback */) override {} | 30 const ShaderCacheCallback& /* callback */) override {} |
35 | 31 |
36 void LoadProgram(const std::string& /* program */) override {} | 32 void LoadProgram(const std::string& /* program */) override {} |
37 | 33 |
38 void ClearBackend() override {} | 34 void ClearBackend() override {} |
39 | 35 |
40 void SaySuccessfullyCached(const std::string& shader1, | 36 void SaySuccessfullyCached(const std::string& shader1, |
41 const ShaderTranslatorInterface* translator_1, | |
42 const std::string& shader2, | 37 const std::string& shader2, |
43 const ShaderTranslatorInterface* translator_2, | |
44 std::map<std::string, GLint>* attrib_map) { | 38 std::map<std::string, GLint>* attrib_map) { |
45 char a_sha[kHashLength]; | 39 char a_sha[kHashLength]; |
46 char b_sha[kHashLength]; | 40 char b_sha[kHashLength]; |
47 ComputeShaderHash(shader1, translator_1, a_sha); | 41 ComputeShaderHash(shader1, a_sha); |
48 ComputeShaderHash(shader2, translator_2, b_sha); | 42 ComputeShaderHash(shader2, b_sha); |
49 | 43 |
50 char sha[kHashLength]; | 44 char sha[kHashLength]; |
51 ComputeProgramHash(a_sha, | 45 ComputeProgramHash(a_sha, |
52 b_sha, | 46 b_sha, |
53 attrib_map, | 47 attrib_map, |
54 sha); | 48 sha); |
55 const std::string shaString(sha, kHashLength); | 49 const std::string shaString(sha, kHashLength); |
56 | 50 |
57 LinkedProgramCacheSuccess(shaString); | 51 LinkedProgramCacheSuccess(shaString); |
58 } | 52 } |
59 | 53 |
60 void ComputeShaderHash(const std::string& shader, | 54 void ComputeShaderHash(const std::string& shader, |
61 const ShaderTranslatorInterface* translator, | |
62 char* result) const { | 55 char* result) const { |
63 ProgramCache::ComputeShaderHash(shader, translator, result); | 56 ProgramCache::ComputeShaderHash(shader, result); |
64 } | 57 } |
65 | 58 |
66 void ComputeProgramHash(const char* hashed_shader_0, | 59 void ComputeProgramHash(const char* hashed_shader_0, |
67 const char* hashed_shader_1, | 60 const char* hashed_shader_1, |
68 const LocationMap* bind_attrib_location_map, | 61 const LocationMap* bind_attrib_location_map, |
69 char* result) const { | 62 char* result) const { |
70 ProgramCache::ComputeProgramHash(hashed_shader_0, | 63 ProgramCache::ComputeProgramHash(hashed_shader_0, |
71 hashed_shader_1, | 64 hashed_shader_1, |
72 bind_attrib_location_map, | 65 bind_attrib_location_map, |
73 result); | 66 result); |
(...skipping 14 matching lines...) Expand all Loading... |
88 }; | 81 }; |
89 | 82 |
90 TEST_F(ProgramCacheTest, LinkStatusSave) { | 83 TEST_F(ProgramCacheTest, LinkStatusSave) { |
91 const std::string shader1 = "abcd1234"; | 84 const std::string shader1 = "abcd1234"; |
92 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | 85 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; |
93 { | 86 { |
94 std::string shader_a = shader1; | 87 std::string shader_a = shader1; |
95 std::string shader_b = shader2; | 88 std::string shader_b = shader2; |
96 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | 89 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, |
97 cache_->GetLinkedProgramStatus( | 90 cache_->GetLinkedProgramStatus( |
98 shader_a, NULL, shader_b, NULL, NULL)); | 91 shader_a, shader_b, NULL)); |
99 cache_->SaySuccessfullyCached(shader_a, NULL, shader_b, NULL, NULL); | 92 cache_->SaySuccessfullyCached(shader_a, shader_b, NULL); |
100 | 93 |
101 shader_a.clear(); | 94 shader_a.clear(); |
102 shader_b.clear(); | 95 shader_b.clear(); |
103 } | 96 } |
104 // make sure it was copied | 97 // make sure it was copied |
105 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, | 98 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, |
106 cache_->GetLinkedProgramStatus( | 99 cache_->GetLinkedProgramStatus( |
107 shader1, NULL, shader2, NULL, NULL)); | 100 shader1, shader2, NULL)); |
108 } | 101 } |
109 | 102 |
110 TEST_F(ProgramCacheTest, LinkUnknownOnFragmentSourceChange) { | 103 TEST_F(ProgramCacheTest, LinkUnknownOnFragmentSourceChange) { |
111 const std::string shader1 = "abcd1234"; | 104 const std::string shader1 = "abcd1234"; |
112 std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | 105 std::string shader2 = "abcda sda b1~#4 bbbbb1234"; |
113 cache_->SaySuccessfullyCached(shader1, NULL, shader2, NULL, NULL); | 106 cache_->SaySuccessfullyCached(shader1, shader2, NULL); |
114 | 107 |
115 shader2 = "different!"; | 108 shader2 = "different!"; |
116 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | 109 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, |
117 cache_->GetLinkedProgramStatus(shader1, NULL, shader2, NULL, NULL)); | 110 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); |
118 } | 111 } |
119 | 112 |
120 TEST_F(ProgramCacheTest, LinkUnknownOnVertexSourceChange) { | 113 TEST_F(ProgramCacheTest, LinkUnknownOnVertexSourceChange) { |
121 std::string shader1 = "abcd1234"; | 114 std::string shader1 = "abcd1234"; |
122 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | 115 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; |
123 cache_->SaySuccessfullyCached(shader1, NULL, shader2, NULL, NULL); | 116 cache_->SaySuccessfullyCached(shader1, shader2, NULL); |
124 | 117 |
125 shader1 = "different!"; | 118 shader1 = "different!"; |
126 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | 119 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, |
127 cache_->GetLinkedProgramStatus(shader1, NULL, shader2, NULL, NULL)); | 120 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); |
128 } | 121 } |
129 | 122 |
130 TEST_F(ProgramCacheTest, StatusEviction) { | 123 TEST_F(ProgramCacheTest, StatusEviction) { |
131 const std::string shader1 = "abcd1234"; | 124 const std::string shader1 = "abcd1234"; |
132 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | 125 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; |
133 cache_->SaySuccessfullyCached(shader1, NULL, shader2, NULL, NULL); | 126 cache_->SaySuccessfullyCached(shader1, shader2, NULL); |
134 char a_sha[ProgramCache::kHashLength]; | 127 char a_sha[ProgramCache::kHashLength]; |
135 char b_sha[ProgramCache::kHashLength]; | 128 char b_sha[ProgramCache::kHashLength]; |
136 cache_->ComputeShaderHash(shader1, NULL, a_sha); | 129 cache_->ComputeShaderHash(shader1, a_sha); |
137 cache_->ComputeShaderHash(shader2, NULL, b_sha); | 130 cache_->ComputeShaderHash(shader2, b_sha); |
138 | 131 |
139 char sha[ProgramCache::kHashLength]; | 132 char sha[ProgramCache::kHashLength]; |
140 cache_->ComputeProgramHash(a_sha, | 133 cache_->ComputeProgramHash(a_sha, |
141 b_sha, | 134 b_sha, |
142 NULL, | 135 NULL, |
143 sha); | 136 sha); |
144 cache_->Evict(std::string(sha, ProgramCache::kHashLength)); | 137 cache_->Evict(std::string(sha, ProgramCache::kHashLength)); |
145 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | 138 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, |
146 cache_->GetLinkedProgramStatus(shader1, NULL, shader2, NULL, NULL)); | 139 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); |
147 } | 140 } |
148 | 141 |
149 TEST_F(ProgramCacheTest, EvictionWithReusedShader) { | 142 TEST_F(ProgramCacheTest, EvictionWithReusedShader) { |
150 const std::string shader1 = "abcd1234"; | 143 const std::string shader1 = "abcd1234"; |
151 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | 144 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; |
152 const std::string shader3 = "asbjbbjj239a"; | 145 const std::string shader3 = "asbjbbjj239a"; |
153 cache_->SaySuccessfullyCached(shader1, NULL, shader2, NULL, NULL); | 146 cache_->SaySuccessfullyCached(shader1, shader2, NULL); |
154 cache_->SaySuccessfullyCached(shader1, NULL, shader3, NULL, NULL); | 147 cache_->SaySuccessfullyCached(shader1, shader3, NULL); |
155 | 148 |
156 char a_sha[ProgramCache::kHashLength]; | 149 char a_sha[ProgramCache::kHashLength]; |
157 char b_sha[ProgramCache::kHashLength]; | 150 char b_sha[ProgramCache::kHashLength]; |
158 char c_sha[ProgramCache::kHashLength]; | 151 char c_sha[ProgramCache::kHashLength]; |
159 cache_->ComputeShaderHash(shader1, NULL, a_sha); | 152 cache_->ComputeShaderHash(shader1, a_sha); |
160 cache_->ComputeShaderHash(shader2, NULL, b_sha); | 153 cache_->ComputeShaderHash(shader2, b_sha); |
161 cache_->ComputeShaderHash(shader3, NULL, c_sha); | 154 cache_->ComputeShaderHash(shader3, c_sha); |
162 | 155 |
163 char sha[ProgramCache::kHashLength]; | 156 char sha[ProgramCache::kHashLength]; |
164 cache_->ComputeProgramHash(a_sha, | 157 cache_->ComputeProgramHash(a_sha, |
165 b_sha, | 158 b_sha, |
166 NULL, | 159 NULL, |
167 sha); | 160 sha); |
168 cache_->Evict(std::string(sha, ProgramCache::kHashLength)); | 161 cache_->Evict(std::string(sha, ProgramCache::kHashLength)); |
169 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | 162 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, |
170 cache_->GetLinkedProgramStatus(shader1, NULL, shader2, NULL, NULL)); | 163 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); |
171 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, | 164 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, |
172 cache_->GetLinkedProgramStatus(shader1, NULL, shader3, NULL, NULL)); | 165 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); |
173 | 166 |
174 | 167 |
175 cache_->ComputeProgramHash(a_sha, | 168 cache_->ComputeProgramHash(a_sha, |
176 c_sha, | 169 c_sha, |
177 NULL, | 170 NULL, |
178 sha); | 171 sha); |
179 cache_->Evict(std::string(sha, ProgramCache::kHashLength)); | 172 cache_->Evict(std::string(sha, ProgramCache::kHashLength)); |
180 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | 173 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, |
181 cache_->GetLinkedProgramStatus(shader1, NULL, shader2, NULL, NULL)); | 174 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); |
182 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | 175 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, |
183 cache_->GetLinkedProgramStatus(shader1, NULL, shader3, NULL, NULL)); | 176 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); |
184 } | 177 } |
185 | 178 |
186 TEST_F(ProgramCacheTest, StatusClear) { | 179 TEST_F(ProgramCacheTest, StatusClear) { |
187 const std::string shader1 = "abcd1234"; | 180 const std::string shader1 = "abcd1234"; |
188 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | 181 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; |
189 const std::string shader3 = "asbjbbjj239a"; | 182 const std::string shader3 = "asbjbbjj239a"; |
190 cache_->SaySuccessfullyCached(shader1, NULL, shader2, NULL, NULL); | 183 cache_->SaySuccessfullyCached(shader1, shader2, NULL); |
191 cache_->SaySuccessfullyCached(shader1, NULL, shader3, NULL, NULL); | 184 cache_->SaySuccessfullyCached(shader1, shader3, NULL); |
192 cache_->Clear(); | 185 cache_->Clear(); |
193 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | 186 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, |
194 cache_->GetLinkedProgramStatus(shader1, NULL, shader2, NULL, NULL)); | 187 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); |
195 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | 188 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, |
196 cache_->GetLinkedProgramStatus(shader1, NULL, shader3, NULL, NULL)); | 189 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); |
197 } | 190 } |
198 | 191 |
199 } // namespace gles2 | 192 } // namespace gles2 |
200 } // namespace gpu | 193 } // namespace gpu |
OLD | NEW |