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/memory_program_cache.h" | 5 #include "gpu/command_buffer/service/memory_program_cache.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 8 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
9 #include "gpu/command_buffer/service/gl_utils.h" | 9 #include "gpu/command_buffer/service/gl_utils.h" |
10 #include "gpu/command_buffer/service/gpu_service_test.h" | 10 #include "gpu/command_buffer/service/gpu_service_test.h" |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 GetProgramiv(program_id, GL_LINK_STATUS, _)) | 170 GetProgramiv(program_id, GL_LINK_STATUS, _)) |
171 .WillOnce(SetArgPointee<2>(GL_FALSE)); | 171 .WillOnce(SetArgPointee<2>(GL_FALSE)); |
172 } | 172 } |
173 | 173 |
174 scoped_ptr<MemoryProgramCache> cache_; | 174 scoped_ptr<MemoryProgramCache> cache_; |
175 ShaderManager shader_manager_; | 175 ShaderManager shader_manager_; |
176 Shader* vertex_shader_; | 176 Shader* vertex_shader_; |
177 Shader* fragment_shader_; | 177 Shader* fragment_shader_; |
178 int32 shader_cache_count_; | 178 int32 shader_cache_count_; |
179 std::string shader_cache_shader_; | 179 std::string shader_cache_shader_; |
| 180 std::vector<std::string> varyings_; |
180 }; | 181 }; |
181 | 182 |
182 TEST_F(MemoryProgramCacheTest, CacheSave) { | 183 TEST_F(MemoryProgramCacheTest, CacheSave) { |
183 const GLenum kFormat = 1; | 184 const GLenum kFormat = 1; |
184 const int kProgramId = 10; | 185 const int kProgramId = 10; |
185 const int kBinaryLength = 20; | 186 const int kBinaryLength = 20; |
186 char test_binary[kBinaryLength]; | 187 char test_binary[kBinaryLength]; |
187 for (int i = 0; i < kBinaryLength; ++i) { | 188 for (int i = 0; i < kBinaryLength; ++i) { |
188 test_binary[i] = i; | 189 test_binary[i] = i; |
189 } | 190 } |
190 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 191 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
191 | 192 |
192 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 193 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
193 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 194 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
194 fragment_shader_, NULL, | 195 fragment_shader_, NULL, varyings_, GL_NONE, |
195 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 196 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
196 base::Unretained(this))); | 197 base::Unretained(this))); |
197 | 198 |
198 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 199 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
199 vertex_shader_->last_compiled_signature(), | 200 vertex_shader_->last_compiled_signature(), |
200 fragment_shader_->last_compiled_signature(), | 201 fragment_shader_->last_compiled_signature(), |
201 NULL)); | 202 NULL, varyings_, GL_NONE)); |
202 EXPECT_EQ(1, shader_cache_count()); | 203 EXPECT_EQ(1, shader_cache_count()); |
203 } | 204 } |
204 | 205 |
205 TEST_F(MemoryProgramCacheTest, LoadProgram) { | 206 TEST_F(MemoryProgramCacheTest, LoadProgram) { |
206 const GLenum kFormat = 1; | 207 const GLenum kFormat = 1; |
207 const int kProgramId = 10; | 208 const int kProgramId = 10; |
208 const int kBinaryLength = 20; | 209 const int kBinaryLength = 20; |
209 char test_binary[kBinaryLength]; | 210 char test_binary[kBinaryLength]; |
210 for (int i = 0; i < kBinaryLength; ++i) { | 211 for (int i = 0; i < kBinaryLength; ++i) { |
211 test_binary[i] = i; | 212 test_binary[i] = i; |
212 } | 213 } |
213 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 214 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
214 | 215 |
215 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 216 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
216 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 217 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
217 fragment_shader_, NULL, | 218 fragment_shader_, NULL, varyings_, GL_NONE, |
218 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 219 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
219 base::Unretained(this))); | 220 base::Unretained(this))); |
220 | 221 |
221 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 222 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
222 vertex_shader_->last_compiled_signature(), | 223 vertex_shader_->last_compiled_signature(), |
223 fragment_shader_->last_compiled_signature(), | 224 fragment_shader_->last_compiled_signature(), |
224 NULL)); | 225 NULL, varyings_, GL_NONE)); |
225 EXPECT_EQ(1, shader_cache_count()); | 226 EXPECT_EQ(1, shader_cache_count()); |
226 | 227 |
227 cache_->Clear(); | 228 cache_->Clear(); |
228 | 229 |
229 cache_->LoadProgram(shader_cache_shader()); | 230 cache_->LoadProgram(shader_cache_shader()); |
230 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 231 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
231 vertex_shader_->last_compiled_signature(), | 232 vertex_shader_->last_compiled_signature(), |
232 fragment_shader_->last_compiled_signature(), | 233 fragment_shader_->last_compiled_signature(), |
233 NULL)); | 234 NULL, varyings_, GL_NONE)); |
234 } | 235 } |
235 | 236 |
236 TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) { | 237 TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) { |
237 const GLenum kFormat = 1; | 238 const GLenum kFormat = 1; |
238 const int kProgramId = 10; | 239 const int kProgramId = 10; |
239 const int kBinaryLength = 20; | 240 const int kBinaryLength = 20; |
240 char test_binary[kBinaryLength]; | 241 char test_binary[kBinaryLength]; |
241 for (int i = 0; i < kBinaryLength; ++i) { | 242 for (int i = 0; i < kBinaryLength; ++i) { |
242 test_binary[i] = i; | 243 test_binary[i] = i; |
243 } | 244 } |
244 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 245 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
245 | 246 |
246 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 247 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
247 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 248 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
248 fragment_shader_, NULL, | 249 fragment_shader_, NULL, varyings_, GL_NONE, |
249 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 250 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
250 base::Unretained(this))); | 251 base::Unretained(this))); |
251 EXPECT_EQ(1, shader_cache_count()); | 252 EXPECT_EQ(1, shader_cache_count()); |
252 | 253 |
253 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); | 254 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); |
254 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); | 255 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); |
255 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); | 256 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); |
256 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); | 257 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); |
257 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); | 258 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); |
258 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); | 259 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); |
259 | 260 |
260 vertex_shader_->set_attrib_map(AttributeMap()); | 261 vertex_shader_->set_attrib_map(AttributeMap()); |
261 vertex_shader_->set_uniform_map(UniformMap()); | 262 vertex_shader_->set_uniform_map(UniformMap()); |
262 vertex_shader_->set_varying_map(VaryingMap()); | 263 vertex_shader_->set_varying_map(VaryingMap()); |
263 fragment_shader_->set_attrib_map(AttributeMap()); | 264 fragment_shader_->set_attrib_map(AttributeMap()); |
264 fragment_shader_->set_uniform_map(UniformMap()); | 265 fragment_shader_->set_uniform_map(UniformMap()); |
265 fragment_shader_->set_varying_map(VaryingMap()); | 266 fragment_shader_->set_varying_map(VaryingMap()); |
266 | 267 |
267 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); | 268 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); |
268 | 269 |
269 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( | 270 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( |
270 kProgramId, | 271 kProgramId, |
271 vertex_shader_, | 272 vertex_shader_, |
272 fragment_shader_, | 273 fragment_shader_, |
273 NULL, | 274 NULL, |
| 275 varyings_, |
| 276 GL_NONE, |
274 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 277 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
275 base::Unretained(this)))); | 278 base::Unretained(this)))); |
276 | 279 |
277 // apparently the hash_map implementation on android doesn't have the | 280 // apparently the hash_map implementation on android doesn't have the |
278 // equality operator | 281 // equality operator |
279 #if !defined(OS_ANDROID) | 282 #if !defined(OS_ANDROID) |
280 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); | 283 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); |
281 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); | 284 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); |
282 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); | 285 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); |
283 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); | 286 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); |
284 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); | 287 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); |
285 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); | 288 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); |
286 #endif | 289 #endif |
287 } | 290 } |
288 | 291 |
289 TEST_F(MemoryProgramCacheTest, LoadProgramMatchesSave) { | 292 TEST_F(MemoryProgramCacheTest, LoadProgramMatchesSave) { |
290 const GLenum kFormat = 1; | 293 const GLenum kFormat = 1; |
291 const int kProgramId = 10; | 294 const int kProgramId = 10; |
292 const int kBinaryLength = 20; | 295 const int kBinaryLength = 20; |
293 char test_binary[kBinaryLength]; | 296 char test_binary[kBinaryLength]; |
294 for (int i = 0; i < kBinaryLength; ++i) { | 297 for (int i = 0; i < kBinaryLength; ++i) { |
295 test_binary[i] = i; | 298 test_binary[i] = i; |
296 } | 299 } |
297 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 300 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
298 | 301 |
299 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 302 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
300 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 303 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
301 fragment_shader_, NULL, | 304 fragment_shader_, NULL, varyings_, GL_NONE, |
302 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 305 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
303 base::Unretained(this))); | 306 base::Unretained(this))); |
304 EXPECT_EQ(1, shader_cache_count()); | 307 EXPECT_EQ(1, shader_cache_count()); |
305 | 308 |
306 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); | 309 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); |
307 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); | 310 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); |
308 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); | 311 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); |
309 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); | 312 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); |
310 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); | 313 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); |
311 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); | 314 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); |
312 | 315 |
313 vertex_shader_->set_attrib_map(AttributeMap()); | 316 vertex_shader_->set_attrib_map(AttributeMap()); |
314 vertex_shader_->set_uniform_map(UniformMap()); | 317 vertex_shader_->set_uniform_map(UniformMap()); |
315 vertex_shader_->set_varying_map(VaryingMap()); | 318 vertex_shader_->set_varying_map(VaryingMap()); |
316 fragment_shader_->set_attrib_map(AttributeMap()); | 319 fragment_shader_->set_attrib_map(AttributeMap()); |
317 fragment_shader_->set_uniform_map(UniformMap()); | 320 fragment_shader_->set_uniform_map(UniformMap()); |
318 fragment_shader_->set_varying_map(VaryingMap()); | 321 fragment_shader_->set_varying_map(VaryingMap()); |
319 | 322 |
320 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); | 323 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); |
321 | 324 |
322 cache_->Clear(); | 325 cache_->Clear(); |
323 cache_->LoadProgram(shader_cache_shader()); | 326 cache_->LoadProgram(shader_cache_shader()); |
324 | 327 |
325 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( | 328 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( |
326 kProgramId, | 329 kProgramId, |
327 vertex_shader_, | 330 vertex_shader_, |
328 fragment_shader_, | 331 fragment_shader_, |
329 NULL, | 332 NULL, |
| 333 varyings_, |
| 334 GL_NONE, |
330 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 335 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
331 base::Unretained(this)))); | 336 base::Unretained(this)))); |
332 | 337 |
333 // apparently the hash_map implementation on android doesn't have the | 338 // apparently the hash_map implementation on android doesn't have the |
334 // equality operator | 339 // equality operator |
335 #if !defined(OS_ANDROID) | 340 #if !defined(OS_ANDROID) |
336 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); | 341 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); |
337 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); | 342 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); |
338 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); | 343 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); |
339 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); | 344 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); |
340 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); | 345 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); |
341 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); | 346 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); |
342 #endif | 347 #endif |
343 } | 348 } |
344 | 349 |
345 TEST_F(MemoryProgramCacheTest, LoadFailOnLinkFalse) { | 350 TEST_F(MemoryProgramCacheTest, LoadFailOnLinkFalse) { |
346 const GLenum kFormat = 1; | 351 const GLenum kFormat = 1; |
347 const int kProgramId = 10; | 352 const int kProgramId = 10; |
348 const int kBinaryLength = 20; | 353 const int kBinaryLength = 20; |
349 char test_binary[kBinaryLength]; | 354 char test_binary[kBinaryLength]; |
350 for (int i = 0; i < kBinaryLength; ++i) { | 355 for (int i = 0; i < kBinaryLength; ++i) { |
351 test_binary[i] = i; | 356 test_binary[i] = i; |
352 } | 357 } |
353 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 358 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
354 | 359 |
355 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 360 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
356 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 361 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
357 fragment_shader_, NULL, | 362 fragment_shader_, NULL, varyings_, GL_NONE, |
358 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 363 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
359 base::Unretained(this))); | 364 base::Unretained(this))); |
360 | 365 |
361 SetExpectationsForLoadLinkedProgramFailure(kProgramId, &emulator); | 366 SetExpectationsForLoadLinkedProgramFailure(kProgramId, &emulator); |
362 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( | 367 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
363 kProgramId, | 368 kProgramId, |
364 vertex_shader_, | 369 vertex_shader_, |
365 fragment_shader_, | 370 fragment_shader_, |
366 NULL, | 371 NULL, |
| 372 varyings_, |
| 373 GL_NONE, |
367 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 374 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
368 base::Unretained(this)))); | 375 base::Unretained(this)))); |
369 } | 376 } |
370 | 377 |
371 TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentSource) { | 378 TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentSource) { |
372 const GLenum kFormat = 1; | 379 const GLenum kFormat = 1; |
373 const int kProgramId = 10; | 380 const int kProgramId = 10; |
374 const int kBinaryLength = 20; | 381 const int kBinaryLength = 20; |
375 char test_binary[kBinaryLength]; | 382 char test_binary[kBinaryLength]; |
376 for (int i = 0; i < kBinaryLength; ++i) { | 383 for (int i = 0; i < kBinaryLength; ++i) { |
377 test_binary[i] = i; | 384 test_binary[i] = i; |
378 } | 385 } |
379 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 386 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
380 | 387 |
381 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 388 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
382 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 389 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
383 fragment_shader_, NULL, | 390 fragment_shader_, NULL, varyings_, GL_NONE, |
384 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 391 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
385 base::Unretained(this))); | 392 base::Unretained(this))); |
386 | 393 |
387 const std::string vertex_orig_source = vertex_shader_->last_compiled_source(); | 394 const std::string vertex_orig_source = vertex_shader_->last_compiled_source(); |
388 vertex_shader_->set_source("different!"); | 395 vertex_shader_->set_source("different!"); |
389 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); | 396 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); |
390 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( | 397 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
391 kProgramId, | 398 kProgramId, |
392 vertex_shader_, | 399 vertex_shader_, |
393 fragment_shader_, | 400 fragment_shader_, |
394 NULL, | 401 NULL, |
| 402 varyings_, |
| 403 GL_NONE, |
395 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 404 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
396 base::Unretained(this)))); | 405 base::Unretained(this)))); |
397 | 406 |
398 vertex_shader_->set_source(vertex_orig_source); | 407 vertex_shader_->set_source(vertex_orig_source); |
399 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); | 408 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); |
400 fragment_shader_->set_source("different!"); | 409 fragment_shader_->set_source("different!"); |
401 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); | 410 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); |
402 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( | 411 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
403 kProgramId, | 412 kProgramId, |
404 vertex_shader_, | 413 vertex_shader_, |
405 fragment_shader_, | 414 fragment_shader_, |
406 NULL, | 415 NULL, |
| 416 varyings_, |
| 417 GL_NONE, |
407 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 418 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
408 base::Unretained(this)))); | 419 base::Unretained(this)))); |
409 } | 420 } |
410 | 421 |
411 TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentMap) { | 422 TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentMap) { |
412 const GLenum kFormat = 1; | 423 const GLenum kFormat = 1; |
413 const int kProgramId = 10; | 424 const int kProgramId = 10; |
414 const int kBinaryLength = 20; | 425 const int kBinaryLength = 20; |
415 char test_binary[kBinaryLength]; | 426 char test_binary[kBinaryLength]; |
416 for (int i = 0; i < kBinaryLength; ++i) { | 427 for (int i = 0; i < kBinaryLength; ++i) { |
417 test_binary[i] = i; | 428 test_binary[i] = i; |
418 } | 429 } |
419 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 430 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
420 | 431 |
421 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 432 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
422 ProgramCache::LocationMap binding_map; | 433 ProgramCache::LocationMap binding_map; |
423 binding_map["test"] = 512; | 434 binding_map["test"] = 512; |
424 cache_->SaveLinkedProgram(kProgramId, | 435 cache_->SaveLinkedProgram(kProgramId, |
425 vertex_shader_, | 436 vertex_shader_, |
426 fragment_shader_, | 437 fragment_shader_, |
427 &binding_map, | 438 &binding_map, |
| 439 varyings_, |
| 440 GL_NONE, |
428 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 441 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
429 base::Unretained(this))); | 442 base::Unretained(this))); |
430 | 443 |
431 binding_map["different!"] = 59; | 444 binding_map["different!"] = 59; |
432 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( | 445 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
433 kProgramId, | 446 kProgramId, |
434 vertex_shader_, | 447 vertex_shader_, |
435 fragment_shader_, | 448 fragment_shader_, |
436 &binding_map, | 449 &binding_map, |
| 450 varyings_, |
| 451 GL_NONE, |
437 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 452 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
438 base::Unretained(this)))); | 453 base::Unretained(this)))); |
439 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( | 454 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
440 kProgramId, | 455 kProgramId, |
441 vertex_shader_, | 456 vertex_shader_, |
442 fragment_shader_, | 457 fragment_shader_, |
443 NULL, | 458 NULL, |
| 459 varyings_, |
| 460 GL_NONE, |
444 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 461 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
445 base::Unretained(this)))); | 462 base::Unretained(this)))); |
446 } | 463 } |
| 464 |
| 465 TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentTransformFeedbackVaryings) { |
| 466 const GLenum kFormat = 1; |
| 467 const int kProgramId = 10; |
| 468 const int kBinaryLength = 20; |
| 469 char test_binary[kBinaryLength]; |
| 470 for (int i = 0; i < kBinaryLength; ++i) { |
| 471 test_binary[i] = i; |
| 472 } |
| 473 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
| 474 |
| 475 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
| 476 varyings_.push_back("test"); |
| 477 cache_->SaveLinkedProgram(kProgramId, |
| 478 vertex_shader_, |
| 479 fragment_shader_, |
| 480 NULL, |
| 481 varyings_, |
| 482 GL_INTERLEAVED_ATTRIBS, |
| 483 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
| 484 base::Unretained(this))); |
| 485 |
| 486 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
| 487 kProgramId, |
| 488 vertex_shader_, |
| 489 fragment_shader_, |
| 490 NULL, |
| 491 varyings_, |
| 492 GL_SEPARATE_ATTRIBS, |
| 493 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
| 494 base::Unretained(this)))); |
| 495 |
| 496 varyings_.push_back("different!"); |
| 497 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
| 498 kProgramId, |
| 499 vertex_shader_, |
| 500 fragment_shader_, |
| 501 NULL, |
| 502 varyings_, |
| 503 GL_INTERLEAVED_ATTRIBS, |
| 504 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
| 505 base::Unretained(this)))); |
| 506 } |
447 | 507 |
448 TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) { | 508 TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) { |
449 const GLenum kFormat = 1; | 509 const GLenum kFormat = 1; |
450 const int kProgramId = 10; | 510 const int kProgramId = 10; |
451 const int kBinaryLength = 20; | 511 const int kBinaryLength = 20; |
452 char test_binary[kBinaryLength]; | 512 char test_binary[kBinaryLength]; |
453 for (int i = 0; i < kBinaryLength; ++i) { | 513 for (int i = 0; i < kBinaryLength; ++i) { |
454 test_binary[i] = i; | 514 test_binary[i] = i; |
455 } | 515 } |
456 ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); | 516 ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); |
457 | 517 |
458 | 518 |
459 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); | 519 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); |
460 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 520 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
461 fragment_shader_, NULL, | 521 fragment_shader_, NULL, varyings_, GL_NONE, |
462 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 522 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
463 base::Unretained(this))); | 523 base::Unretained(this))); |
464 | 524 |
465 const int kEvictingProgramId = 11; | 525 const int kEvictingProgramId = 11; |
466 const GLuint kEvictingBinaryLength = kCacheSizeBytes - kBinaryLength + 1; | 526 const GLuint kEvictingBinaryLength = kCacheSizeBytes - kBinaryLength + 1; |
467 | 527 |
468 // save old source and modify for new program | 528 // save old source and modify for new program |
469 const std::string& old_sig = fragment_shader_->last_compiled_signature(); | 529 const std::string& old_sig = fragment_shader_->last_compiled_signature(); |
470 fragment_shader_->set_source("al sdfkjdk"); | 530 fragment_shader_->set_source("al sdfkjdk"); |
471 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); | 531 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); |
472 | 532 |
473 scoped_ptr<char[]> bigTestBinary = | 533 scoped_ptr<char[]> bigTestBinary = |
474 scoped_ptr<char[]>(new char[kEvictingBinaryLength]); | 534 scoped_ptr<char[]>(new char[kEvictingBinaryLength]); |
475 for (size_t i = 0; i < kEvictingBinaryLength; ++i) { | 535 for (size_t i = 0; i < kEvictingBinaryLength; ++i) { |
476 bigTestBinary[i] = i % 250; | 536 bigTestBinary[i] = i % 250; |
477 } | 537 } |
478 ProgramBinaryEmulator emulator2(kEvictingBinaryLength, | 538 ProgramBinaryEmulator emulator2(kEvictingBinaryLength, |
479 kFormat, | 539 kFormat, |
480 bigTestBinary.get()); | 540 bigTestBinary.get()); |
481 | 541 |
482 SetExpectationsForSaveLinkedProgram(kEvictingProgramId, &emulator2); | 542 SetExpectationsForSaveLinkedProgram(kEvictingProgramId, &emulator2); |
483 cache_->SaveLinkedProgram(kEvictingProgramId, | 543 cache_->SaveLinkedProgram(kEvictingProgramId, |
484 vertex_shader_, | 544 vertex_shader_, |
485 fragment_shader_, | 545 fragment_shader_, |
486 NULL, | 546 NULL, |
| 547 varyings_, |
| 548 GL_NONE, |
487 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 549 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
488 base::Unretained(this))); | 550 base::Unretained(this))); |
489 | 551 |
490 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 552 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
491 vertex_shader_->last_compiled_signature(), | 553 vertex_shader_->last_compiled_signature(), |
492 fragment_shader_->last_compiled_signature(), | 554 fragment_shader_->last_compiled_signature(), |
493 NULL)); | 555 NULL, varyings_, GL_NONE)); |
494 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, cache_->GetLinkedProgramStatus( | 556 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, cache_->GetLinkedProgramStatus( |
495 old_sig, | 557 old_sig, |
496 fragment_shader_->last_compiled_signature(), | 558 fragment_shader_->last_compiled_signature(), |
497 NULL)); | 559 NULL, varyings_, GL_NONE)); |
498 } | 560 } |
499 | 561 |
500 TEST_F(MemoryProgramCacheTest, SaveCorrectProgram) { | 562 TEST_F(MemoryProgramCacheTest, SaveCorrectProgram) { |
501 const GLenum kFormat = 1; | 563 const GLenum kFormat = 1; |
502 const int kProgramId = 10; | 564 const int kProgramId = 10; |
503 const int kBinaryLength = 20; | 565 const int kBinaryLength = 20; |
504 char test_binary[kBinaryLength]; | 566 char test_binary[kBinaryLength]; |
505 for (int i = 0; i < kBinaryLength; ++i) { | 567 for (int i = 0; i < kBinaryLength; ++i) { |
506 test_binary[i] = i; | 568 test_binary[i] = i; |
507 } | 569 } |
508 ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); | 570 ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); |
509 | 571 |
510 vertex_shader_->set_source("different!"); | 572 vertex_shader_->set_source("different!"); |
511 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); | 573 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); |
512 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 574 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
513 fragment_shader_, NULL, | 575 fragment_shader_, NULL, varyings_, GL_NONE, |
514 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 576 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
515 base::Unretained(this))); | 577 base::Unretained(this))); |
516 | 578 |
517 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 579 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
518 vertex_shader_->last_compiled_signature(), | 580 vertex_shader_->last_compiled_signature(), |
519 fragment_shader_->last_compiled_signature(), | 581 fragment_shader_->last_compiled_signature(), |
520 NULL)); | 582 NULL, varyings_, GL_NONE)); |
521 } | 583 } |
522 | 584 |
523 TEST_F(MemoryProgramCacheTest, LoadCorrectProgram) { | 585 TEST_F(MemoryProgramCacheTest, LoadCorrectProgram) { |
524 const GLenum kFormat = 1; | 586 const GLenum kFormat = 1; |
525 const int kProgramId = 10; | 587 const int kProgramId = 10; |
526 const int kBinaryLength = 20; | 588 const int kBinaryLength = 20; |
527 char test_binary[kBinaryLength]; | 589 char test_binary[kBinaryLength]; |
528 for (int i = 0; i < kBinaryLength; ++i) { | 590 for (int i = 0; i < kBinaryLength; ++i) { |
529 test_binary[i] = i; | 591 test_binary[i] = i; |
530 } | 592 } |
531 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 593 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
532 | 594 |
533 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 595 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
534 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 596 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
535 fragment_shader_, NULL, | 597 fragment_shader_, NULL, varyings_, GL_NONE, |
536 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 598 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
537 base::Unretained(this))); | 599 base::Unretained(this))); |
538 | 600 |
539 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 601 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
540 vertex_shader_->last_compiled_signature(), | 602 vertex_shader_->last_compiled_signature(), |
541 fragment_shader_->last_compiled_signature(), | 603 fragment_shader_->last_compiled_signature(), |
542 NULL)); | 604 NULL, varyings_, GL_NONE)); |
543 | 605 |
544 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); | 606 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); |
545 | 607 |
546 fragment_shader_->set_source("different!"); | 608 fragment_shader_->set_source("different!"); |
547 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( | 609 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( |
548 kProgramId, | 610 kProgramId, |
549 vertex_shader_, | 611 vertex_shader_, |
550 fragment_shader_, | 612 fragment_shader_, |
551 NULL, | 613 NULL, |
| 614 varyings_, |
| 615 GL_NONE, |
552 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 616 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
553 base::Unretained(this)))); | 617 base::Unretained(this)))); |
554 } | 618 } |
555 | 619 |
556 TEST_F(MemoryProgramCacheTest, OverwriteOnNewSave) { | 620 TEST_F(MemoryProgramCacheTest, OverwriteOnNewSave) { |
557 const GLenum kFormat = 1; | 621 const GLenum kFormat = 1; |
558 const int kProgramId = 10; | 622 const int kProgramId = 10; |
559 const int kBinaryLength = 20; | 623 const int kBinaryLength = 20; |
560 char test_binary[kBinaryLength]; | 624 char test_binary[kBinaryLength]; |
561 for (int i = 0; i < kBinaryLength; ++i) { | 625 for (int i = 0; i < kBinaryLength; ++i) { |
562 test_binary[i] = i; | 626 test_binary[i] = i; |
563 } | 627 } |
564 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 628 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
565 | 629 |
566 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 630 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
567 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 631 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
568 fragment_shader_, NULL, | 632 fragment_shader_, NULL, varyings_, GL_NONE, |
569 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 633 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
570 base::Unretained(this))); | 634 base::Unretained(this))); |
571 | 635 |
572 | 636 |
573 char test_binary2[kBinaryLength]; | 637 char test_binary2[kBinaryLength]; |
574 for (int i = 0; i < kBinaryLength; ++i) { | 638 for (int i = 0; i < kBinaryLength; ++i) { |
575 test_binary2[i] = (i*2) % 250; | 639 test_binary2[i] = (i*2) % 250; |
576 } | 640 } |
577 ProgramBinaryEmulator emulator2(kBinaryLength, kFormat, test_binary2); | 641 ProgramBinaryEmulator emulator2(kBinaryLength, kFormat, test_binary2); |
578 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator2); | 642 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator2); |
579 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 643 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
580 fragment_shader_, NULL, | 644 fragment_shader_, NULL, varyings_, GL_NONE, |
581 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 645 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
582 base::Unretained(this))); | 646 base::Unretained(this))); |
583 | 647 |
584 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator2); | 648 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator2); |
585 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( | 649 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( |
586 kProgramId, | 650 kProgramId, |
587 vertex_shader_, | 651 vertex_shader_, |
588 fragment_shader_, | 652 fragment_shader_, |
589 NULL, | 653 NULL, |
| 654 varyings_, |
| 655 GL_NONE, |
590 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 656 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
591 base::Unretained(this)))); | 657 base::Unretained(this)))); |
592 } | 658 } |
593 | 659 |
594 } // namespace gles2 | 660 } // namespace gles2 |
595 } // namespace gpu | 661 } // namespace gpu |
OLD | NEW |