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