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/program_manager.h" | 5 #include "gpu/command_buffer/service/program_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
11 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
13 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 13 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
14 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 14 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
15 #include "gpu/command_buffer/service/common_decoder.h" | 15 #include "gpu/command_buffer/service/common_decoder.h" |
16 #include "gpu/command_buffer/service/feature_info.h" | 16 #include "gpu/command_buffer/service/feature_info.h" |
17 #include "gpu/command_buffer/service/gpu_service_test.h" | 17 #include "gpu/command_buffer/service/gpu_service_test.h" |
18 #include "gpu/command_buffer/service/gpu_switches.h" | 18 #include "gpu/command_buffer/service/gpu_switches.h" |
19 #include "gpu/command_buffer/service/mocks.h" | 19 #include "gpu/command_buffer/service/mocks.h" |
20 #include "gpu/command_buffer/service/shader_manager.h" | 20 #include "gpu/command_buffer/service/shader_manager.h" |
21 #include "gpu/command_buffer/service/test_helper.h" | 21 #include "gpu/command_buffer/service/test_helper.h" |
22 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
23 #include "ui/gl/gl_mock.h" | 23 #include "ui/gl/gl_mock.h" |
| 24 #include "ui/gl/gl_version_info.h" |
24 | 25 |
25 using ::testing::_; | 26 using ::testing::_; |
26 using ::testing::DoAll; | 27 using ::testing::DoAll; |
27 using ::testing::InSequence; | 28 using ::testing::InSequence; |
28 using ::testing::MatcherCast; | 29 using ::testing::MatcherCast; |
29 using ::testing::Pointee; | 30 using ::testing::Pointee; |
30 using ::testing::Return; | 31 using ::testing::Return; |
31 using ::testing::ReturnRef; | 32 using ::testing::ReturnRef; |
32 using ::testing::SetArrayArgument; | 33 using ::testing::SetArrayArgument; |
33 using ::testing::SetArgPointee; | 34 using ::testing::SetArgPointee; |
34 using ::testing::StrEq; | 35 using ::testing::StrEq; |
35 | 36 |
36 namespace gpu { | 37 namespace gpu { |
37 namespace gles2 { | 38 namespace gles2 { |
38 | 39 |
39 namespace { | 40 namespace { |
40 const uint32 kMaxVaryingVectors = 8; | 41 const uint32 kMaxVaryingVectors = 8; |
| 42 const uint32 kMaxDrawBuffers = 8; |
| 43 const uint32 kMaxDualSourceDrawBuffers = 8; |
41 | 44 |
42 void ShaderCacheCb(const std::string& key, const std::string& shader) {} | 45 void ShaderCacheCb(const std::string& key, const std::string& shader) {} |
43 | 46 |
44 uint32 ComputeOffset(const void* start, const void* position) { | 47 uint32 ComputeOffset(const void* start, const void* position) { |
45 return static_cast<const uint8*>(position) - | 48 return static_cast<const uint8*>(position) - |
46 static_cast<const uint8*>(start); | 49 static_cast<const uint8*>(start); |
47 } | 50 } |
48 | 51 |
49 } // namespace anonymous | 52 } // namespace anonymous |
50 | 53 |
51 class ProgramManagerTestBase : public GpuServiceTest { | 54 class ProgramManagerTestBase : public GpuServiceTest { |
52 protected: | 55 protected: |
53 virtual void SetupProgramManager() { | 56 virtual void SetupProgramManager() { |
54 manager_.reset( | 57 manager_.reset(new ProgramManager(nullptr, kMaxVaryingVectors, |
55 new ProgramManager(NULL, kMaxVaryingVectors, feature_info_.get())); | 58 kMaxDualSourceDrawBuffers, |
| 59 feature_info_.get())); |
56 } | 60 } |
57 void SetUpBase(const char* gl_version, | 61 void SetUpBase(const char* gl_version, |
58 const char* gl_extensions, | 62 const char* gl_extensions, |
59 FeatureInfo* feature_info = NULL) { | 63 FeatureInfo* feature_info = NULL) { |
60 GpuServiceTest::SetUpWithGLVersion(gl_version, gl_extensions); | 64 GpuServiceTest::SetUpWithGLVersion(gl_version, gl_extensions); |
61 TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( | 65 TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( |
62 gl_.get(), gl_extensions, "", gl_version); | 66 gl_.get(), gl_extensions, "", gl_version); |
63 if (!feature_info) | 67 if (!feature_info) |
64 feature_info = new FeatureInfo(); | 68 feature_info = new FeatureInfo(); |
65 feature_info->InitializeForTesting(); | 69 feature_info->InitializeForTesting(); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 static const GLint kUniform3RealLocation = 33; | 212 static const GLint kUniform3RealLocation = 33; |
209 static const GLint kUniform1DesiredLocation = -1; | 213 static const GLint kUniform1DesiredLocation = -1; |
210 static const GLint kUniform2DesiredLocation = -1; | 214 static const GLint kUniform2DesiredLocation = -1; |
211 static const GLint kUniform3DesiredLocation = -1; | 215 static const GLint kUniform3DesiredLocation = -1; |
212 static const GLenum kUniform1Type = GL_FLOAT_VEC4; | 216 static const GLenum kUniform1Type = GL_FLOAT_VEC4; |
213 static const GLenum kUniform2Type = GL_INT_VEC2; | 217 static const GLenum kUniform2Type = GL_INT_VEC2; |
214 static const GLenum kUniform3Type = GL_FLOAT_VEC3; | 218 static const GLenum kUniform3Type = GL_FLOAT_VEC3; |
215 static const GLint kInvalidUniformLocation = 30; | 219 static const GLint kInvalidUniformLocation = 30; |
216 static const GLint kBadUniformIndex = 1000; | 220 static const GLint kBadUniformIndex = 1000; |
217 | 221 |
| 222 static const char* kOutputVariable1Name; |
| 223 static const GLint kOutputVariable1Size = 1; |
| 224 static const GLenum kOutputVariable1Precision = GL_MEDIUM_FLOAT; |
| 225 static const bool kOutputVariable1StaticUse = true; |
| 226 static const GLint kOutputVariable1Location = -1; |
| 227 static const GLenum kOutputVariable1Type = GL_FLOAT_VEC4; |
| 228 |
218 static const size_t kNumAttribs; | 229 static const size_t kNumAttribs; |
219 static const size_t kNumUniforms; | 230 static const size_t kNumUniforms; |
220 | 231 |
221 protected: | 232 protected: |
222 typedef TestHelper::AttribInfo AttribInfo; | 233 typedef TestHelper::AttribInfo AttribInfo; |
223 typedef TestHelper::UniformInfo UniformInfo; | 234 typedef TestHelper::UniformInfo UniformInfo; |
224 | 235 |
225 typedef enum { | 236 typedef enum { |
226 kVarUniform, | 237 kVarUniform, |
227 kVarVarying, | 238 kVarVarying, |
228 kVarAttribute | 239 kVarAttribute, |
| 240 kVarOutput, |
229 } VarCategory; | 241 } VarCategory; |
230 | 242 |
231 typedef struct { | 243 typedef struct { |
232 GLenum type; | 244 GLenum type; |
233 GLint size; | 245 GLint size; |
234 GLenum precision; | 246 GLenum precision; |
235 bool static_use; | 247 bool static_use; |
236 std::string name; | 248 std::string name; |
237 VarCategory category; | 249 VarCategory category; |
238 } VarInfo; | 250 } VarInfo; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 SetupShaderExpectations(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 304 SetupShaderExpectations(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
293 service_id); | 305 service_id); |
294 } | 306 } |
295 program->Link(NULL, Program::kCountOnlyStaticallyUsed, | 307 program->Link(NULL, Program::kCountOnlyStaticallyUsed, |
296 base::Bind(&ShaderCacheCb)); | 308 base::Bind(&ShaderCacheCb)); |
297 GLint link_status; | 309 GLint link_status; |
298 program->GetProgramiv(GL_LINK_STATUS, &link_status); | 310 program->GetProgramiv(GL_LINK_STATUS, &link_status); |
299 return (static_cast<bool>(link_status) == expected_link_status); | 311 return (static_cast<bool>(link_status) == expected_link_status); |
300 } | 312 } |
301 | 313 |
302 Program* SetupShaderVariableTest(const VarInfo* vertex_variables, | 314 Program* SetupProgramForVariables(const VarInfo* vertex_variables, |
303 size_t vertex_variable_size, | 315 size_t vertex_variable_size, |
304 const VarInfo* fragment_variables, | 316 const VarInfo* fragment_variables, |
305 size_t fragment_variable_size) { | 317 size_t fragment_variable_size, |
| 318 const int* const shader_version = nullptr) { |
306 // Set up shader | 319 // Set up shader |
307 AttributeMap vertex_attrib_map; | 320 AttributeMap vertex_attrib_map; |
308 UniformMap vertex_uniform_map; | 321 UniformMap vertex_uniform_map; |
309 VaryingMap vertex_varying_map; | 322 VaryingMap vertex_varying_map; |
| 323 OutputVariableList vertex_output_variable_list; |
310 for (size_t ii = 0; ii < vertex_variable_size; ++ii) { | 324 for (size_t ii = 0; ii < vertex_variable_size; ++ii) { |
311 switch (vertex_variables[ii].category) { | 325 switch (vertex_variables[ii].category) { |
312 case kVarAttribute: | 326 case kVarAttribute: |
313 vertex_attrib_map[vertex_variables[ii].name] = | 327 vertex_attrib_map[vertex_variables[ii].name] = |
314 TestHelper::ConstructAttribute( | 328 TestHelper::ConstructAttribute( |
315 vertex_variables[ii].type, | 329 vertex_variables[ii].type, |
316 vertex_variables[ii].size, | 330 vertex_variables[ii].size, |
317 vertex_variables[ii].precision, | 331 vertex_variables[ii].precision, |
318 vertex_variables[ii].static_use, | 332 vertex_variables[ii].static_use, |
319 vertex_variables[ii].name); | 333 vertex_variables[ii].name); |
320 break; | 334 break; |
321 case kVarUniform: | 335 case kVarUniform: |
322 vertex_uniform_map[vertex_variables[ii].name] = | 336 vertex_uniform_map[vertex_variables[ii].name] = |
323 TestHelper::ConstructUniform( | 337 TestHelper::ConstructUniform( |
324 vertex_variables[ii].type, | 338 vertex_variables[ii].type, |
325 vertex_variables[ii].size, | 339 vertex_variables[ii].size, |
326 vertex_variables[ii].precision, | 340 vertex_variables[ii].precision, |
327 vertex_variables[ii].static_use, | 341 vertex_variables[ii].static_use, |
328 vertex_variables[ii].name); | 342 vertex_variables[ii].name); |
329 break; | 343 break; |
330 case kVarVarying: | 344 case kVarVarying: |
331 vertex_varying_map[vertex_variables[ii].name] = | 345 vertex_varying_map[vertex_variables[ii].name] = |
332 TestHelper::ConstructVarying( | 346 TestHelper::ConstructVarying( |
333 vertex_variables[ii].type, | 347 vertex_variables[ii].type, |
334 vertex_variables[ii].size, | 348 vertex_variables[ii].size, |
335 vertex_variables[ii].precision, | 349 vertex_variables[ii].precision, |
336 vertex_variables[ii].static_use, | 350 vertex_variables[ii].static_use, |
337 vertex_variables[ii].name); | 351 vertex_variables[ii].name); |
338 break; | 352 break; |
| 353 case kVarOutput: |
| 354 vertex_output_variable_list.push_back( |
| 355 TestHelper::ConstructOutputVariable( |
| 356 vertex_variables[ii].type, vertex_variables[ii].size, |
| 357 vertex_variables[ii].precision, |
| 358 vertex_variables[ii].static_use, vertex_variables[ii].name)); |
| 359 break; |
339 default: | 360 default: |
340 NOTREACHED(); | 361 NOTREACHED(); |
341 } | 362 } |
342 } | 363 } |
343 | 364 |
344 AttributeMap frag_attrib_map; | 365 AttributeMap frag_attrib_map; |
345 UniformMap frag_uniform_map; | 366 UniformMap frag_uniform_map; |
346 VaryingMap frag_varying_map; | 367 VaryingMap frag_varying_map; |
| 368 OutputVariableList frag_output_variable_list; |
347 for (size_t ii = 0; ii < fragment_variable_size; ++ii) { | 369 for (size_t ii = 0; ii < fragment_variable_size; ++ii) { |
348 switch (fragment_variables[ii].category) { | 370 switch (fragment_variables[ii].category) { |
349 case kVarAttribute: | 371 case kVarAttribute: |
350 frag_attrib_map[fragment_variables[ii].name] = | 372 frag_attrib_map[fragment_variables[ii].name] = |
351 TestHelper::ConstructAttribute( | 373 TestHelper::ConstructAttribute( |
352 fragment_variables[ii].type, | 374 fragment_variables[ii].type, |
353 fragment_variables[ii].size, | 375 fragment_variables[ii].size, |
354 fragment_variables[ii].precision, | 376 fragment_variables[ii].precision, |
355 fragment_variables[ii].static_use, | 377 fragment_variables[ii].static_use, |
356 fragment_variables[ii].name); | 378 fragment_variables[ii].name); |
357 break; | 379 break; |
358 case kVarUniform: | 380 case kVarUniform: |
359 frag_uniform_map[fragment_variables[ii].name] = | 381 frag_uniform_map[fragment_variables[ii].name] = |
360 TestHelper::ConstructUniform( | 382 TestHelper::ConstructUniform( |
361 fragment_variables[ii].type, | 383 fragment_variables[ii].type, |
362 fragment_variables[ii].size, | 384 fragment_variables[ii].size, |
363 fragment_variables[ii].precision, | 385 fragment_variables[ii].precision, |
364 fragment_variables[ii].static_use, | 386 fragment_variables[ii].static_use, |
365 fragment_variables[ii].name); | 387 fragment_variables[ii].name); |
366 break; | 388 break; |
367 case kVarVarying: | 389 case kVarVarying: |
368 frag_varying_map[fragment_variables[ii].name] = | 390 frag_varying_map[fragment_variables[ii].name] = |
369 TestHelper::ConstructVarying( | 391 TestHelper::ConstructVarying( |
370 fragment_variables[ii].type, | 392 fragment_variables[ii].type, |
371 fragment_variables[ii].size, | 393 fragment_variables[ii].size, |
372 fragment_variables[ii].precision, | 394 fragment_variables[ii].precision, |
373 fragment_variables[ii].static_use, | 395 fragment_variables[ii].static_use, |
374 fragment_variables[ii].name); | 396 fragment_variables[ii].name); |
375 break; | 397 break; |
| 398 case kVarOutput: |
| 399 frag_output_variable_list.push_back( |
| 400 TestHelper::ConstructOutputVariable( |
| 401 fragment_variables[ii].type, fragment_variables[ii].size, |
| 402 fragment_variables[ii].precision, |
| 403 fragment_variables[ii].static_use, |
| 404 fragment_variables[ii].name)); |
| 405 break; |
376 default: | 406 default: |
377 NOTREACHED(); | 407 NOTREACHED(); |
378 } | 408 } |
379 } | 409 } |
380 | 410 |
381 // Check we can create shader. | 411 // Check we can create shader. |
382 Shader* vshader = shader_manager_.CreateShader( | 412 Shader* vshader = shader_manager_.CreateShader( |
383 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 413 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
384 Shader* fshader = shader_manager_.CreateShader( | 414 Shader* fshader = shader_manager_.CreateShader( |
385 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 415 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
386 // Check shader got created. | 416 // Check shader got created. |
387 EXPECT_TRUE(vshader != NULL && fshader != NULL); | 417 EXPECT_TRUE(vshader != NULL && fshader != NULL); |
388 // Set Status | 418 // Set Status |
389 TestHelper::SetShaderStates( | 419 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
390 gl_.get(), vshader, true, NULL, NULL, NULL, &vertex_attrib_map, | 420 shader_version, &vertex_attrib_map, |
391 &vertex_uniform_map, &vertex_varying_map, NULL, NULL); | 421 &vertex_uniform_map, &vertex_varying_map, |
392 TestHelper::SetShaderStates( | 422 nullptr, &vertex_output_variable_list, nullptr); |
393 gl_.get(), fshader, true, NULL, NULL, NULL, | 423 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
394 &frag_attrib_map, &frag_uniform_map, &frag_varying_map, NULL, NULL); | 424 shader_version, &frag_attrib_map, |
| 425 &frag_uniform_map, &frag_varying_map, nullptr, |
| 426 &frag_output_variable_list, nullptr); |
395 | 427 |
396 // Set up program | 428 // Set up program |
397 Program* program = | 429 Program* program = |
398 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 430 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
399 EXPECT_TRUE(program != NULL); | 431 EXPECT_TRUE(program != NULL); |
400 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 432 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
401 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 433 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
402 return program; | 434 return program; |
403 } | 435 } |
404 | 436 |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1"; | 527 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1"; |
496 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2"; | 528 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2"; |
497 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3"; | 529 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3"; |
498 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1"; | 530 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1"; |
499 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2"; | 531 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2"; |
500 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex = | 532 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex = |
501 "uniform2[0]"; | 533 "uniform2[0]"; |
502 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3"; | 534 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3"; |
503 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex = | 535 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex = |
504 "uniform3[0]"; | 536 "uniform3[0]"; |
| 537 const char* ProgramManagerWithShaderTest::kOutputVariable1Name = "outputVar1"; |
505 | 538 |
506 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) { | 539 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) { |
507 const Program* program = SetupDefaultProgram(); | 540 const Program* program = SetupDefaultProgram(); |
508 ASSERT_TRUE(program != NULL); | 541 ASSERT_TRUE(program != NULL); |
509 const Program::AttribInfoVector& infos = | 542 const Program::AttribInfoVector& infos = |
510 program->GetAttribInfos(); | 543 program->GetAttribInfos(); |
511 ASSERT_EQ(kNumAttribs, infos.size()); | 544 ASSERT_EQ(kNumAttribs, infos.size()); |
512 for (size_t ii = 0; ii < kNumAttribs; ++ii) { | 545 for (size_t ii = 0; ii < kNumAttribs; ++ii) { |
513 const Program::VertexAttrib& info = infos[ii]; | 546 const Program::VertexAttrib& info = infos[ii]; |
514 const AttribInfo& expected = kAttribs[ii]; | 547 const AttribInfo& expected = kAttribs[ii]; |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 // Some GL drivers incorrectly return the wrong type. For example they return | 831 // Some GL drivers incorrectly return the wrong type. For example they return |
799 // GL_FLOAT_VEC2 when they should return GL_FLOAT_MAT2. Check we handle this. | 832 // GL_FLOAT_VEC2 when they should return GL_FLOAT_MAT2. Check we handle this. |
800 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) { | 833 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) { |
801 static GLenum kAttrib2BadType = GL_FLOAT_VEC2; | 834 static GLenum kAttrib2BadType = GL_FLOAT_VEC2; |
802 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2; | 835 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2; |
803 static GLenum kUniform2BadType = GL_FLOAT_VEC3; | 836 static GLenum kUniform2BadType = GL_FLOAT_VEC3; |
804 static GLenum kUniform2GoodType = GL_FLOAT_MAT3; | 837 static GLenum kUniform2GoodType = GL_FLOAT_MAT3; |
805 AttributeMap attrib_map; | 838 AttributeMap attrib_map; |
806 UniformMap uniform_map; | 839 UniformMap uniform_map; |
807 VaryingMap varying_map; | 840 VaryingMap varying_map; |
| 841 OutputVariableList output_variable_list; |
808 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute( | 842 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute( |
809 kAttrib1Type, kAttrib1Size, kAttrib1Precision, | 843 kAttrib1Type, kAttrib1Size, kAttrib1Precision, |
810 kAttribStaticUse, kAttrib1Name); | 844 kAttribStaticUse, kAttrib1Name); |
811 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute( | 845 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute( |
812 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision, | 846 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision, |
813 kAttribStaticUse, kAttrib2Name); | 847 kAttribStaticUse, kAttrib2Name); |
814 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute( | 848 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute( |
815 kAttrib3Type, kAttrib3Size, kAttrib3Precision, | 849 kAttrib3Type, kAttrib3Size, kAttrib3Precision, |
816 kAttribStaticUse, kAttrib3Name); | 850 kAttribStaticUse, kAttrib3Name); |
817 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( | 851 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( |
818 kUniform1Type, kUniform1Size, kUniform1Precision, | 852 kUniform1Type, kUniform1Size, kUniform1Precision, |
819 kUniform1StaticUse, kUniform1Name); | 853 kUniform1StaticUse, kUniform1Name); |
820 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( | 854 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( |
821 kUniform2GoodType, kUniform2Size, kUniform2Precision, | 855 kUniform2GoodType, kUniform2Size, kUniform2Precision, |
822 kUniform2StaticUse, kUniform2Name); | 856 kUniform2StaticUse, kUniform2Name); |
823 uniform_map[kUniform3Name] = TestHelper::ConstructUniform( | 857 uniform_map[kUniform3Name] = TestHelper::ConstructUniform( |
824 kUniform3Type, kUniform3Size, kUniform3Precision, | 858 kUniform3Type, kUniform3Size, kUniform3Precision, |
825 kUniform3StaticUse, kUniform3Name); | 859 kUniform3StaticUse, kUniform3Name); |
| 860 output_variable_list.push_back(TestHelper::ConstructOutputVariable( |
| 861 kOutputVariable1Type, kOutputVariable1Size, kOutputVariable1Precision, |
| 862 kOutputVariable1StaticUse, kOutputVariable1Name)); |
| 863 |
826 Shader* vshader = shader_manager_.CreateShader( | 864 Shader* vshader = shader_manager_.CreateShader( |
827 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 865 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
828 ASSERT_TRUE(vshader != NULL); | 866 ASSERT_TRUE(vshader != NULL); |
829 TestHelper::SetShaderStates( | 867 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
830 gl_.get(), vshader, true, NULL, NULL, NULL, | 868 nullptr, &attrib_map, &uniform_map, &varying_map, |
831 &attrib_map, &uniform_map, &varying_map, NULL, NULL); | 869 nullptr, &output_variable_list, nullptr); |
832 Shader* fshader = shader_manager_.CreateShader( | 870 Shader* fshader = shader_manager_.CreateShader( |
833 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 871 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
834 ASSERT_TRUE(fshader != NULL); | 872 ASSERT_TRUE(fshader != NULL); |
835 TestHelper::SetShaderStates( | 873 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
836 gl_.get(), fshader, true, NULL, NULL, NULL, | 874 nullptr, &attrib_map, &uniform_map, &varying_map, |
837 &attrib_map, &uniform_map, &varying_map, NULL, NULL); | 875 nullptr, &output_variable_list, nullptr); |
838 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = { | 876 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = { |
839 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, | 877 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, |
840 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, }, | 878 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, }, |
841 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, | 879 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, |
842 }; | 880 }; |
843 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = { | 881 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = { |
844 { kUniform1Name, | 882 { kUniform1Name, |
845 kUniform1Size, | 883 kUniform1Size, |
846 kUniform1Type, | 884 kUniform1Type, |
847 kUniform1FakeLocation, | 885 kUniform1FakeLocation, |
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1490 kAttribStaticUse, | 1528 kAttribStaticUse, |
1491 kAttribMatName); | 1529 kAttribMatName); |
1492 // Check we can create shader. | 1530 // Check we can create shader. |
1493 Shader* vshader = shader_manager_.CreateShader( | 1531 Shader* vshader = shader_manager_.CreateShader( |
1494 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1532 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1495 Shader* fshader = shader_manager_.CreateShader( | 1533 Shader* fshader = shader_manager_.CreateShader( |
1496 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1534 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
1497 // Check shader got created. | 1535 // Check shader got created. |
1498 ASSERT_TRUE(vshader != NULL && fshader != NULL); | 1536 ASSERT_TRUE(vshader != NULL && fshader != NULL); |
1499 // Set Status | 1537 // Set Status |
1500 TestHelper::SetShaderStates( | 1538 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
1501 gl_.get(), vshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, | 1539 nullptr, &attrib_map, nullptr, nullptr, nullptr, |
1502 NULL, NULL); | 1540 nullptr, nullptr); |
1503 // Check attrib infos got copied. | 1541 // Check attrib infos got copied. |
1504 for (AttributeMap::const_iterator it = attrib_map.begin(); | 1542 for (AttributeMap::const_iterator it = attrib_map.begin(); |
1505 it != attrib_map.end(); ++it) { | 1543 it != attrib_map.end(); ++it) { |
1506 const sh::Attribute* variable_info = | 1544 const sh::Attribute* variable_info = |
1507 vshader->GetAttribInfo(it->first); | 1545 vshader->GetAttribInfo(it->first); |
1508 ASSERT_TRUE(variable_info != NULL); | 1546 ASSERT_TRUE(variable_info != NULL); |
1509 EXPECT_EQ(it->second.type, variable_info->type); | 1547 EXPECT_EQ(it->second.type, variable_info->type); |
1510 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); | 1548 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); |
1511 EXPECT_EQ(it->second.precision, variable_info->precision); | 1549 EXPECT_EQ(it->second.precision, variable_info->precision); |
1512 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); | 1550 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); |
1513 EXPECT_EQ(it->second.name, variable_info->name); | 1551 EXPECT_EQ(it->second.name, variable_info->name); |
1514 } | 1552 } |
1515 TestHelper::SetShaderStates( | 1553 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
1516 gl_.get(), fshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, | 1554 nullptr, &attrib_map, nullptr, nullptr, nullptr, |
1517 NULL, NULL); | 1555 nullptr, nullptr); |
1518 | |
1519 // Set up program | 1556 // Set up program |
1520 Program* program = | 1557 Program* program = |
1521 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1558 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
1522 ASSERT_TRUE(program != NULL); | 1559 ASSERT_TRUE(program != NULL); |
1523 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 1560 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
1524 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 1561 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
1525 | 1562 |
1526 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts()); | 1563 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts()); |
1527 EXPECT_TRUE(LinkAsExpected(program, true)); | 1564 EXPECT_TRUE(LinkAsExpected(program, true)); |
1528 | 1565 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1574 GL_FLOAT, 3, GL_LOW_FLOAT, true, "a"); | 1611 GL_FLOAT, 3, GL_LOW_FLOAT, true, "a"); |
1575 | 1612 |
1576 // Check we can create shader. | 1613 // Check we can create shader. |
1577 Shader* vshader = shader_manager_.CreateShader( | 1614 Shader* vshader = shader_manager_.CreateShader( |
1578 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1615 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1579 Shader* fshader = shader_manager_.CreateShader( | 1616 Shader* fshader = shader_manager_.CreateShader( |
1580 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1617 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
1581 // Check shader got created. | 1618 // Check shader got created. |
1582 ASSERT_TRUE(vshader != NULL && fshader != NULL); | 1619 ASSERT_TRUE(vshader != NULL && fshader != NULL); |
1583 // Set Status | 1620 // Set Status |
1584 TestHelper::SetShaderStates( | 1621 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
1585 gl_.get(), vshader, true, NULL, NULL, NULL, NULL, | 1622 nullptr, nullptr, &vertex_uniform_map, nullptr, |
1586 &vertex_uniform_map, NULL, NULL, NULL); | 1623 nullptr, nullptr, nullptr); |
1587 TestHelper::SetShaderStates( | 1624 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
1588 gl_.get(), fshader, true, NULL, NULL, NULL, NULL, | 1625 nullptr, nullptr, &frag_uniform_map, nullptr, |
1589 &frag_uniform_map, NULL, NULL, NULL); | 1626 nullptr, nullptr, nullptr); |
1590 | |
1591 // Set up program | 1627 // Set up program |
1592 Program* program = | 1628 Program* program = |
1593 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1629 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
1594 ASSERT_TRUE(program != NULL); | 1630 ASSERT_TRUE(program != NULL); |
1595 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 1631 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
1596 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 1632 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
1597 | 1633 |
1598 std::string conflicting_name; | 1634 std::string conflicting_name; |
1599 | 1635 |
1600 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name)); | 1636 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name)); |
1601 EXPECT_EQ("a", conflicting_name); | 1637 EXPECT_EQ("a", conflicting_name); |
1602 EXPECT_TRUE(LinkAsExpected(program, false)); | 1638 EXPECT_TRUE(LinkAsExpected(program, false)); |
1603 } | 1639 } |
1604 | 1640 |
1605 // If a varying has different type in the vertex and fragment | 1641 // If a varying has different type in the vertex and fragment |
1606 // shader, linking should fail. | 1642 // shader, linking should fail. |
1607 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { | 1643 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { |
1608 const VarInfo kVertexVarying = | 1644 const VarInfo kVertexVarying = |
1609 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1645 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1610 const VarInfo kFragmentVarying = | 1646 const VarInfo kFragmentVarying = |
1611 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1647 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1612 Program* program = SetupShaderVariableTest( | 1648 Program* program = |
1613 &kVertexVarying, 1, &kFragmentVarying, 1); | 1649 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
1614 | 1650 |
1615 std::string conflicting_name; | 1651 std::string conflicting_name; |
1616 | 1652 |
1617 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1653 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
1618 EXPECT_EQ("a", conflicting_name); | 1654 EXPECT_EQ("a", conflicting_name); |
1619 EXPECT_TRUE(LinkAsExpected(program, false)); | 1655 EXPECT_TRUE(LinkAsExpected(program, false)); |
1620 } | 1656 } |
1621 | 1657 |
1622 // If a varying has different array size in the vertex and fragment | 1658 // If a varying has different array size in the vertex and fragment |
1623 // shader, linking should fail. | 1659 // shader, linking should fail. |
1624 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { | 1660 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { |
1625 const VarInfo kVertexVarying = | 1661 const VarInfo kVertexVarying = |
1626 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1662 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1627 const VarInfo kFragmentVarying = | 1663 const VarInfo kFragmentVarying = |
1628 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1664 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1629 Program* program = SetupShaderVariableTest( | 1665 Program* program = |
1630 &kVertexVarying, 1, &kFragmentVarying, 1); | 1666 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
1631 | 1667 |
1632 std::string conflicting_name; | 1668 std::string conflicting_name; |
1633 | 1669 |
1634 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1670 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
1635 EXPECT_EQ("a", conflicting_name); | 1671 EXPECT_EQ("a", conflicting_name); |
1636 EXPECT_TRUE(LinkAsExpected(program, false)); | 1672 EXPECT_TRUE(LinkAsExpected(program, false)); |
1637 } | 1673 } |
1638 | 1674 |
1639 // If a varying has different precision in the vertex and fragment | 1675 // If a varying has different precision in the vertex and fragment |
1640 // shader, linking should succeed. | 1676 // shader, linking should succeed. |
1641 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { | 1677 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { |
1642 const VarInfo kVertexVarying = | 1678 const VarInfo kVertexVarying = |
1643 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying }; | 1679 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying }; |
1644 const VarInfo kFragmentVarying = | 1680 const VarInfo kFragmentVarying = |
1645 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1681 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1646 Program* program = SetupShaderVariableTest( | 1682 Program* program = |
1647 &kVertexVarying, 1, &kFragmentVarying, 1); | 1683 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
1648 | 1684 |
1649 std::string conflicting_name; | 1685 std::string conflicting_name; |
1650 | 1686 |
1651 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); | 1687 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); |
1652 EXPECT_TRUE(conflicting_name.empty()); | 1688 EXPECT_TRUE(conflicting_name.empty()); |
1653 EXPECT_TRUE(LinkAsExpected(program, true)); | 1689 EXPECT_TRUE(LinkAsExpected(program, true)); |
1654 } | 1690 } |
1655 | 1691 |
1656 // If a varying is statically used in fragment shader but not | 1692 // If a varying is statically used in fragment shader but not |
1657 // declared in vertex shader, link should fail. | 1693 // declared in vertex shader, link should fail. |
1658 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { | 1694 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { |
1659 const VarInfo kFragmentVarying = | 1695 const VarInfo kFragmentVarying = |
1660 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1696 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1661 Program* program = SetupShaderVariableTest( | 1697 Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1); |
1662 NULL, 0, &kFragmentVarying, 1); | |
1663 | 1698 |
1664 std::string conflicting_name; | 1699 std::string conflicting_name; |
1665 | 1700 |
1666 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1701 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
1667 EXPECT_EQ("a", conflicting_name); | 1702 EXPECT_EQ("a", conflicting_name); |
1668 EXPECT_TRUE(LinkAsExpected(program, false)); | 1703 EXPECT_TRUE(LinkAsExpected(program, false)); |
1669 } | 1704 } |
1670 | 1705 |
1671 // If a varying is declared but not statically used in fragment | 1706 // If a varying is declared but not statically used in fragment |
1672 // shader, even if it's not declared in vertex shader, link should | 1707 // shader, even if it's not declared in vertex shader, link should |
1673 // succeed. | 1708 // succeed. |
1674 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { | 1709 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { |
1675 const VarInfo kFragmentVarying = | 1710 const VarInfo kFragmentVarying = |
1676 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying }; | 1711 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying }; |
1677 Program* program = SetupShaderVariableTest( | 1712 Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1); |
1678 NULL, 0, &kFragmentVarying, 1); | |
1679 | 1713 |
1680 std::string conflicting_name; | 1714 std::string conflicting_name; |
1681 | 1715 |
1682 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); | 1716 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); |
1683 EXPECT_TRUE(conflicting_name.empty()); | 1717 EXPECT_TRUE(conflicting_name.empty()); |
1684 EXPECT_TRUE(LinkAsExpected(program, true)); | 1718 EXPECT_TRUE(LinkAsExpected(program, true)); |
1685 } | 1719 } |
1686 | 1720 |
1687 // Uniforms and attributes are both global variables, thus sharing | 1721 // Uniforms and attributes are both global variables, thus sharing |
1688 // the same namespace. Any name conflicts should cause link | 1722 // the same namespace. Any name conflicts should cause link |
1689 // failure. | 1723 // failure. |
1690 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { | 1724 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { |
1691 const VarInfo kVertexAttribute = | 1725 const VarInfo kVertexAttribute = |
1692 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute }; | 1726 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute }; |
1693 const VarInfo kFragmentUniform = | 1727 const VarInfo kFragmentUniform = |
1694 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform }; | 1728 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform }; |
1695 Program* program = SetupShaderVariableTest( | 1729 Program* program = |
1696 &kVertexAttribute, 1, &kFragmentUniform, 1); | 1730 SetupProgramForVariables(&kVertexAttribute, 1, &kFragmentUniform, 1); |
1697 | 1731 |
1698 std::string conflicting_name; | 1732 std::string conflicting_name; |
1699 | 1733 |
1700 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); | 1734 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); |
1701 EXPECT_EQ("a", conflicting_name); | 1735 EXPECT_EQ("a", conflicting_name); |
1702 EXPECT_TRUE(LinkAsExpected(program, false)); | 1736 EXPECT_TRUE(LinkAsExpected(program, false)); |
1703 } | 1737 } |
1704 | 1738 |
1705 // Varyings go over 8 rows. | 1739 // Varyings go over 8 rows. |
1706 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { | 1740 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { |
1707 const VarInfo kVertexVaryings[] = { | 1741 const VarInfo kVertexVaryings[] = { |
1708 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1742 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1709 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1743 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1710 }; | 1744 }; |
1711 const VarInfo kFragmentVaryings[] = { | 1745 const VarInfo kFragmentVaryings[] = { |
1712 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1746 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1713 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1747 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1714 }; | 1748 }; |
1715 Program* program = SetupShaderVariableTest( | 1749 Program* program = |
1716 kVertexVaryings, 2, kFragmentVaryings, 2); | 1750 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
1717 | 1751 |
1718 EXPECT_FALSE( | 1752 EXPECT_FALSE( |
1719 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); | 1753 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); |
1720 EXPECT_TRUE(LinkAsExpected(program, false)); | 1754 EXPECT_TRUE(LinkAsExpected(program, false)); |
1721 } | 1755 } |
1722 | 1756 |
1723 // Varyings go over 8 rows but some are inactive | 1757 // Varyings go over 8 rows but some are inactive |
1724 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) { | 1758 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) { |
1725 const VarInfo kVertexVaryings[] = { | 1759 const VarInfo kVertexVaryings[] = { |
1726 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1760 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1727 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1761 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1728 }; | 1762 }; |
1729 const VarInfo kFragmentVaryings[] = { | 1763 const VarInfo kFragmentVaryings[] = { |
1730 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, | 1764 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, |
1731 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1765 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1732 }; | 1766 }; |
1733 Program* program = SetupShaderVariableTest( | 1767 Program* program = |
1734 kVertexVaryings, 2, kFragmentVaryings, 2); | 1768 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
1735 | 1769 |
1736 EXPECT_TRUE( | 1770 EXPECT_TRUE( |
1737 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); | 1771 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); |
1738 EXPECT_TRUE(LinkAsExpected(program, true)); | 1772 EXPECT_TRUE(LinkAsExpected(program, true)); |
1739 } | 1773 } |
1740 | 1774 |
1741 // Varyings go over 8 rows but some are inactive. | 1775 // Varyings go over 8 rows but some are inactive. |
1742 // However, we still fail the check if kCountAll option is used. | 1776 // However, we still fail the check if kCountAll option is used. |
1743 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) { | 1777 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) { |
1744 const VarInfo kVertexVaryings[] = { | 1778 const VarInfo kVertexVaryings[] = { |
1745 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1779 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1746 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1780 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1747 }; | 1781 }; |
1748 const VarInfo kFragmentVaryings[] = { | 1782 const VarInfo kFragmentVaryings[] = { |
1749 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, | 1783 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, |
1750 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1784 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1751 }; | 1785 }; |
1752 Program* program = SetupShaderVariableTest( | 1786 Program* program = |
1753 kVertexVaryings, 2, kFragmentVaryings, 2); | 1787 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
1754 | 1788 |
1755 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll)); | 1789 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll)); |
1756 } | 1790 } |
1757 | 1791 |
1758 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) { | 1792 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) { |
1759 Shader* vshader = shader_manager_.CreateShader( | 1793 Shader* vshader = shader_manager_.CreateShader( |
1760 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1794 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1761 ASSERT_TRUE(vshader != NULL); | 1795 ASSERT_TRUE(vshader != NULL); |
1762 TestHelper::SetShaderStates(gl_.get(), vshader, true); | 1796 TestHelper::SetShaderStates(gl_.get(), vshader, true); |
1763 Shader* fshader = shader_manager_.CreateShader( | 1797 Shader* fshader = shader_manager_.CreateShader( |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1903 ProgramManagerWithCacheTest() | 1937 ProgramManagerWithCacheTest() |
1904 : cache_(new MockProgramCache()), | 1938 : cache_(new MockProgramCache()), |
1905 vertex_shader_(NULL), | 1939 vertex_shader_(NULL), |
1906 fragment_shader_(NULL), | 1940 fragment_shader_(NULL), |
1907 program_(NULL) { | 1941 program_(NULL) { |
1908 } | 1942 } |
1909 | 1943 |
1910 protected: | 1944 protected: |
1911 void SetupProgramManager() override { | 1945 void SetupProgramManager() override { |
1912 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors, | 1946 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors, |
| 1947 kMaxDualSourceDrawBuffers, |
1913 feature_info_.get())); | 1948 feature_info_.get())); |
1914 } | 1949 } |
1915 | 1950 |
1916 void SetUp() override { | 1951 void SetUp() override { |
1917 ProgramManagerTestBase::SetUp(); | 1952 ProgramManagerTestBase::SetUp(); |
1918 | 1953 |
1919 vertex_shader_ = shader_manager_.CreateShader( | 1954 vertex_shader_ = shader_manager_.CreateShader( |
1920 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1955 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1921 fragment_shader_ = shader_manager_.CreateShader( | 1956 fragment_shader_ = shader_manager_.CreateShader( |
1922 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1957 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
1923 ASSERT_TRUE(vertex_shader_ != NULL); | 1958 ASSERT_TRUE(vertex_shader_ != NULL); |
1924 ASSERT_TRUE(fragment_shader_ != NULL); | 1959 ASSERT_TRUE(fragment_shader_ != NULL); |
1925 vertex_shader_->set_source("lka asjf bjajsdfj"); | 1960 vertex_shader_->set_source("lka asjf bjajsdfj"); |
1926 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj"); | 1961 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj"); |
1927 | 1962 |
1928 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1963 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
1929 ASSERT_TRUE(program_ != NULL); | 1964 ASSERT_TRUE(program_ != NULL); |
1930 | 1965 |
1931 program_->AttachShader(&shader_manager_, vertex_shader_); | 1966 program_->AttachShader(&shader_manager_, vertex_shader_); |
1932 program_->AttachShader(&shader_manager_, fragment_shader_); | 1967 program_->AttachShader(&shader_manager_, fragment_shader_); |
1933 } | 1968 } |
| 1969 |
1934 void TearDown() override { | 1970 void TearDown() override { |
1935 shader_manager_.Destroy(false); | 1971 shader_manager_.Destroy(false); |
1936 ProgramManagerTestBase::TearDown(); | 1972 ProgramManagerTestBase::TearDown(); |
1937 } | 1973 } |
| 1974 |
1938 void SetShadersCompiled() { | 1975 void SetShadersCompiled() { |
1939 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); | 1976 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); |
1940 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); | 1977 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); |
1941 } | 1978 } |
1942 | 1979 |
1943 void SetProgramCached() { | 1980 void SetProgramCached() { |
1944 cache_->LinkedProgramCacheSuccess( | 1981 cache_->LinkedProgramCacheSuccess( |
1945 vertex_shader_->source(), | 1982 vertex_shader_->source(), |
1946 fragment_shader_->source(), | 1983 fragment_shader_->source(), |
1947 &program_->bind_attrib_location_map(), | 1984 &program_->bind_attrib_location_map(), |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2012 program_->transform_feedback_buffer_mode(), | 2049 program_->transform_feedback_buffer_mode(), |
2013 _)) | 2050 _)) |
2014 .WillOnce(Return(result)); | 2051 .WillOnce(Return(result)); |
2015 } | 2052 } |
2016 | 2053 |
2017 void SetExpectationsForProgramLoadSuccess() { | 2054 void SetExpectationsForProgramLoadSuccess() { |
2018 SetExpectationsForProgramLoadSuccess(kServiceProgramId); | 2055 SetExpectationsForProgramLoadSuccess(kServiceProgramId); |
2019 } | 2056 } |
2020 | 2057 |
2021 void SetExpectationsForProgramLoadSuccess(GLuint service_program_id) { | 2058 void SetExpectationsForProgramLoadSuccess(GLuint service_program_id) { |
2022 TestHelper::SetupProgramSuccessExpectations(gl_.get(), feature_info_.get(), | 2059 TestHelper::SetupProgramSuccessExpectations( |
2023 nullptr, 0, nullptr, 0, nullptr, | 2060 gl_.get(), feature_info_.get(), nullptr, 0, nullptr, 0, nullptr, 0, |
2024 0, service_program_id); | 2061 nullptr, 0, service_program_id); |
2025 } | 2062 } |
2026 | 2063 |
2027 void SetExpectationsForProgramLink() { | 2064 void SetExpectationsForProgramLink() { |
2028 SetExpectationsForProgramLink(kServiceProgramId); | 2065 SetExpectationsForProgramLink(kServiceProgramId); |
2029 } | 2066 } |
2030 | 2067 |
2031 void SetExpectationsForProgramLink(GLuint service_program_id) { | 2068 void SetExpectationsForProgramLink(GLuint service_program_id) { |
2032 TestHelper::SetupShaderExpectations(gl_.get(), feature_info_.get(), nullptr, | 2069 TestHelper::SetupShaderExpectations(gl_.get(), feature_info_.get(), nullptr, |
2033 0, nullptr, 0, service_program_id); | 2070 0, nullptr, 0, service_program_id); |
2034 if (gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary) { | 2071 if (gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary) { |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2170 const GLint ProgramManagerWithPathRenderingTest::kFragmentInput3RealLocation; | 2207 const GLint ProgramManagerWithPathRenderingTest::kFragmentInput3RealLocation; |
2171 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput1Type; | 2208 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput1Type; |
2172 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput2Type; | 2209 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput2Type; |
2173 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput3Type; | 2210 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput3Type; |
2174 #endif | 2211 #endif |
2175 | 2212 |
2176 const char* ProgramManagerWithPathRenderingTest::kFragmentInput1Name = "color1"; | 2213 const char* ProgramManagerWithPathRenderingTest::kFragmentInput1Name = "color1"; |
2177 const char* ProgramManagerWithPathRenderingTest::kFragmentInput2Name = "color2"; | 2214 const char* ProgramManagerWithPathRenderingTest::kFragmentInput2Name = "color2"; |
2178 const char* ProgramManagerWithPathRenderingTest::kFragmentInput2GLName = | 2215 const char* ProgramManagerWithPathRenderingTest::kFragmentInput2GLName = |
2179 "color2[0]"; | 2216 "color2[0]"; |
2180 | |
2181 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3Name = "color3"; | 2217 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3Name = "color3"; |
2182 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3GLName = | 2218 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3GLName = |
2183 "color3[0]"; | 2219 "color3[0]"; |
2184 | 2220 |
2185 TEST_P(ProgramManagerWithPathRenderingTest, BindFragmentInputLocation) { | 2221 TEST_P(ProgramManagerWithPathRenderingTest, BindFragmentInputLocation) { |
2186 const GLint kFragmentInput1DesiredLocation = 10; | 2222 const GLint kFragmentInput1DesiredLocation = 10; |
2187 const GLint kFragmentInput2DesiredLocation = -1; | 2223 const GLint kFragmentInput2DesiredLocation = -1; |
2188 const GLint kFragmentInput3DesiredLocation = 5; | 2224 const GLint kFragmentInput3DesiredLocation = 5; |
2189 | 2225 |
2190 Shader* vshader = shader_manager_.CreateShader( | 2226 Shader* vshader = shader_manager_.CreateShader( |
2191 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 2227 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
2192 ASSERT_TRUE(vshader != NULL); | 2228 ASSERT_TRUE(vshader != NULL); |
2193 Shader* fshader = shader_manager_.CreateShader( | 2229 Shader* fshader = shader_manager_.CreateShader( |
2194 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 2230 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
2195 ASSERT_TRUE(fshader != NULL); | 2231 ASSERT_TRUE(fshader != NULL); |
2196 VaryingMap varying_map; | 2232 VaryingMap varying_map; |
2197 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying( | 2233 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying( |
2198 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision, | 2234 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision, |
2199 kFragmentInput1StaticUse, kFragmentInput1Name); | 2235 kFragmentInput1StaticUse, kFragmentInput1Name); |
2200 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying( | 2236 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying( |
2201 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision, | 2237 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision, |
2202 kFragmentInput2StaticUse, kFragmentInput2Name); | 2238 kFragmentInput2StaticUse, kFragmentInput2Name); |
2203 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying( | 2239 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying( |
2204 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision, | 2240 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision, |
2205 kFragmentInput3StaticUse, kFragmentInput3Name); | 2241 kFragmentInput3StaticUse, kFragmentInput3Name); |
2206 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, | 2242 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
2207 nullptr, nullptr, nullptr, &varying_map, nullptr, | 2243 nullptr, nullptr, nullptr, &varying_map, nullptr, |
2208 nullptr); | 2244 nullptr, nullptr); |
2209 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, | 2245 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
2210 nullptr, nullptr, nullptr, &varying_map, nullptr, | 2246 nullptr, nullptr, nullptr, &varying_map, nullptr, |
2211 nullptr); | 2247 nullptr, nullptr); |
2212 Program* program = | 2248 Program* program = |
2213 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 2249 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
2214 ASSERT_TRUE(program != NULL); | 2250 ASSERT_TRUE(program != NULL); |
2215 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 2251 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
2216 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 2252 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
2217 program->SetFragmentInputLocationBinding(kFragmentInput1Name, | 2253 program->SetFragmentInputLocationBinding(kFragmentInput1Name, |
2218 kFragmentInput1DesiredLocation); | 2254 kFragmentInput1DesiredLocation); |
2219 program->SetFragmentInputLocationBinding(kFragmentInput3Name, | 2255 program->SetFragmentInputLocationBinding(kFragmentInput3Name, |
2220 kFragmentInput3DesiredLocation); | 2256 kFragmentInput3DesiredLocation); |
2221 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = { | 2257 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = { |
2222 { | 2258 { |
2223 kFragmentInput1Name, kFragmentInput1Size, kFragmentInput1Type, | 2259 kFragmentInput1Name, kFragmentInput1Size, kFragmentInput1Type, |
2224 kFragmentInput1FakeLocation, kFragmentInput1RealLocation, | 2260 kFragmentInput1FakeLocation, kFragmentInput1RealLocation, |
2225 kFragmentInput1DesiredLocation, | 2261 kFragmentInput1DesiredLocation, |
2226 }, | 2262 }, |
2227 { | 2263 { |
2228 kFragmentInput2GLName, kFragmentInput2Size, kFragmentInput2Type, | 2264 kFragmentInput2GLName, kFragmentInput2Size, kFragmentInput2Type, |
2229 kFragmentInput2FakeLocation, kFragmentInput2RealLocation, | 2265 kFragmentInput2FakeLocation, kFragmentInput2RealLocation, |
2230 kFragmentInput2DesiredLocation, | 2266 kFragmentInput2DesiredLocation, |
2231 }, | 2267 }, |
2232 { | 2268 { |
2233 kFragmentInput3GLName, kFragmentInput3Size, kFragmentInput3Type, | 2269 kFragmentInput3GLName, kFragmentInput3Size, kFragmentInput3Type, |
2234 kFragmentInput3FakeLocation, kFragmentInput3RealLocation, | 2270 kFragmentInput3FakeLocation, kFragmentInput3RealLocation, |
2235 kFragmentInput3DesiredLocation, | 2271 kFragmentInput3DesiredLocation, |
2236 }, | 2272 }, |
2237 }; | 2273 }; |
2238 TestHelper::SetupShaderExpectationsWithVaryings( | 2274 TestHelper::SetupShaderExpectationsWithVaryings( |
2239 gl_.get(), feature_info_.get(), nullptr, 0, nullptr, 0, | 2275 gl_.get(), feature_info_.get(), nullptr, 0, nullptr, 0, |
2240 kFragmentInputExpectationInfos, arraysize(kFragmentInputExpectationInfos), | 2276 kFragmentInputExpectationInfos, arraysize(kFragmentInputExpectationInfos), |
2241 kServiceProgramId); | 2277 nullptr, 0, kServiceProgramId); |
2242 program->Link(NULL, Program::kCountOnlyStaticallyUsed, | 2278 program->Link(NULL, Program::kCountOnlyStaticallyUsed, |
2243 base::Bind(&ShaderCacheCb)); | 2279 base::Bind(&ShaderCacheCb)); |
2244 const Program::FragmentInputInfo* info1 = | 2280 const Program::FragmentInputInfo* info1 = |
2245 program->GetFragmentInputInfoByFakeLocation( | 2281 program->GetFragmentInputInfoByFakeLocation( |
2246 kFragmentInput1DesiredLocation); | 2282 kFragmentInput1DesiredLocation); |
2247 ASSERT_NE(info1, nullptr); | 2283 ASSERT_NE(info1, nullptr); |
2248 EXPECT_EQ(kFragmentInput1RealLocation, static_cast<GLint>(info1->location)); | 2284 EXPECT_EQ(kFragmentInput1RealLocation, static_cast<GLint>(info1->location)); |
2249 const Program::FragmentInputInfo* info3 = | 2285 const Program::FragmentInputInfo* info3 = |
2250 program->GetFragmentInputInfoByFakeLocation( | 2286 program->GetFragmentInputInfoByFakeLocation( |
2251 kFragmentInput3DesiredLocation); | 2287 kFragmentInput3DesiredLocation); |
(...skipping 14 matching lines...) Expand all Loading... |
2266 INSTANTIATE_TEST_CASE_P( | 2302 INSTANTIATE_TEST_CASE_P( |
2267 SupportedContexts, | 2303 SupportedContexts, |
2268 ProgramManagerWithPathRenderingTest, | 2304 ProgramManagerWithPathRenderingTest, |
2269 testing::Values( | 2305 testing::Values( |
2270 make_gl_ext_tuple("3.2", | 2306 make_gl_ext_tuple("3.2", |
2271 "GL_ARB_program_interface_query " | 2307 "GL_ARB_program_interface_query " |
2272 "GL_EXT_direct_state_access GL_NV_path_rendering"), | 2308 "GL_EXT_direct_state_access GL_NV_path_rendering"), |
2273 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"), | 2309 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"), |
2274 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering"))); | 2310 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering"))); |
2275 | 2311 |
| 2312 class ProgramManagerDualSourceBlendingTest |
| 2313 : public ProgramManagerWithShaderTest, |
| 2314 public testing::WithParamInterface< |
| 2315 testing::tuple<const char*, const char*>> { |
| 2316 public: |
| 2317 ProgramManagerDualSourceBlendingTest() {} |
| 2318 |
| 2319 protected: |
| 2320 void SetUpWithFeatureInfo(FeatureInfo* feature_info) { |
| 2321 const char* gl_version = testing::get<0>(GetParam()); |
| 2322 const char* gl_extensions = testing::get<1>(GetParam()); |
| 2323 SetUpBase(gl_version, gl_extensions, feature_info); |
| 2324 } |
| 2325 |
| 2326 void SetUp() override { SetUpWithFeatureInfo(nullptr); } |
| 2327 }; |
| 2328 |
| 2329 class ProgramManagerDualSourceBlendingES2Test |
| 2330 : public ProgramManagerDualSourceBlendingTest {}; |
| 2331 |
| 2332 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragCoord) { |
| 2333 DCHECK(feature_info_->feature_flags().ext_blend_func_extended); |
| 2334 |
| 2335 const VarInfo kFragmentVaryings[] = { |
| 2336 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_SecondaryFragColorEXT", |
| 2337 kVarOutput}, |
| 2338 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_FragColor", kVarOutput}, |
| 2339 }; |
| 2340 |
| 2341 int shader_version = 100; |
| 2342 Program* program = |
| 2343 SetupProgramForVariables(nullptr, 0, kFragmentVaryings, |
| 2344 arraysize(kFragmentVaryings), &shader_version); |
| 2345 |
| 2346 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info(); |
| 2347 if (!gl_version.is_es) { |
| 2348 // The call is expected only for OpenGL. OpenGL ES expects to |
| 2349 // output GLES SL 1.00, which does not bind. |
| 2350 EXPECT_CALL(*(gl_.get()), |
| 2351 BindFragDataLocationIndexed(kServiceProgramId, 0, 1, |
| 2352 StrEq("angle_SecondaryFragColor"))) |
| 2353 .Times(1) |
| 2354 .RetiresOnSaturation(); |
| 2355 } |
| 2356 |
| 2357 EXPECT_TRUE(LinkAsExpected(program, true)); |
| 2358 } |
| 2359 |
| 2360 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragData) { |
| 2361 const VarInfo kFragmentVaryings[] = { |
| 2362 {GL_FLOAT_VEC4, kMaxDualSourceDrawBuffers, GL_MEDIUM_FLOAT, true, |
| 2363 "gl_SecondaryFragDataEXT", kVarOutput}, |
| 2364 {GL_FLOAT_VEC4, kMaxDrawBuffers, GL_MEDIUM_FLOAT, true, "gl_FragData", |
| 2365 kVarOutput}, |
| 2366 }; |
| 2367 |
| 2368 int shader_version = 100; |
| 2369 Program* program = |
| 2370 SetupProgramForVariables(nullptr, 0, kFragmentVaryings, |
| 2371 arraysize(kFragmentVaryings), &shader_version); |
| 2372 |
| 2373 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info(); |
| 2374 if (!gl_version.is_es) { |
| 2375 // The call is expected only for OpenGL. OpenGL ES expects to |
| 2376 // output GLES SL 1.00, which does not bind. |
| 2377 EXPECT_CALL(*(gl_.get()), |
| 2378 BindFragDataLocationIndexed(kServiceProgramId, 0, 1, |
| 2379 StrEq("angle_SecondaryFragData"))) |
| 2380 .Times(1) |
| 2381 .RetiresOnSaturation(); |
| 2382 } |
| 2383 |
| 2384 EXPECT_TRUE(LinkAsExpected(program, true)); |
| 2385 } |
| 2386 |
| 2387 INSTANTIATE_TEST_CASE_P( |
| 2388 SupportedContexts, |
| 2389 ProgramManagerDualSourceBlendingES2Test, |
| 2390 testing::Values( |
| 2391 make_gl_ext_tuple("3.2", |
| 2392 "GL_ARB_draw_buffers GL_ARB_blend_func_extended " |
| 2393 "GL_ARB_program_interface_query"), |
| 2394 make_gl_ext_tuple("opengl es 3.1", |
| 2395 "GL_EXT_draw_buffers GL_EXT_blend_func_extended"))); |
| 2396 |
2276 } // namespace gles2 | 2397 } // namespace gles2 |
2277 } // namespace gpu | 2398 } // namespace gpu |
OLD | NEW |