| 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 |