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/shader_manager.h" | 5 #include "gpu/command_buffer/service/shader_manager.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 #include "ui/gl/gl_mock.h" | 10 #include "ui/gl/gl_mock.h" |
(...skipping 28 matching lines...) Expand all Loading... |
39 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; | 39 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; |
40 ShaderManager manager_; | 40 ShaderManager manager_; |
41 }; | 41 }; |
42 | 42 |
43 TEST_F(ShaderManagerTest, Basic) { | 43 TEST_F(ShaderManagerTest, Basic) { |
44 const GLuint kClient1Id = 1; | 44 const GLuint kClient1Id = 1; |
45 const GLuint kService1Id = 11; | 45 const GLuint kService1Id = 11; |
46 const GLenum kShader1Type = GL_VERTEX_SHADER; | 46 const GLenum kShader1Type = GL_VERTEX_SHADER; |
47 const GLuint kClient2Id = 2; | 47 const GLuint kClient2Id = 2; |
48 // Check we can create shader. | 48 // Check we can create shader. |
49 ShaderManager::ShaderInfo* info0 = manager_.CreateShaderInfo( | 49 Shader* info0 = manager_.CreateShader( |
50 kClient1Id, kService1Id, kShader1Type); | 50 kClient1Id, kService1Id, kShader1Type); |
51 // Check shader got created. | 51 // Check shader got created. |
52 ASSERT_TRUE(info0 != NULL); | 52 ASSERT_TRUE(info0 != NULL); |
53 ShaderManager::ShaderInfo* info1 = manager_.GetShaderInfo(kClient1Id); | 53 Shader* info1 = manager_.GetShader(kClient1Id); |
54 ASSERT_EQ(info0, info1); | 54 ASSERT_EQ(info0, info1); |
55 // Check we get nothing for a non-existent shader. | 55 // Check we get nothing for a non-existent shader. |
56 EXPECT_TRUE(manager_.GetShaderInfo(kClient2Id) == NULL); | 56 EXPECT_TRUE(manager_.GetShader(kClient2Id) == NULL); |
57 // Check we can't get the shader after we remove it. | 57 // Check we can't get the shader after we remove it. |
58 manager_.MarkAsDeleted(info1); | 58 manager_.MarkAsDeleted(info1); |
59 EXPECT_TRUE(manager_.GetShaderInfo(kClient1Id) == NULL); | 59 EXPECT_TRUE(manager_.GetShader(kClient1Id) == NULL); |
60 } | 60 } |
61 | 61 |
62 TEST_F(ShaderManagerTest, Destroy) { | 62 TEST_F(ShaderManagerTest, Destroy) { |
63 const GLuint kClient1Id = 1; | 63 const GLuint kClient1Id = 1; |
64 const GLuint kService1Id = 11; | 64 const GLuint kService1Id = 11; |
65 const GLenum kShader1Type = GL_VERTEX_SHADER; | 65 const GLenum kShader1Type = GL_VERTEX_SHADER; |
66 // Check we can create shader. | 66 // Check we can create shader. |
67 ShaderManager::ShaderInfo* info1 = manager_.CreateShaderInfo( | 67 Shader* info1 = manager_.CreateShader( |
68 kClient1Id, kService1Id, kShader1Type); | 68 kClient1Id, kService1Id, kShader1Type); |
69 // Check shader got created. | 69 // Check shader got created. |
70 ASSERT_TRUE(info1 != NULL); | 70 ASSERT_TRUE(info1 != NULL); |
71 EXPECT_CALL(*gl_, DeleteShader(kService1Id)) | 71 EXPECT_CALL(*gl_, DeleteShader(kService1Id)) |
72 .Times(1) | 72 .Times(1) |
73 .RetiresOnSaturation(); | 73 .RetiresOnSaturation(); |
74 manager_.Destroy(true); | 74 manager_.Destroy(true); |
75 // Check that resources got freed. | 75 // Check that resources got freed. |
76 info1 = manager_.GetShaderInfo(kClient1Id); | 76 info1 = manager_.GetShader(kClient1Id); |
77 ASSERT_TRUE(info1 == NULL); | 77 ASSERT_TRUE(info1 == NULL); |
78 } | 78 } |
79 | 79 |
80 TEST_F(ShaderManagerTest, DeleteBug) { | 80 TEST_F(ShaderManagerTest, DeleteBug) { |
81 const GLuint kClient1Id = 1; | 81 const GLuint kClient1Id = 1; |
82 const GLuint kClient2Id = 2; | 82 const GLuint kClient2Id = 2; |
83 const GLuint kService1Id = 11; | 83 const GLuint kService1Id = 11; |
84 const GLuint kService2Id = 12; | 84 const GLuint kService2Id = 12; |
85 const GLenum kShaderType = GL_VERTEX_SHADER; | 85 const GLenum kShaderType = GL_VERTEX_SHADER; |
86 // Check we can create shader. | 86 // Check we can create shader. |
87 ShaderManager::ShaderInfo::Ref info1( | 87 scoped_refptr<Shader> info1( |
88 manager_.CreateShaderInfo(kClient1Id, kService1Id, kShaderType)); | 88 manager_.CreateShader(kClient1Id, kService1Id, kShaderType)); |
89 ShaderManager::ShaderInfo::Ref info2( | 89 scoped_refptr<Shader> info2( |
90 manager_.CreateShaderInfo(kClient2Id, kService2Id, kShaderType)); | 90 manager_.CreateShader(kClient2Id, kService2Id, kShaderType)); |
91 ASSERT_TRUE(info1); | 91 ASSERT_TRUE(info1); |
92 ASSERT_TRUE(info2); | 92 ASSERT_TRUE(info2); |
93 manager_.UseShader(info1); | 93 manager_.UseShader(info1); |
94 manager_.MarkAsDeleted(info1); | 94 manager_.MarkAsDeleted(info1); |
95 manager_.MarkAsDeleted(info2); | 95 manager_.MarkAsDeleted(info2); |
96 EXPECT_TRUE(manager_.IsOwned(info1)); | 96 EXPECT_TRUE(manager_.IsOwned(info1)); |
97 EXPECT_FALSE(manager_.IsOwned(info2)); | 97 EXPECT_FALSE(manager_.IsOwned(info2)); |
98 } | 98 } |
99 | 99 |
100 TEST_F(ShaderManagerTest, ShaderInfo) { | 100 TEST_F(ShaderManagerTest, Shader) { |
101 const GLuint kClient1Id = 1; | 101 const GLuint kClient1Id = 1; |
102 const GLuint kService1Id = 11; | 102 const GLuint kService1Id = 11; |
103 const GLenum kShader1Type = GL_VERTEX_SHADER; | 103 const GLenum kShader1Type = GL_VERTEX_SHADER; |
104 const char* kClient1Source = "hello world"; | 104 const char* kClient1Source = "hello world"; |
105 // Check we can create shader. | 105 // Check we can create shader. |
106 ShaderManager::ShaderInfo* info1 = manager_.CreateShaderInfo( | 106 Shader* info1 = manager_.CreateShader( |
107 kClient1Id, kService1Id, kShader1Type); | 107 kClient1Id, kService1Id, kShader1Type); |
108 // Check shader got created. | 108 // Check shader got created. |
109 ASSERT_TRUE(info1 != NULL); | 109 ASSERT_TRUE(info1 != NULL); |
110 EXPECT_EQ(kService1Id, info1->service_id()); | 110 EXPECT_EQ(kService1Id, info1->service_id()); |
111 // Check if the shader has correct type. | 111 // Check if the shader has correct type. |
112 EXPECT_EQ(kShader1Type, info1->shader_type()); | 112 EXPECT_EQ(kShader1Type, info1->shader_type()); |
113 EXPECT_FALSE(info1->IsValid()); | 113 EXPECT_FALSE(info1->IsValid()); |
114 EXPECT_FALSE(info1->InUse()); | 114 EXPECT_FALSE(info1->InUse()); |
115 EXPECT_TRUE(info1->source() == NULL); | 115 EXPECT_TRUE(info1->source() == NULL); |
116 EXPECT_TRUE(info1->log_info() == NULL); | 116 EXPECT_TRUE(info1->log_info() == NULL); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 uniform_map[kUniform2Name] = ShaderTranslatorInterface::VariableInfo( | 156 uniform_map[kUniform2Name] = ShaderTranslatorInterface::VariableInfo( |
157 kUniform2Type, kUniform2Size, kUniform2Name); | 157 kUniform2Type, kUniform2Size, kUniform2Name); |
158 EXPECT_CALL(shader_translator, attrib_map()) | 158 EXPECT_CALL(shader_translator, attrib_map()) |
159 .WillRepeatedly(ReturnRef(attrib_map)); | 159 .WillRepeatedly(ReturnRef(attrib_map)); |
160 EXPECT_CALL(shader_translator, uniform_map()) | 160 EXPECT_CALL(shader_translator, uniform_map()) |
161 .WillRepeatedly(ReturnRef(uniform_map)); | 161 .WillRepeatedly(ReturnRef(uniform_map)); |
162 ShaderTranslator::NameMap name_map; | 162 ShaderTranslator::NameMap name_map; |
163 EXPECT_CALL(shader_translator, name_map()) | 163 EXPECT_CALL(shader_translator, name_map()) |
164 .WillRepeatedly(ReturnRef(name_map)); | 164 .WillRepeatedly(ReturnRef(name_map)); |
165 // Check we can create shader. | 165 // Check we can create shader. |
166 ShaderManager::ShaderInfo* info1 = manager_.CreateShaderInfo( | 166 Shader* info1 = manager_.CreateShader( |
167 kClient1Id, kService1Id, kShader1Type); | 167 kClient1Id, kService1Id, kShader1Type); |
168 // Check shader got created. | 168 // Check shader got created. |
169 ASSERT_TRUE(info1 != NULL); | 169 ASSERT_TRUE(info1 != NULL); |
170 // Set Status | 170 // Set Status |
171 info1->SetStatus(true, "", &shader_translator); | 171 info1->SetStatus(true, "", &shader_translator); |
172 // Check attrib and uniform infos got copied. | 172 // Check attrib and uniform infos got copied. |
173 for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin(); | 173 for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin(); |
174 it != attrib_map.end(); ++it) { | 174 it != attrib_map.end(); ++it) { |
175 const ShaderManager::ShaderInfo::VariableInfo* variable_info = | 175 const Shader::VariableInfo* variable_info = |
176 info1->GetAttribInfo(it->first); | 176 info1->GetAttribInfo(it->first); |
177 ASSERT_TRUE(variable_info != NULL); | 177 ASSERT_TRUE(variable_info != NULL); |
178 EXPECT_EQ(it->second.type, variable_info->type); | 178 EXPECT_EQ(it->second.type, variable_info->type); |
179 EXPECT_EQ(it->second.size, variable_info->size); | 179 EXPECT_EQ(it->second.size, variable_info->size); |
180 EXPECT_EQ(it->second.name, variable_info->name); | 180 EXPECT_EQ(it->second.name, variable_info->name); |
181 } | 181 } |
182 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); | 182 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); |
183 it != uniform_map.end(); ++it) { | 183 it != uniform_map.end(); ++it) { |
184 const ShaderManager::ShaderInfo::VariableInfo* variable_info = | 184 const Shader::VariableInfo* variable_info = |
185 info1->GetUniformInfo(it->first); | 185 info1->GetUniformInfo(it->first); |
186 ASSERT_TRUE(variable_info != NULL); | 186 ASSERT_TRUE(variable_info != NULL); |
187 EXPECT_EQ(it->second.type, variable_info->type); | 187 EXPECT_EQ(it->second.type, variable_info->type); |
188 EXPECT_EQ(it->second.size, variable_info->size); | 188 EXPECT_EQ(it->second.size, variable_info->size); |
189 EXPECT_EQ(it->second.name, variable_info->name); | 189 EXPECT_EQ(it->second.name, variable_info->name); |
190 } | 190 } |
191 // Check attrib and uniform get cleared. | 191 // Check attrib and uniform get cleared. |
192 info1->SetStatus(true, NULL, NULL); | 192 info1->SetStatus(true, NULL, NULL); |
193 EXPECT_TRUE(info1->log_info() == NULL); | 193 EXPECT_TRUE(info1->log_info() == NULL); |
194 for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin(); | 194 for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin(); |
195 it != attrib_map.end(); ++it) { | 195 it != attrib_map.end(); ++it) { |
196 const ShaderManager::ShaderInfo::VariableInfo* variable_info = | 196 const Shader::VariableInfo* variable_info = |
197 info1->GetAttribInfo(it->first); | 197 info1->GetAttribInfo(it->first); |
198 EXPECT_TRUE(variable_info == NULL); | 198 EXPECT_TRUE(variable_info == NULL); |
199 } | 199 } |
200 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); | 200 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); |
201 it != uniform_map.end(); ++it) { | 201 it != uniform_map.end(); ++it) { |
202 const ShaderManager::ShaderInfo::VariableInfo* variable_info = | 202 const Shader::VariableInfo* variable_info = |
203 info1->GetUniformInfo(it->first); | 203 info1->GetUniformInfo(it->first); |
204 ASSERT_TRUE(variable_info == NULL); | 204 ASSERT_TRUE(variable_info == NULL); |
205 } | 205 } |
206 } | 206 } |
207 | 207 |
208 TEST_F(ShaderManagerTest, ShaderInfoUseCount) { | 208 TEST_F(ShaderManagerTest, ShaderInfoUseCount) { |
209 const GLuint kClient1Id = 1; | 209 const GLuint kClient1Id = 1; |
210 const GLuint kService1Id = 11; | 210 const GLuint kService1Id = 11; |
211 const GLenum kShader1Type = GL_VERTEX_SHADER; | 211 const GLenum kShader1Type = GL_VERTEX_SHADER; |
212 // Check we can create shader. | 212 // Check we can create shader. |
213 ShaderManager::ShaderInfo* info1 = manager_.CreateShaderInfo( | 213 Shader* info1 = manager_.CreateShader( |
214 kClient1Id, kService1Id, kShader1Type); | 214 kClient1Id, kService1Id, kShader1Type); |
215 // Check shader got created. | 215 // Check shader got created. |
216 ASSERT_TRUE(info1 != NULL); | 216 ASSERT_TRUE(info1 != NULL); |
217 EXPECT_FALSE(info1->InUse()); | 217 EXPECT_FALSE(info1->InUse()); |
218 EXPECT_FALSE(info1->IsDeleted()); | 218 EXPECT_FALSE(info1->IsDeleted()); |
219 manager_.UseShader(info1); | 219 manager_.UseShader(info1); |
220 EXPECT_TRUE(info1->InUse()); | 220 EXPECT_TRUE(info1->InUse()); |
221 manager_.UseShader(info1); | 221 manager_.UseShader(info1); |
222 EXPECT_TRUE(info1->InUse()); | 222 EXPECT_TRUE(info1->InUse()); |
223 manager_.MarkAsDeleted(info1); | 223 manager_.MarkAsDeleted(info1); |
224 EXPECT_TRUE(info1->IsDeleted()); | 224 EXPECT_TRUE(info1->IsDeleted()); |
225 ShaderManager::ShaderInfo* info2 = manager_.GetShaderInfo(kClient1Id); | 225 Shader* info2 = manager_.GetShader(kClient1Id); |
226 EXPECT_EQ(info1, info2); | 226 EXPECT_EQ(info1, info2); |
227 manager_.UnuseShader(info1); | 227 manager_.UnuseShader(info1); |
228 EXPECT_TRUE(info1->InUse()); | 228 EXPECT_TRUE(info1->InUse()); |
229 manager_.UnuseShader(info1); // this should delete the info. | 229 manager_.UnuseShader(info1); // this should delete the info. |
230 info2 = manager_.GetShaderInfo(kClient1Id); | 230 info2 = manager_.GetShader(kClient1Id); |
231 EXPECT_TRUE(info2 == NULL); | 231 EXPECT_TRUE(info2 == NULL); |
232 | 232 |
233 info1 = manager_.CreateShaderInfo(kClient1Id, kService1Id, kShader1Type); | 233 info1 = manager_.CreateShader(kClient1Id, kService1Id, kShader1Type); |
234 ASSERT_TRUE(info1 != NULL); | 234 ASSERT_TRUE(info1 != NULL); |
235 EXPECT_FALSE(info1->InUse()); | 235 EXPECT_FALSE(info1->InUse()); |
236 manager_.UseShader(info1); | 236 manager_.UseShader(info1); |
237 EXPECT_TRUE(info1->InUse()); | 237 EXPECT_TRUE(info1->InUse()); |
238 manager_.UseShader(info1); | 238 manager_.UseShader(info1); |
239 EXPECT_TRUE(info1->InUse()); | 239 EXPECT_TRUE(info1->InUse()); |
240 manager_.UnuseShader(info1); | 240 manager_.UnuseShader(info1); |
241 EXPECT_TRUE(info1->InUse()); | 241 EXPECT_TRUE(info1->InUse()); |
242 manager_.UnuseShader(info1); | 242 manager_.UnuseShader(info1); |
243 EXPECT_FALSE(info1->InUse()); | 243 EXPECT_FALSE(info1->InUse()); |
244 info2 = manager_.GetShaderInfo(kClient1Id); | 244 info2 = manager_.GetShader(kClient1Id); |
245 EXPECT_EQ(info1, info2); | 245 EXPECT_EQ(info1, info2); |
246 manager_.MarkAsDeleted(info1); // this should delete the shader. | 246 manager_.MarkAsDeleted(info1); // this should delete the shader. |
247 info2 = manager_.GetShaderInfo(kClient1Id); | 247 info2 = manager_.GetShader(kClient1Id); |
248 EXPECT_TRUE(info2 == NULL); | 248 EXPECT_TRUE(info2 == NULL); |
249 } | 249 } |
250 | 250 |
251 TEST_F(ShaderManagerTest, ShaderInfoStoreCompilationStatus) { | 251 TEST_F(ShaderManagerTest, ShaderInfoStoreCompilationStatus) { |
252 const GLuint kClientId = 1; | 252 const GLuint kClientId = 1; |
253 const GLuint kServiceId = 11; | 253 const GLuint kServiceId = 11; |
254 const GLenum kShaderType = GL_VERTEX_SHADER; | 254 const GLenum kShaderType = GL_VERTEX_SHADER; |
255 ShaderManager::ShaderInfo* info = manager_.CreateShaderInfo( | 255 Shader* info = manager_.CreateShader( |
256 kClientId, kServiceId, kShaderType); | 256 kClientId, kServiceId, kShaderType); |
257 ASSERT_TRUE(info != NULL); | 257 ASSERT_TRUE(info != NULL); |
258 | 258 |
259 EXPECT_EQ(ShaderManager::ShaderInfo::NOT_COMPILED, | 259 EXPECT_EQ(Shader::NOT_COMPILED, |
260 info->compilation_status()); | 260 info->compilation_status()); |
261 info->UpdateSource("original source"); | 261 info->UpdateSource("original source"); |
262 EXPECT_EQ(ShaderManager::ShaderInfo::NOT_COMPILED, | 262 EXPECT_EQ(Shader::NOT_COMPILED, |
263 info->compilation_status()); | 263 info->compilation_status()); |
264 info->FlagSourceAsCompiled(false); | 264 info->FlagSourceAsCompiled(false); |
265 EXPECT_EQ(ShaderManager::ShaderInfo::PENDING_DEFERRED_COMPILE, | 265 EXPECT_EQ(Shader::PENDING_DEFERRED_COMPILE, |
266 info->compilation_status()); | 266 info->compilation_status()); |
267 info->FlagSourceAsCompiled(true); | 267 info->FlagSourceAsCompiled(true); |
268 EXPECT_EQ(ShaderManager::ShaderInfo::COMPILED, | 268 EXPECT_EQ(Shader::COMPILED, |
269 info->compilation_status()); | 269 info->compilation_status()); |
270 } | 270 } |
271 | 271 |
272 TEST_F(ShaderManagerTest, ShaderInfoStoreDeferredSource) { | 272 TEST_F(ShaderManagerTest, ShaderInfoStoreDeferredSource) { |
273 const GLuint kClientId = 1; | 273 const GLuint kClientId = 1; |
274 const GLuint kServiceId = 11; | 274 const GLuint kServiceId = 11; |
275 const GLenum kShaderType = GL_VERTEX_SHADER; | 275 const GLenum kShaderType = GL_VERTEX_SHADER; |
276 ShaderManager::ShaderInfo* info = manager_.CreateShaderInfo( | 276 Shader* info = manager_.CreateShader( |
277 kClientId, kServiceId, kShaderType); | 277 kClientId, kServiceId, kShaderType); |
278 ASSERT_TRUE(info != NULL); | 278 ASSERT_TRUE(info != NULL); |
279 | 279 |
280 info->UpdateSource("original source"); | 280 info->UpdateSource("original source"); |
281 info->FlagSourceAsCompiled(false); | 281 info->FlagSourceAsCompiled(false); |
282 | 282 |
283 EXPECT_EQ("original source", *info->deferred_compilation_source()); | 283 EXPECT_EQ("original source", *info->deferred_compilation_source()); |
284 info->UpdateSource("different!"); | 284 info->UpdateSource("different!"); |
285 EXPECT_EQ("original source", *info->deferred_compilation_source()); | 285 EXPECT_EQ("original source", *info->deferred_compilation_source()); |
286 | 286 |
287 info->FlagSourceAsCompiled(true); | 287 info->FlagSourceAsCompiled(true); |
288 EXPECT_EQ("different!", *info->deferred_compilation_source()); | 288 EXPECT_EQ("different!", *info->deferred_compilation_source()); |
289 } | 289 } |
290 | 290 |
291 } // namespace gles2 | 291 } // namespace gles2 |
292 } // namespace gpu | 292 } // namespace gpu |
OLD | NEW |