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 OutputVariableList 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 OutputVariableList 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(TestHelper::ConstructOutputVariable( |
| 118 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(TestHelper::ConstructOutputVariable( |
| 126 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 |
| 131 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true, nullptr, |
| 132 nullptr, nullptr, &vertex_attrib_map, |
| 133 &vertex_uniform_map, &vertex_varying_map, |
| 134 nullptr, &vertex_output_variable_list, nullptr); |
125 TestHelper::SetShaderStates( | 135 TestHelper::SetShaderStates( |
126 gl_.get(), vertex_shader_, true, NULL, NULL, NULL, | 136 gl_.get(), fragment_shader_, true, nullptr, nullptr, nullptr, |
127 &vertex_attrib_map, &vertex_uniform_map, &vertex_varying_map, | |
128 NULL, NULL); | |
129 TestHelper::SetShaderStates( | |
130 gl_.get(), fragment_shader_, true, NULL, NULL, NULL, | |
131 &fragment_attrib_map, &fragment_uniform_map, &fragment_varying_map, | 137 &fragment_attrib_map, &fragment_uniform_map, &fragment_varying_map, |
132 NULL, NULL); | 138 nullptr, &fragment_output_variable_list, nullptr); |
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 OutputVariableList 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 OutputVariableList 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(OutputVariableList()); |
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(OutputVariableList()); |
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 OutputVariableList 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 OutputVariableList 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(OutputVariableList()); |
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(OutputVariableList()); |
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 |