| 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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 GL_VERTEX_SHADER); | 93 GL_VERTEX_SHADER); |
| 94 fragment_shader_ = shader_manager_.CreateShader( | 94 fragment_shader_ = shader_manager_.CreateShader( |
| 95 kFragmentShaderClientId, | 95 kFragmentShaderClientId, |
| 96 kFragmentShaderServiceId, | 96 kFragmentShaderServiceId, |
| 97 GL_FRAGMENT_SHADER); | 97 GL_FRAGMENT_SHADER); |
| 98 ASSERT_TRUE(vertex_shader_ != NULL); | 98 ASSERT_TRUE(vertex_shader_ != NULL); |
| 99 ASSERT_TRUE(fragment_shader_ != NULL); | 99 ASSERT_TRUE(fragment_shader_ != NULL); |
| 100 AttributeMap vertex_attrib_map; | 100 AttributeMap vertex_attrib_map; |
| 101 UniformMap vertex_uniform_map; | 101 UniformMap vertex_uniform_map; |
| 102 VaryingMap vertex_varying_map; | 102 VaryingMap vertex_varying_map; |
| 103 AttributeList vertex_output_variable_list; |
| 103 AttributeMap fragment_attrib_map; | 104 AttributeMap fragment_attrib_map; |
| 104 UniformMap fragment_uniform_map; | 105 UniformMap fragment_uniform_map; |
| 105 VaryingMap fragment_varying_map; | 106 VaryingMap fragment_varying_map; |
| 107 AttributeList fragment_output_variable_list; |
| 106 | 108 |
| 107 vertex_attrib_map["a"] = TestHelper::ConstructAttribute( | 109 vertex_attrib_map["a"] = TestHelper::ConstructAttribute( |
| 108 GL_FLOAT_VEC2, 34, GL_LOW_FLOAT, false, "a"); | 110 GL_FLOAT_VEC2, 34, GL_LOW_FLOAT, false, "a"); |
| 109 vertex_uniform_map["a"] = TestHelper::ConstructUniform( | 111 vertex_uniform_map["a"] = TestHelper::ConstructUniform( |
| 110 GL_FLOAT, 10, GL_MEDIUM_FLOAT, true, "a"); | 112 GL_FLOAT, 10, GL_MEDIUM_FLOAT, true, "a"); |
| 111 vertex_uniform_map["b"] = TestHelper::ConstructUniform( | 113 vertex_uniform_map["b"] = TestHelper::ConstructUniform( |
| 112 GL_FLOAT_VEC3, 3114, GL_HIGH_FLOAT, true, "b"); | 114 GL_FLOAT_VEC3, 3114, GL_HIGH_FLOAT, true, "b"); |
| 113 vertex_varying_map["c"] = TestHelper::ConstructVarying( | 115 vertex_varying_map["c"] = TestHelper::ConstructVarying( |
| 114 GL_FLOAT_VEC4, 2, GL_HIGH_FLOAT, true, "c"); | 116 GL_FLOAT_VEC4, 2, GL_HIGH_FLOAT, true, "c"); |
| 117 vertex_output_variable_list.push_back( |
| 118 TestHelper::ConstructAttribute(GL_FLOAT, 0, GL_HIGH_FLOAT, true, "d")); |
| 115 fragment_attrib_map["jjjbb"] = TestHelper::ConstructAttribute( | 119 fragment_attrib_map["jjjbb"] = TestHelper::ConstructAttribute( |
| 116 GL_FLOAT_MAT4, 1114, GL_MEDIUM_FLOAT, false, "jjjbb"); | 120 GL_FLOAT_MAT4, 1114, GL_MEDIUM_FLOAT, false, "jjjbb"); |
| 117 fragment_uniform_map["k"] = TestHelper::ConstructUniform( | 121 fragment_uniform_map["k"] = TestHelper::ConstructUniform( |
| 118 GL_FLOAT_MAT2, 34413, GL_MEDIUM_FLOAT, true, "k"); | 122 GL_FLOAT_MAT2, 34413, GL_MEDIUM_FLOAT, true, "k"); |
| 119 fragment_varying_map["c"] = TestHelper::ConstructVarying( | 123 fragment_varying_map["c"] = TestHelper::ConstructVarying( |
| 120 GL_FLOAT_VEC4, 2, GL_HIGH_FLOAT, true, "c"); | 124 GL_FLOAT_VEC4, 2, GL_HIGH_FLOAT, true, "c"); |
| 125 fragment_output_variable_list.push_back( |
| 126 TestHelper::ConstructAttribute(GL_FLOAT, 0, GL_HIGH_FLOAT, true, "d")); |
| 121 | 127 |
| 122 vertex_shader_->set_source("bbbalsldkdkdkd"); | 128 vertex_shader_->set_source("bbbalsldkdkdkd"); |
| 123 fragment_shader_->set_source("bbbal sldkdkdkas 134 ad"); | 129 fragment_shader_->set_source("bbbal sldkdkdkas 134 ad"); |
| 124 | 130 |
| 125 TestHelper::SetShaderStates( | 131 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true, NULL, NULL, |
| 126 gl_.get(), vertex_shader_, true, NULL, NULL, NULL, | 132 NULL, &vertex_attrib_map, &vertex_uniform_map, |
| 127 &vertex_attrib_map, &vertex_uniform_map, &vertex_varying_map, | 133 &vertex_varying_map, |
| 128 NULL); | 134 &vertex_output_variable_list, NULL); |
| 129 TestHelper::SetShaderStates( | 135 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true, NULL, NULL, |
| 130 gl_.get(), fragment_shader_, true, NULL, NULL, NULL, | 136 NULL, &fragment_attrib_map, |
| 131 &fragment_attrib_map, &fragment_uniform_map, &fragment_varying_map, | 137 &fragment_uniform_map, &fragment_varying_map, |
| 132 NULL); | 138 &fragment_output_variable_list, NULL); |
| 133 } | 139 } |
| 134 | 140 |
| 135 void SetExpectationsForSaveLinkedProgram( | 141 void SetExpectationsForSaveLinkedProgram( |
| 136 const GLint program_id, | 142 const GLint program_id, |
| 137 ProgramBinaryEmulator* emulator) const { | 143 ProgramBinaryEmulator* emulator) const { |
| 138 EXPECT_CALL(*gl_.get(), | 144 EXPECT_CALL(*gl_.get(), |
| 139 GetProgramiv(program_id, GL_PROGRAM_BINARY_LENGTH_OES, _)) | 145 GetProgramiv(program_id, GL_PROGRAM_BINARY_LENGTH_OES, _)) |
| 140 .WillOnce(SetArgPointee<2>(emulator->length())); | 146 .WillOnce(SetArgPointee<2>(emulator->length())); |
| 141 EXPECT_CALL(*gl_.get(), | 147 EXPECT_CALL(*gl_.get(), |
| 142 GetProgramBinary(program_id, emulator->length(), _, _, _)) | 148 GetProgramBinary(program_id, emulator->length(), _, _, _)) |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 253 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
| 248 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 254 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
| 249 fragment_shader_, NULL, varyings_, GL_NONE, | 255 fragment_shader_, NULL, varyings_, GL_NONE, |
| 250 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 256 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
| 251 base::Unretained(this))); | 257 base::Unretained(this))); |
| 252 EXPECT_EQ(1, shader_cache_count()); | 258 EXPECT_EQ(1, shader_cache_count()); |
| 253 | 259 |
| 254 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); | 260 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); |
| 255 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); | 261 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); |
| 256 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); | 262 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); |
| 263 AttributeList vertex_output_variable_list = |
| 264 vertex_shader_->output_variable_list(); |
| 257 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); | 265 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); |
| 258 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); | 266 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); |
| 259 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); | 267 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); |
| 268 AttributeList fragment_output_variable_list = |
| 269 fragment_shader_->output_variable_list(); |
| 260 | 270 |
| 261 vertex_shader_->set_attrib_map(AttributeMap()); | 271 vertex_shader_->set_attrib_map(AttributeMap()); |
| 262 vertex_shader_->set_uniform_map(UniformMap()); | 272 vertex_shader_->set_uniform_map(UniformMap()); |
| 263 vertex_shader_->set_varying_map(VaryingMap()); | 273 vertex_shader_->set_varying_map(VaryingMap()); |
| 274 vertex_shader_->set_output_variable_list(AttributeList()); |
| 264 fragment_shader_->set_attrib_map(AttributeMap()); | 275 fragment_shader_->set_attrib_map(AttributeMap()); |
| 265 fragment_shader_->set_uniform_map(UniformMap()); | 276 fragment_shader_->set_uniform_map(UniformMap()); |
| 266 fragment_shader_->set_varying_map(VaryingMap()); | 277 fragment_shader_->set_varying_map(VaryingMap()); |
| 267 | 278 fragment_shader_->set_output_variable_list(AttributeList()); |
| 268 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); | 279 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); |
| 269 | 280 |
| 270 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( | 281 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( |
| 271 kProgramId, | 282 kProgramId, |
| 272 vertex_shader_, | 283 vertex_shader_, |
| 273 fragment_shader_, | 284 fragment_shader_, |
| 274 NULL, | 285 NULL, |
| 275 varyings_, | 286 varyings_, |
| 276 GL_NONE, | 287 GL_NONE, |
| 277 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 288 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
| 278 base::Unretained(this)))); | 289 base::Unretained(this)))); |
| 279 | 290 |
| 280 // apparently the hash_map implementation on android doesn't have the | 291 // apparently the hash_map implementation on android doesn't have the |
| 281 // equality operator | 292 // equality operator |
| 282 #if !defined(OS_ANDROID) | 293 #if !defined(OS_ANDROID) |
| 283 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); | 294 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); |
| 284 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); | 295 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); |
| 285 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); | 296 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); |
| 297 EXPECT_EQ(vertex_output_variable_list, |
| 298 vertex_shader_->output_variable_list()); |
| 286 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); | 299 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); |
| 287 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); | 300 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); |
| 288 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); | 301 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); |
| 302 EXPECT_EQ(fragment_output_variable_list, |
| 303 fragment_shader_->output_variable_list()); |
| 289 #endif | 304 #endif |
| 290 } | 305 } |
| 291 | 306 |
| 292 TEST_F(MemoryProgramCacheTest, LoadProgramMatchesSave) { | 307 TEST_F(MemoryProgramCacheTest, LoadProgramMatchesSave) { |
| 293 const GLenum kFormat = 1; | 308 const GLenum kFormat = 1; |
| 294 const int kProgramId = 10; | 309 const int kProgramId = 10; |
| 295 const int kBinaryLength = 20; | 310 const int kBinaryLength = 20; |
| 296 char test_binary[kBinaryLength]; | 311 char test_binary[kBinaryLength]; |
| 297 for (int i = 0; i < kBinaryLength; ++i) { | 312 for (int i = 0; i < kBinaryLength; ++i) { |
| 298 test_binary[i] = i; | 313 test_binary[i] = i; |
| 299 } | 314 } |
| 300 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 315 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
| 301 | 316 |
| 302 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 317 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
| 303 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, | 318 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
| 304 fragment_shader_, NULL, varyings_, GL_NONE, | 319 fragment_shader_, NULL, varyings_, GL_NONE, |
| 305 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 320 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
| 306 base::Unretained(this))); | 321 base::Unretained(this))); |
| 307 EXPECT_EQ(1, shader_cache_count()); | 322 EXPECT_EQ(1, shader_cache_count()); |
| 308 | 323 |
| 309 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); | 324 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); |
| 310 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); | 325 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); |
| 311 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); | 326 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); |
| 327 AttributeList vertex_output_variable_list = |
| 328 vertex_shader_->output_variable_list(); |
| 312 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); | 329 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); |
| 313 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); | 330 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); |
| 314 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); | 331 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); |
| 332 AttributeList fragment_output_variable_list = |
| 333 fragment_shader_->output_variable_list(); |
| 315 | 334 |
| 316 vertex_shader_->set_attrib_map(AttributeMap()); | 335 vertex_shader_->set_attrib_map(AttributeMap()); |
| 317 vertex_shader_->set_uniform_map(UniformMap()); | 336 vertex_shader_->set_uniform_map(UniformMap()); |
| 318 vertex_shader_->set_varying_map(VaryingMap()); | 337 vertex_shader_->set_varying_map(VaryingMap()); |
| 338 vertex_shader_->set_output_variable_list(AttributeList()); |
| 319 fragment_shader_->set_attrib_map(AttributeMap()); | 339 fragment_shader_->set_attrib_map(AttributeMap()); |
| 320 fragment_shader_->set_uniform_map(UniformMap()); | 340 fragment_shader_->set_uniform_map(UniformMap()); |
| 321 fragment_shader_->set_varying_map(VaryingMap()); | 341 fragment_shader_->set_varying_map(VaryingMap()); |
| 342 fragment_shader_->set_output_variable_list(AttributeList()); |
| 322 | 343 |
| 323 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); | 344 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); |
| 324 | 345 |
| 325 cache_->Clear(); | 346 cache_->Clear(); |
| 326 cache_->LoadProgram(shader_cache_shader()); | 347 cache_->LoadProgram(shader_cache_shader()); |
| 327 | 348 |
| 328 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( | 349 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( |
| 329 kProgramId, | 350 kProgramId, |
| 330 vertex_shader_, | 351 vertex_shader_, |
| 331 fragment_shader_, | 352 fragment_shader_, |
| 332 NULL, | 353 NULL, |
| 333 varyings_, | 354 varyings_, |
| 334 GL_NONE, | 355 GL_NONE, |
| 335 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 356 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
| 336 base::Unretained(this)))); | 357 base::Unretained(this)))); |
| 337 | 358 |
| 338 // apparently the hash_map implementation on android doesn't have the | 359 // apparently the hash_map implementation on android doesn't have the |
| 339 // equality operator | 360 // equality operator |
| 340 #if !defined(OS_ANDROID) | 361 #if !defined(OS_ANDROID) |
| 341 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); | 362 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); |
| 342 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); | 363 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); |
| 343 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); | 364 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); |
| 365 EXPECT_EQ(vertex_output_variable_list, |
| 366 vertex_shader_->output_variable_list()); |
| 344 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); | 367 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); |
| 345 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); | 368 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); |
| 346 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); | 369 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); |
| 370 EXPECT_EQ(fragment_output_variable_list, |
| 371 fragment_shader_->output_variable_list()); |
| 347 #endif | 372 #endif |
| 348 } | 373 } |
| 349 | 374 |
| 350 TEST_F(MemoryProgramCacheTest, LoadFailOnLinkFalse) { | 375 TEST_F(MemoryProgramCacheTest, LoadFailOnLinkFalse) { |
| 351 const GLenum kFormat = 1; | 376 const GLenum kFormat = 1; |
| 352 const int kProgramId = 10; | 377 const int kProgramId = 10; |
| 353 const int kBinaryLength = 20; | 378 const int kBinaryLength = 20; |
| 354 char test_binary[kBinaryLength]; | 379 char test_binary[kBinaryLength]; |
| 355 for (int i = 0; i < kBinaryLength; ++i) { | 380 for (int i = 0; i < kBinaryLength; ++i) { |
| 356 test_binary[i] = i; | 381 test_binary[i] = i; |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 652 fragment_shader_, | 677 fragment_shader_, |
| 653 NULL, | 678 NULL, |
| 654 varyings_, | 679 varyings_, |
| 655 GL_NONE, | 680 GL_NONE, |
| 656 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 681 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
| 657 base::Unretained(this)))); | 682 base::Unretained(this)))); |
| 658 } | 683 } |
| 659 | 684 |
| 660 } // namespace gles2 | 685 } // namespace gles2 |
| 661 } // namespace gpu | 686 } // namespace gpu |
| OLD | NEW |