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