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 | 13 |
14 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 14 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
15 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 15 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
16 #include "gpu/command_buffer/service/common_decoder.h" | 16 #include "gpu/command_buffer/service/common_decoder.h" |
17 #include "gpu/command_buffer/service/feature_info.h" | 17 #include "gpu/command_buffer/service/feature_info.h" |
18 #include "gpu/command_buffer/service/gpu_service_test.h" | 18 #include "gpu/command_buffer/service/gpu_service_test.h" |
19 #include "gpu/command_buffer/service/gpu_switches.h" | 19 #include "gpu/command_buffer/service/gpu_switches.h" |
20 #include "gpu/command_buffer/service/mocks.h" | 20 #include "gpu/command_buffer/service/mocks.h" |
21 #include "gpu/command_buffer/service/shader_manager.h" | 21 #include "gpu/command_buffer/service/shader_manager.h" |
22 #include "gpu/command_buffer/service/test_helper.h" | 22 #include "gpu/command_buffer/service/test_helper.h" |
23 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
24 #include "ui/gl/gl_mock.h" | 24 #include "ui/gl/gl_mock.h" |
25 #include "ui/gl/gl_version_info.h" | |
25 | 26 |
26 using ::testing::_; | 27 using ::testing::_; |
27 using ::testing::DoAll; | 28 using ::testing::DoAll; |
28 using ::testing::InSequence; | 29 using ::testing::InSequence; |
29 using ::testing::MatcherCast; | 30 using ::testing::MatcherCast; |
30 using ::testing::Pointee; | 31 using ::testing::Pointee; |
31 using ::testing::Return; | 32 using ::testing::Return; |
32 using ::testing::ReturnRef; | 33 using ::testing::ReturnRef; |
33 using ::testing::SetArrayArgument; | 34 using ::testing::SetArrayArgument; |
34 using ::testing::SetArgPointee; | 35 using ::testing::SetArgPointee; |
35 using ::testing::StrEq; | 36 using ::testing::StrEq; |
36 | 37 |
37 namespace gpu { | 38 namespace gpu { |
38 namespace gles2 { | 39 namespace gles2 { |
39 | 40 |
40 namespace { | 41 namespace { |
41 const uint32 kMaxVaryingVectors = 8; | 42 const uint32 kMaxVaryingVectors = 8; |
43 const uint32 kMaxDrawBuffers = 8; | |
44 const uint32 kMaxDualSourceDrawBuffers = 8; | |
42 | 45 |
43 void ShaderCacheCb(const std::string& key, const std::string& shader) {} | 46 void ShaderCacheCb(const std::string& key, const std::string& shader) {} |
44 | 47 |
45 uint32 ComputeOffset(const void* start, const void* position) { | 48 uint32 ComputeOffset(const void* start, const void* position) { |
46 return static_cast<const uint8*>(position) - | 49 return static_cast<const uint8*>(position) - |
47 static_cast<const uint8*>(start); | 50 static_cast<const uint8*>(start); |
48 } | 51 } |
49 | 52 |
50 } // namespace anonymous | 53 } // namespace anonymous |
51 | 54 |
52 class ProgramManagerTestBase : public GpuServiceTest { | 55 class ProgramManagerTestBase : public GpuServiceTest { |
53 protected: | 56 protected: |
54 virtual void SetupProgramManager() { | 57 virtual void SetupProgramManager() { |
55 manager_.reset( | 58 manager_.reset(new ProgramManager(NULL, kMaxVaryingVectors, |
56 new ProgramManager(NULL, kMaxVaryingVectors, feature_info_.get())); | 59 kMaxDualSourceDrawBuffers, |
60 feature_info_.get())); | |
57 } | 61 } |
58 void SetUpBase(const char* gl_version, | 62 void SetUpBase(const char* gl_version, |
59 const char* gl_extensions, | 63 const char* gl_extensions, |
60 FeatureInfo* feature_info = NULL) { | 64 FeatureInfo* feature_info = NULL) { |
61 GpuServiceTest::SetUpWithGLVersion(gl_version, gl_extensions); | 65 GpuServiceTest::SetUpWithGLVersion(gl_version, gl_extensions); |
62 TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( | 66 TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( |
63 gl_.get(), gl_extensions, "", gl_version); | 67 gl_.get(), gl_extensions, "", gl_version); |
64 if (!feature_info) { | 68 if (!feature_info) { |
65 feature_info = new FeatureInfo(); | 69 feature_info = new FeatureInfo(); |
66 } | 70 } |
67 feature_info->Initialize(); | 71 feature_info->Initialize(); |
68 feature_info_ = feature_info; | 72 feature_info_ = feature_info; |
69 SetupProgramManager(); | 73 SetupProgramManager(); |
70 } | 74 } |
71 void SetUp() override { | 75 void SetUp() override { |
72 // Parameters same as GpuServiceTest::SetUp | 76 // Parameters same as GpuServiceTest::SetUp |
73 SetUpBase("2.0", "GL_EXT_framebuffer_object"); | 77 SetUpBase("2.0", "GL_EXT_framebuffer_object"); |
74 } | 78 } |
75 void TearDown() override { | 79 void TearDown() override { |
76 manager_->Destroy(false); | 80 manager_->Destroy(false); |
77 manager_.reset(); | 81 manager_.reset(); |
78 feature_info_ = nullptr; | 82 feature_info_ = nullptr; |
Mark Kilgard
2015/08/28 19:53:24
is there a style convention for nullptr vs. NULL i
Kimmo Kinnunen
2015/08/31 12:22:58
I think I've been instructed to use nullptr for th
| |
79 GpuServiceTest::TearDown(); | 83 GpuServiceTest::TearDown(); |
80 } | 84 } |
81 | 85 |
82 scoped_ptr<ProgramManager> manager_; | 86 scoped_ptr<ProgramManager> manager_; |
83 scoped_refptr<FeatureInfo> feature_info_; | 87 scoped_refptr<FeatureInfo> feature_info_; |
84 }; | 88 }; |
85 | 89 |
86 class ProgramManagerTest : public ProgramManagerTestBase {}; | 90 class ProgramManagerTest : public ProgramManagerTestBase {}; |
87 | 91 |
88 TEST_F(ProgramManagerTest, Basic) { | 92 TEST_F(ProgramManagerTest, Basic) { |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
210 static const GLint kUniform3RealLocation = 33; | 214 static const GLint kUniform3RealLocation = 33; |
211 static const GLint kUniform1DesiredLocation = -1; | 215 static const GLint kUniform1DesiredLocation = -1; |
212 static const GLint kUniform2DesiredLocation = -1; | 216 static const GLint kUniform2DesiredLocation = -1; |
213 static const GLint kUniform3DesiredLocation = -1; | 217 static const GLint kUniform3DesiredLocation = -1; |
214 static const GLenum kUniform1Type = GL_FLOAT_VEC4; | 218 static const GLenum kUniform1Type = GL_FLOAT_VEC4; |
215 static const GLenum kUniform2Type = GL_INT_VEC2; | 219 static const GLenum kUniform2Type = GL_INT_VEC2; |
216 static const GLenum kUniform3Type = GL_FLOAT_VEC3; | 220 static const GLenum kUniform3Type = GL_FLOAT_VEC3; |
217 static const GLint kInvalidUniformLocation = 30; | 221 static const GLint kInvalidUniformLocation = 30; |
218 static const GLint kBadUniformIndex = 1000; | 222 static const GLint kBadUniformIndex = 1000; |
219 | 223 |
224 static const char* kOutputVariable1Name; | |
225 static const GLint kOutputVariable1Size = 1; | |
226 static const GLenum kOutputVariable1Precision = GL_MEDIUM_FLOAT; | |
227 static const bool kOutputVariable1StaticUse = true; | |
228 static const GLint kOutputVariable1Location = -1; | |
229 static const GLenum kOutputVariable1Type = GL_FLOAT_VEC4; | |
230 | |
220 static const size_t kNumAttribs; | 231 static const size_t kNumAttribs; |
221 static const size_t kNumUniforms; | 232 static const size_t kNumUniforms; |
222 | 233 |
223 protected: | 234 protected: |
224 typedef TestHelper::AttribInfo AttribInfo; | 235 typedef TestHelper::AttribInfo AttribInfo; |
225 typedef TestHelper::UniformInfo UniformInfo; | 236 typedef TestHelper::UniformInfo UniformInfo; |
226 | 237 |
227 typedef enum { | 238 typedef enum { |
228 kVarUniform, | 239 kVarUniform, |
229 kVarVarying, | 240 kVarVarying, |
230 kVarAttribute | 241 kVarAttribute, |
242 kVarOutput, | |
231 } VarCategory; | 243 } VarCategory; |
232 | 244 |
233 typedef struct { | 245 typedef struct { |
234 GLenum type; | 246 GLenum type; |
235 GLint size; | 247 GLint size; |
236 GLenum precision; | 248 GLenum precision; |
237 bool static_use; | 249 bool static_use; |
238 std::string name; | 250 std::string name; |
239 VarCategory category; | 251 VarCategory category; |
240 } VarInfo; | 252 } VarInfo; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
294 SetupShaderExpectations(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 306 SetupShaderExpectations(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
295 service_id); | 307 service_id); |
296 } | 308 } |
297 program->Link(NULL, Program::kCountOnlyStaticallyUsed, | 309 program->Link(NULL, Program::kCountOnlyStaticallyUsed, |
298 base::Bind(&ShaderCacheCb)); | 310 base::Bind(&ShaderCacheCb)); |
299 GLint link_status; | 311 GLint link_status; |
300 program->GetProgramiv(GL_LINK_STATUS, &link_status); | 312 program->GetProgramiv(GL_LINK_STATUS, &link_status); |
301 return (static_cast<bool>(link_status) == expected_link_status); | 313 return (static_cast<bool>(link_status) == expected_link_status); |
302 } | 314 } |
303 | 315 |
304 Program* SetupShaderVariableTest(const VarInfo* vertex_variables, | 316 Program* SetupProgramForVariables(const VarInfo* vertex_variables, |
305 size_t vertex_variable_size, | 317 size_t vertex_variable_size, |
306 const VarInfo* fragment_variables, | 318 const VarInfo* fragment_variables, |
307 size_t fragment_variable_size) { | 319 size_t fragment_variable_size, |
320 const int* const shader_version = NULL) { | |
308 // Set up shader | 321 // Set up shader |
309 AttributeMap vertex_attrib_map; | 322 AttributeMap vertex_attrib_map; |
310 UniformMap vertex_uniform_map; | 323 UniformMap vertex_uniform_map; |
311 VaryingMap vertex_varying_map; | 324 VaryingMap vertex_varying_map; |
325 AttributeList vertex_output_variable_list; | |
312 for (size_t ii = 0; ii < vertex_variable_size; ++ii) { | 326 for (size_t ii = 0; ii < vertex_variable_size; ++ii) { |
313 switch (vertex_variables[ii].category) { | 327 switch (vertex_variables[ii].category) { |
314 case kVarAttribute: | 328 case kVarAttribute: |
315 vertex_attrib_map[vertex_variables[ii].name] = | 329 vertex_attrib_map[vertex_variables[ii].name] = |
316 TestHelper::ConstructAttribute( | 330 TestHelper::ConstructAttribute( |
317 vertex_variables[ii].type, | 331 vertex_variables[ii].type, |
318 vertex_variables[ii].size, | 332 vertex_variables[ii].size, |
319 vertex_variables[ii].precision, | 333 vertex_variables[ii].precision, |
320 vertex_variables[ii].static_use, | 334 vertex_variables[ii].static_use, |
321 vertex_variables[ii].name); | 335 vertex_variables[ii].name); |
322 break; | 336 break; |
323 case kVarUniform: | 337 case kVarUniform: |
324 vertex_uniform_map[vertex_variables[ii].name] = | 338 vertex_uniform_map[vertex_variables[ii].name] = |
325 TestHelper::ConstructUniform( | 339 TestHelper::ConstructUniform( |
326 vertex_variables[ii].type, | 340 vertex_variables[ii].type, |
327 vertex_variables[ii].size, | 341 vertex_variables[ii].size, |
328 vertex_variables[ii].precision, | 342 vertex_variables[ii].precision, |
329 vertex_variables[ii].static_use, | 343 vertex_variables[ii].static_use, |
330 vertex_variables[ii].name); | 344 vertex_variables[ii].name); |
331 break; | 345 break; |
332 case kVarVarying: | 346 case kVarVarying: |
333 vertex_varying_map[vertex_variables[ii].name] = | 347 vertex_varying_map[vertex_variables[ii].name] = |
334 TestHelper::ConstructVarying( | 348 TestHelper::ConstructVarying( |
335 vertex_variables[ii].type, | 349 vertex_variables[ii].type, |
336 vertex_variables[ii].size, | 350 vertex_variables[ii].size, |
337 vertex_variables[ii].precision, | 351 vertex_variables[ii].precision, |
338 vertex_variables[ii].static_use, | 352 vertex_variables[ii].static_use, |
339 vertex_variables[ii].name); | 353 vertex_variables[ii].name); |
340 break; | 354 break; |
355 case kVarOutput: | |
356 vertex_output_variable_list.push_back(TestHelper::ConstructAttribute( | |
357 vertex_variables[ii].type, vertex_variables[ii].size, | |
358 vertex_variables[ii].precision, vertex_variables[ii].static_use, | |
359 vertex_variables[ii].name)); | |
360 break; | |
341 default: | 361 default: |
342 NOTREACHED(); | 362 NOTREACHED(); |
343 } | 363 } |
344 } | 364 } |
345 | 365 |
346 AttributeMap frag_attrib_map; | 366 AttributeMap frag_attrib_map; |
347 UniformMap frag_uniform_map; | 367 UniformMap frag_uniform_map; |
348 VaryingMap frag_varying_map; | 368 VaryingMap frag_varying_map; |
369 AttributeList frag_output_variable_list; | |
349 for (size_t ii = 0; ii < fragment_variable_size; ++ii) { | 370 for (size_t ii = 0; ii < fragment_variable_size; ++ii) { |
350 switch (fragment_variables[ii].category) { | 371 switch (fragment_variables[ii].category) { |
351 case kVarAttribute: | 372 case kVarAttribute: |
352 frag_attrib_map[fragment_variables[ii].name] = | 373 frag_attrib_map[fragment_variables[ii].name] = |
353 TestHelper::ConstructAttribute( | 374 TestHelper::ConstructAttribute( |
354 fragment_variables[ii].type, | 375 fragment_variables[ii].type, |
355 fragment_variables[ii].size, | 376 fragment_variables[ii].size, |
356 fragment_variables[ii].precision, | 377 fragment_variables[ii].precision, |
357 fragment_variables[ii].static_use, | 378 fragment_variables[ii].static_use, |
358 fragment_variables[ii].name); | 379 fragment_variables[ii].name); |
359 break; | 380 break; |
360 case kVarUniform: | 381 case kVarUniform: |
361 frag_uniform_map[fragment_variables[ii].name] = | 382 frag_uniform_map[fragment_variables[ii].name] = |
362 TestHelper::ConstructUniform( | 383 TestHelper::ConstructUniform( |
363 fragment_variables[ii].type, | 384 fragment_variables[ii].type, |
364 fragment_variables[ii].size, | 385 fragment_variables[ii].size, |
365 fragment_variables[ii].precision, | 386 fragment_variables[ii].precision, |
366 fragment_variables[ii].static_use, | 387 fragment_variables[ii].static_use, |
367 fragment_variables[ii].name); | 388 fragment_variables[ii].name); |
368 break; | 389 break; |
369 case kVarVarying: | 390 case kVarVarying: |
370 frag_varying_map[fragment_variables[ii].name] = | 391 frag_varying_map[fragment_variables[ii].name] = |
371 TestHelper::ConstructVarying( | 392 TestHelper::ConstructVarying( |
372 fragment_variables[ii].type, | 393 fragment_variables[ii].type, |
373 fragment_variables[ii].size, | 394 fragment_variables[ii].size, |
374 fragment_variables[ii].precision, | 395 fragment_variables[ii].precision, |
375 fragment_variables[ii].static_use, | 396 fragment_variables[ii].static_use, |
376 fragment_variables[ii].name); | 397 fragment_variables[ii].name); |
377 break; | 398 break; |
399 case kVarOutput: | |
400 frag_output_variable_list.push_back(TestHelper::ConstructAttribute( | |
401 fragment_variables[ii].type, fragment_variables[ii].size, | |
402 fragment_variables[ii].precision, | |
403 fragment_variables[ii].static_use, fragment_variables[ii].name)); | |
404 break; | |
378 default: | 405 default: |
379 NOTREACHED(); | 406 NOTREACHED(); |
380 } | 407 } |
381 } | 408 } |
382 | 409 |
383 // Check we can create shader. | 410 // Check we can create shader. |
384 Shader* vshader = shader_manager_.CreateShader( | 411 Shader* vshader = shader_manager_.CreateShader( |
385 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 412 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
386 Shader* fshader = shader_manager_.CreateShader( | 413 Shader* fshader = shader_manager_.CreateShader( |
387 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 414 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
388 // Check shader got created. | 415 // Check shader got created. |
389 EXPECT_TRUE(vshader != NULL && fshader != NULL); | 416 EXPECT_TRUE(vshader != NULL && fshader != NULL); |
390 // Set Status | 417 // Set Status |
418 TestHelper::SetShaderStates(gl_.get(), vshader, true, NULL, NULL, | |
419 shader_version, &vertex_attrib_map, | |
420 &vertex_uniform_map, &vertex_varying_map, | |
421 &vertex_output_variable_list, NULL); | |
391 TestHelper::SetShaderStates( | 422 TestHelper::SetShaderStates( |
392 gl_.get(), vshader, true, NULL, NULL, NULL, | 423 gl_.get(), fshader, true, NULL, NULL, shader_version, &frag_attrib_map, |
393 &vertex_attrib_map, &vertex_uniform_map, &vertex_varying_map, NULL); | 424 &frag_uniform_map, &frag_varying_map, &frag_output_variable_list, NULL); |
394 TestHelper::SetShaderStates( | |
395 gl_.get(), fshader, true, NULL, NULL, NULL, | |
396 &frag_attrib_map, &frag_uniform_map, &frag_varying_map, NULL); | |
397 | 425 |
398 // Set up program | 426 // Set up program |
399 Program* program = | 427 Program* program = |
400 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 428 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
401 EXPECT_TRUE(program != NULL); | 429 EXPECT_TRUE(program != NULL); |
402 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 430 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
403 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 431 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
404 return program; | 432 return program; |
405 } | 433 } |
406 | 434 |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
497 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1"; | 525 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1"; |
498 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2"; | 526 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2"; |
499 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3"; | 527 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3"; |
500 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1"; | 528 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1"; |
501 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2"; | 529 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2"; |
502 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex = | 530 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex = |
503 "uniform2[0]"; | 531 "uniform2[0]"; |
504 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3"; | 532 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3"; |
505 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex = | 533 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex = |
506 "uniform3[0]"; | 534 "uniform3[0]"; |
535 const char* ProgramManagerWithShaderTest::kOutputVariable1Name = "outputVar1"; | |
507 | 536 |
508 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) { | 537 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) { |
509 const Program* program = SetupDefaultProgram(); | 538 const Program* program = SetupDefaultProgram(); |
510 ASSERT_TRUE(program != NULL); | 539 ASSERT_TRUE(program != NULL); |
511 const Program::AttribInfoVector& infos = | 540 const Program::AttribInfoVector& infos = |
512 program->GetAttribInfos(); | 541 program->GetAttribInfos(); |
513 ASSERT_EQ(kNumAttribs, infos.size()); | 542 ASSERT_EQ(kNumAttribs, infos.size()); |
514 for (size_t ii = 0; ii < kNumAttribs; ++ii) { | 543 for (size_t ii = 0; ii < kNumAttribs; ++ii) { |
515 const Program::VertexAttrib& info = infos[ii]; | 544 const Program::VertexAttrib& info = infos[ii]; |
516 const AttribInfo& expected = kAttribs[ii]; | 545 const AttribInfo& expected = kAttribs[ii]; |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
800 // Some GL drivers incorrectly return the wrong type. For example they return | 829 // Some GL drivers incorrectly return the wrong type. For example they return |
801 // GL_FLOAT_VEC2 when they should return GL_FLOAT_MAT2. Check we handle this. | 830 // GL_FLOAT_VEC2 when they should return GL_FLOAT_MAT2. Check we handle this. |
802 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) { | 831 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) { |
803 static GLenum kAttrib2BadType = GL_FLOAT_VEC2; | 832 static GLenum kAttrib2BadType = GL_FLOAT_VEC2; |
804 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2; | 833 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2; |
805 static GLenum kUniform2BadType = GL_FLOAT_VEC3; | 834 static GLenum kUniform2BadType = GL_FLOAT_VEC3; |
806 static GLenum kUniform2GoodType = GL_FLOAT_MAT3; | 835 static GLenum kUniform2GoodType = GL_FLOAT_MAT3; |
807 AttributeMap attrib_map; | 836 AttributeMap attrib_map; |
808 UniformMap uniform_map; | 837 UniformMap uniform_map; |
809 VaryingMap varying_map; | 838 VaryingMap varying_map; |
839 AttributeList output_variable_list; | |
810 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute( | 840 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute( |
811 kAttrib1Type, kAttrib1Size, kAttrib1Precision, | 841 kAttrib1Type, kAttrib1Size, kAttrib1Precision, |
812 kAttribStaticUse, kAttrib1Name); | 842 kAttribStaticUse, kAttrib1Name); |
813 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute( | 843 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute( |
814 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision, | 844 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision, |
815 kAttribStaticUse, kAttrib2Name); | 845 kAttribStaticUse, kAttrib2Name); |
816 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute( | 846 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute( |
817 kAttrib3Type, kAttrib3Size, kAttrib3Precision, | 847 kAttrib3Type, kAttrib3Size, kAttrib3Precision, |
818 kAttribStaticUse, kAttrib3Name); | 848 kAttribStaticUse, kAttrib3Name); |
819 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( | 849 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( |
820 kUniform1Type, kUniform1Size, kUniform1Precision, | 850 kUniform1Type, kUniform1Size, kUniform1Precision, |
821 kUniform1StaticUse, kUniform1Name); | 851 kUniform1StaticUse, kUniform1Name); |
822 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( | 852 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( |
823 kUniform2GoodType, kUniform2Size, kUniform2Precision, | 853 kUniform2GoodType, kUniform2Size, kUniform2Precision, |
824 kUniform2StaticUse, kUniform2Name); | 854 kUniform2StaticUse, kUniform2Name); |
825 uniform_map[kUniform3Name] = TestHelper::ConstructUniform( | 855 uniform_map[kUniform3Name] = TestHelper::ConstructUniform( |
826 kUniform3Type, kUniform3Size, kUniform3Precision, | 856 kUniform3Type, kUniform3Size, kUniform3Precision, |
827 kUniform3StaticUse, kUniform3Name); | 857 kUniform3StaticUse, kUniform3Name); |
858 output_variable_list.push_back(TestHelper::ConstructAttribute( | |
859 kOutputVariable1Type, kOutputVariable1Size, kOutputVariable1Precision, | |
860 kOutputVariable1StaticUse, kOutputVariable1Name)); | |
861 | |
828 Shader* vshader = shader_manager_.CreateShader( | 862 Shader* vshader = shader_manager_.CreateShader( |
829 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 863 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
830 ASSERT_TRUE(vshader != NULL); | 864 ASSERT_TRUE(vshader != NULL); |
831 TestHelper::SetShaderStates( | 865 TestHelper::SetShaderStates(gl_.get(), vshader, true, NULL, NULL, NULL, |
832 gl_.get(), vshader, true, NULL, NULL, NULL, | 866 &attrib_map, &uniform_map, &varying_map, |
833 &attrib_map, &uniform_map, &varying_map, NULL); | 867 &output_variable_list, NULL); |
834 Shader* fshader = shader_manager_.CreateShader( | 868 Shader* fshader = shader_manager_.CreateShader( |
835 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 869 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
836 ASSERT_TRUE(fshader != NULL); | 870 ASSERT_TRUE(fshader != NULL); |
837 TestHelper::SetShaderStates( | 871 TestHelper::SetShaderStates(gl_.get(), fshader, true, NULL, NULL, NULL, |
838 gl_.get(), fshader, true, NULL, NULL, NULL, | 872 &attrib_map, &uniform_map, &varying_map, |
839 &attrib_map, &uniform_map, &varying_map, NULL); | 873 &output_variable_list, NULL); |
840 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = { | 874 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = { |
841 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, | 875 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, |
842 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, }, | 876 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, }, |
843 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, | 877 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, |
844 }; | 878 }; |
845 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = { | 879 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = { |
846 { kUniform1Name, | 880 { kUniform1Name, |
847 kUniform1Size, | 881 kUniform1Size, |
848 kUniform1Type, | 882 kUniform1Type, |
849 kUniform1FakeLocation, | 883 kUniform1FakeLocation, |
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1468 kAttribStaticUse, | 1502 kAttribStaticUse, |
1469 kAttribMatName); | 1503 kAttribMatName); |
1470 // Check we can create shader. | 1504 // Check we can create shader. |
1471 Shader* vshader = shader_manager_.CreateShader( | 1505 Shader* vshader = shader_manager_.CreateShader( |
1472 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1506 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1473 Shader* fshader = shader_manager_.CreateShader( | 1507 Shader* fshader = shader_manager_.CreateShader( |
1474 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1508 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
1475 // Check shader got created. | 1509 // Check shader got created. |
1476 ASSERT_TRUE(vshader != NULL && fshader != NULL); | 1510 ASSERT_TRUE(vshader != NULL && fshader != NULL); |
1477 // Set Status | 1511 // Set Status |
1478 TestHelper::SetShaderStates( | 1512 TestHelper::SetShaderStates(gl_.get(), vshader, true, NULL, NULL, NULL, |
1479 gl_.get(), vshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, | 1513 &attrib_map, NULL, NULL, NULL, NULL); |
1480 NULL); | |
1481 // Check attrib infos got copied. | 1514 // Check attrib infos got copied. |
1482 for (AttributeMap::const_iterator it = attrib_map.begin(); | 1515 for (AttributeMap::const_iterator it = attrib_map.begin(); |
1483 it != attrib_map.end(); ++it) { | 1516 it != attrib_map.end(); ++it) { |
1484 const sh::Attribute* variable_info = | 1517 const sh::Attribute* variable_info = |
1485 vshader->GetAttribInfo(it->first); | 1518 vshader->GetAttribInfo(it->first); |
1486 ASSERT_TRUE(variable_info != NULL); | 1519 ASSERT_TRUE(variable_info != NULL); |
1487 EXPECT_EQ(it->second.type, variable_info->type); | 1520 EXPECT_EQ(it->second.type, variable_info->type); |
1488 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); | 1521 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); |
1489 EXPECT_EQ(it->second.precision, variable_info->precision); | 1522 EXPECT_EQ(it->second.precision, variable_info->precision); |
1490 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); | 1523 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); |
1491 EXPECT_EQ(it->second.name, variable_info->name); | 1524 EXPECT_EQ(it->second.name, variable_info->name); |
1492 } | 1525 } |
1493 TestHelper::SetShaderStates( | 1526 TestHelper::SetShaderStates(gl_.get(), fshader, true, NULL, NULL, NULL, |
1494 gl_.get(), fshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, | 1527 &attrib_map, NULL, NULL, NULL, NULL); |
1495 NULL); | |
1496 | 1528 |
1497 // Set up program | 1529 // Set up program |
1498 Program* program = | 1530 Program* program = |
1499 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1531 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
1500 ASSERT_TRUE(program != NULL); | 1532 ASSERT_TRUE(program != NULL); |
1501 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 1533 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
1502 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 1534 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
1503 | 1535 |
1504 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts()); | 1536 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts()); |
1505 EXPECT_TRUE(LinkAsExpected(program, true)); | 1537 EXPECT_TRUE(LinkAsExpected(program, true)); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1552 GL_FLOAT, 3, GL_LOW_FLOAT, true, "a"); | 1584 GL_FLOAT, 3, GL_LOW_FLOAT, true, "a"); |
1553 | 1585 |
1554 // Check we can create shader. | 1586 // Check we can create shader. |
1555 Shader* vshader = shader_manager_.CreateShader( | 1587 Shader* vshader = shader_manager_.CreateShader( |
1556 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1588 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1557 Shader* fshader = shader_manager_.CreateShader( | 1589 Shader* fshader = shader_manager_.CreateShader( |
1558 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1590 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
1559 // Check shader got created. | 1591 // Check shader got created. |
1560 ASSERT_TRUE(vshader != NULL && fshader != NULL); | 1592 ASSERT_TRUE(vshader != NULL && fshader != NULL); |
1561 // Set Status | 1593 // Set Status |
1562 TestHelper::SetShaderStates( | 1594 TestHelper::SetShaderStates(gl_.get(), vshader, true, NULL, NULL, NULL, NULL, |
1563 gl_.get(), vshader, true, NULL, NULL, NULL, NULL, | 1595 &vertex_uniform_map, NULL, NULL, NULL); |
1564 &vertex_uniform_map, NULL, NULL); | 1596 TestHelper::SetShaderStates(gl_.get(), fshader, true, NULL, NULL, NULL, NULL, |
1565 TestHelper::SetShaderStates( | 1597 &frag_uniform_map, NULL, NULL, NULL); |
1566 gl_.get(), fshader, true, NULL, NULL, NULL, NULL, | |
1567 &frag_uniform_map, NULL, NULL); | |
1568 | 1598 |
1569 // Set up program | 1599 // Set up program |
1570 Program* program = | 1600 Program* program = |
1571 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1601 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
1572 ASSERT_TRUE(program != NULL); | 1602 ASSERT_TRUE(program != NULL); |
1573 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 1603 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
1574 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 1604 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
1575 | 1605 |
1576 std::string conflicting_name; | 1606 std::string conflicting_name; |
1577 | 1607 |
1578 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name)); | 1608 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name)); |
1579 EXPECT_EQ("a", conflicting_name); | 1609 EXPECT_EQ("a", conflicting_name); |
1580 EXPECT_TRUE(LinkAsExpected(program, false)); | 1610 EXPECT_TRUE(LinkAsExpected(program, false)); |
1581 } | 1611 } |
1582 | 1612 |
1583 // If a varying has different type in the vertex and fragment | 1613 // If a varying has different type in the vertex and fragment |
1584 // shader, linking should fail. | 1614 // shader, linking should fail. |
1585 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { | 1615 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { |
1586 const VarInfo kVertexVarying = | 1616 const VarInfo kVertexVarying = |
1587 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1617 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1588 const VarInfo kFragmentVarying = | 1618 const VarInfo kFragmentVarying = |
1589 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1619 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1590 Program* program = SetupShaderVariableTest( | 1620 Program* program = |
1591 &kVertexVarying, 1, &kFragmentVarying, 1); | 1621 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
1592 | 1622 |
1593 std::string conflicting_name; | 1623 std::string conflicting_name; |
1594 | 1624 |
1595 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1625 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
1596 EXPECT_EQ("a", conflicting_name); | 1626 EXPECT_EQ("a", conflicting_name); |
1597 EXPECT_TRUE(LinkAsExpected(program, false)); | 1627 EXPECT_TRUE(LinkAsExpected(program, false)); |
1598 } | 1628 } |
1599 | 1629 |
1600 // If a varying has different array size in the vertex and fragment | 1630 // If a varying has different array size in the vertex and fragment |
1601 // shader, linking should fail. | 1631 // shader, linking should fail. |
1602 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { | 1632 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { |
1603 const VarInfo kVertexVarying = | 1633 const VarInfo kVertexVarying = |
1604 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1634 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1605 const VarInfo kFragmentVarying = | 1635 const VarInfo kFragmentVarying = |
1606 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1636 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1607 Program* program = SetupShaderVariableTest( | 1637 Program* program = |
1608 &kVertexVarying, 1, &kFragmentVarying, 1); | 1638 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
1609 | 1639 |
1610 std::string conflicting_name; | 1640 std::string conflicting_name; |
1611 | 1641 |
1612 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1642 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
1613 EXPECT_EQ("a", conflicting_name); | 1643 EXPECT_EQ("a", conflicting_name); |
1614 EXPECT_TRUE(LinkAsExpected(program, false)); | 1644 EXPECT_TRUE(LinkAsExpected(program, false)); |
1615 } | 1645 } |
1616 | 1646 |
1617 // If a varying has different precision in the vertex and fragment | 1647 // If a varying has different precision in the vertex and fragment |
1618 // shader, linking should succeed. | 1648 // shader, linking should succeed. |
1619 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { | 1649 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { |
1620 const VarInfo kVertexVarying = | 1650 const VarInfo kVertexVarying = |
1621 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying }; | 1651 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying }; |
1622 const VarInfo kFragmentVarying = | 1652 const VarInfo kFragmentVarying = |
1623 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1653 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1624 Program* program = SetupShaderVariableTest( | 1654 Program* program = |
1625 &kVertexVarying, 1, &kFragmentVarying, 1); | 1655 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
1626 | 1656 |
1627 std::string conflicting_name; | 1657 std::string conflicting_name; |
1628 | 1658 |
1629 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); | 1659 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); |
1630 EXPECT_TRUE(conflicting_name.empty()); | 1660 EXPECT_TRUE(conflicting_name.empty()); |
1631 EXPECT_TRUE(LinkAsExpected(program, true)); | 1661 EXPECT_TRUE(LinkAsExpected(program, true)); |
1632 } | 1662 } |
1633 | 1663 |
1634 // If a varying is statically used in fragment shader but not | 1664 // If a varying is statically used in fragment shader but not |
1635 // declared in vertex shader, link should fail. | 1665 // declared in vertex shader, link should fail. |
1636 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { | 1666 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { |
1637 const VarInfo kFragmentVarying = | 1667 const VarInfo kFragmentVarying = |
1638 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1668 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1639 Program* program = SetupShaderVariableTest( | 1669 Program* program = SetupProgramForVariables(NULL, 0, &kFragmentVarying, 1); |
1640 NULL, 0, &kFragmentVarying, 1); | |
1641 | 1670 |
1642 std::string conflicting_name; | 1671 std::string conflicting_name; |
1643 | 1672 |
1644 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1673 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
1645 EXPECT_EQ("a", conflicting_name); | 1674 EXPECT_EQ("a", conflicting_name); |
1646 EXPECT_TRUE(LinkAsExpected(program, false)); | 1675 EXPECT_TRUE(LinkAsExpected(program, false)); |
1647 } | 1676 } |
1648 | 1677 |
1649 // If a varying is declared but not statically used in fragment | 1678 // If a varying is declared but not statically used in fragment |
1650 // shader, even if it's not declared in vertex shader, link should | 1679 // shader, even if it's not declared in vertex shader, link should |
1651 // succeed. | 1680 // succeed. |
1652 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { | 1681 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { |
1653 const VarInfo kFragmentVarying = | 1682 const VarInfo kFragmentVarying = |
1654 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying }; | 1683 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying }; |
1655 Program* program = SetupShaderVariableTest( | 1684 Program* program = SetupProgramForVariables(NULL, 0, &kFragmentVarying, 1); |
1656 NULL, 0, &kFragmentVarying, 1); | |
1657 | 1685 |
1658 std::string conflicting_name; | 1686 std::string conflicting_name; |
1659 | 1687 |
1660 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); | 1688 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); |
1661 EXPECT_TRUE(conflicting_name.empty()); | 1689 EXPECT_TRUE(conflicting_name.empty()); |
1662 EXPECT_TRUE(LinkAsExpected(program, true)); | 1690 EXPECT_TRUE(LinkAsExpected(program, true)); |
1663 } | 1691 } |
1664 | 1692 |
1665 // Uniforms and attributes are both global variables, thus sharing | 1693 // Uniforms and attributes are both global variables, thus sharing |
1666 // the same namespace. Any name conflicts should cause link | 1694 // the same namespace. Any name conflicts should cause link |
1667 // failure. | 1695 // failure. |
1668 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { | 1696 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { |
1669 const VarInfo kVertexAttribute = | 1697 const VarInfo kVertexAttribute = |
1670 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute }; | 1698 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute }; |
1671 const VarInfo kFragmentUniform = | 1699 const VarInfo kFragmentUniform = |
1672 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform }; | 1700 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform }; |
1673 Program* program = SetupShaderVariableTest( | 1701 Program* program = |
1674 &kVertexAttribute, 1, &kFragmentUniform, 1); | 1702 SetupProgramForVariables(&kVertexAttribute, 1, &kFragmentUniform, 1); |
1675 | 1703 |
1676 std::string conflicting_name; | 1704 std::string conflicting_name; |
1677 | 1705 |
1678 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); | 1706 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); |
1679 EXPECT_EQ("a", conflicting_name); | 1707 EXPECT_EQ("a", conflicting_name); |
1680 EXPECT_TRUE(LinkAsExpected(program, false)); | 1708 EXPECT_TRUE(LinkAsExpected(program, false)); |
1681 } | 1709 } |
1682 | 1710 |
1683 // Varyings go over 8 rows. | 1711 // Varyings go over 8 rows. |
1684 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { | 1712 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { |
1685 const VarInfo kVertexVaryings[] = { | 1713 const VarInfo kVertexVaryings[] = { |
1686 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1714 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1687 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1715 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1688 }; | 1716 }; |
1689 const VarInfo kFragmentVaryings[] = { | 1717 const VarInfo kFragmentVaryings[] = { |
1690 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1718 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1691 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1719 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1692 }; | 1720 }; |
1693 Program* program = SetupShaderVariableTest( | 1721 Program* program = |
1694 kVertexVaryings, 2, kFragmentVaryings, 2); | 1722 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
1695 | 1723 |
1696 EXPECT_FALSE( | 1724 EXPECT_FALSE( |
1697 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); | 1725 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); |
1698 EXPECT_TRUE(LinkAsExpected(program, false)); | 1726 EXPECT_TRUE(LinkAsExpected(program, false)); |
1699 } | 1727 } |
1700 | 1728 |
1701 // Varyings go over 8 rows but some are inactive | 1729 // Varyings go over 8 rows but some are inactive |
1702 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) { | 1730 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) { |
1703 const VarInfo kVertexVaryings[] = { | 1731 const VarInfo kVertexVaryings[] = { |
1704 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1732 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1705 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1733 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1706 }; | 1734 }; |
1707 const VarInfo kFragmentVaryings[] = { | 1735 const VarInfo kFragmentVaryings[] = { |
1708 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, | 1736 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, |
1709 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1737 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1710 }; | 1738 }; |
1711 Program* program = SetupShaderVariableTest( | 1739 Program* program = |
1712 kVertexVaryings, 2, kFragmentVaryings, 2); | 1740 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
1713 | 1741 |
1714 EXPECT_TRUE( | 1742 EXPECT_TRUE( |
1715 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); | 1743 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); |
1716 EXPECT_TRUE(LinkAsExpected(program, true)); | 1744 EXPECT_TRUE(LinkAsExpected(program, true)); |
1717 } | 1745 } |
1718 | 1746 |
1719 // Varyings go over 8 rows but some are inactive. | 1747 // Varyings go over 8 rows but some are inactive. |
1720 // However, we still fail the check if kCountAll option is used. | 1748 // However, we still fail the check if kCountAll option is used. |
1721 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) { | 1749 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) { |
1722 const VarInfo kVertexVaryings[] = { | 1750 const VarInfo kVertexVaryings[] = { |
1723 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1751 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1724 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1752 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1725 }; | 1753 }; |
1726 const VarInfo kFragmentVaryings[] = { | 1754 const VarInfo kFragmentVaryings[] = { |
1727 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, | 1755 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, |
1728 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1756 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1729 }; | 1757 }; |
1730 Program* program = SetupShaderVariableTest( | 1758 Program* program = |
1731 kVertexVaryings, 2, kFragmentVaryings, 2); | 1759 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
1732 | 1760 |
1733 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll)); | 1761 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll)); |
1734 } | 1762 } |
1735 | 1763 |
1736 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) { | 1764 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) { |
1737 Shader* vshader = shader_manager_.CreateShader( | 1765 Shader* vshader = shader_manager_.CreateShader( |
1738 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1766 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1739 ASSERT_TRUE(vshader != NULL); | 1767 ASSERT_TRUE(vshader != NULL); |
1740 TestHelper::SetShaderStates(gl_.get(), vshader, true); | 1768 TestHelper::SetShaderStates(gl_.get(), vshader, true); |
1741 Shader* fshader = shader_manager_.CreateShader( | 1769 Shader* fshader = shader_manager_.CreateShader( |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1881 ProgramManagerWithCacheTest() | 1909 ProgramManagerWithCacheTest() |
1882 : cache_(new MockProgramCache()), | 1910 : cache_(new MockProgramCache()), |
1883 vertex_shader_(NULL), | 1911 vertex_shader_(NULL), |
1884 fragment_shader_(NULL), | 1912 fragment_shader_(NULL), |
1885 program_(NULL) { | 1913 program_(NULL) { |
1886 } | 1914 } |
1887 | 1915 |
1888 protected: | 1916 protected: |
1889 void SetupProgramManager() override { | 1917 void SetupProgramManager() override { |
1890 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors, | 1918 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors, |
1919 kMaxDualSourceDrawBuffers, | |
1891 feature_info_.get())); | 1920 feature_info_.get())); |
1892 } | 1921 } |
1893 | 1922 |
1894 void SetUp() override { | 1923 void SetUp() override { |
1895 ProgramManagerTestBase::SetUp(); | 1924 ProgramManagerTestBase::SetUp(); |
1896 | 1925 |
1897 vertex_shader_ = shader_manager_.CreateShader( | 1926 vertex_shader_ = shader_manager_.CreateShader( |
1898 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1927 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1899 fragment_shader_ = shader_manager_.CreateShader( | 1928 fragment_shader_ = shader_manager_.CreateShader( |
1900 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1929 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
1901 ASSERT_TRUE(vertex_shader_ != NULL); | 1930 ASSERT_TRUE(vertex_shader_ != NULL); |
1902 ASSERT_TRUE(fragment_shader_ != NULL); | 1931 ASSERT_TRUE(fragment_shader_ != NULL); |
1903 vertex_shader_->set_source("lka asjf bjajsdfj"); | 1932 vertex_shader_->set_source("lka asjf bjajsdfj"); |
1904 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj"); | 1933 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj"); |
1905 | 1934 |
1906 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1935 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
1907 ASSERT_TRUE(program_ != NULL); | 1936 ASSERT_TRUE(program_ != NULL); |
1908 | 1937 |
1909 program_->AttachShader(&shader_manager_, vertex_shader_); | 1938 program_->AttachShader(&shader_manager_, vertex_shader_); |
1910 program_->AttachShader(&shader_manager_, fragment_shader_); | 1939 program_->AttachShader(&shader_manager_, fragment_shader_); |
1911 } | 1940 } |
1941 | |
1912 void TearDown() override { | 1942 void TearDown() override { |
1913 shader_manager_.Destroy(false); | 1943 shader_manager_.Destroy(false); |
1914 ProgramManagerTestBase::TearDown(); | 1944 ProgramManagerTestBase::TearDown(); |
1915 } | 1945 } |
1946 | |
1916 void SetShadersCompiled() { | 1947 void SetShadersCompiled() { |
1917 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); | 1948 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); |
1918 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); | 1949 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); |
1919 } | 1950 } |
1920 | 1951 |
1921 void SetProgramCached() { | 1952 void SetProgramCached() { |
1922 cache_->LinkedProgramCacheSuccess( | 1953 cache_->LinkedProgramCacheSuccess( |
1923 vertex_shader_->source(), | 1954 vertex_shader_->source(), |
1924 fragment_shader_->source(), | 1955 fragment_shader_->source(), |
1925 &program_->bind_attrib_location_map(), | 1956 &program_->bind_attrib_location_map(), |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2175 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying( | 2206 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying( |
2176 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision, | 2207 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision, |
2177 kFragmentInput1StaticUse, kFragmentInput1Name); | 2208 kFragmentInput1StaticUse, kFragmentInput1Name); |
2178 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying( | 2209 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying( |
2179 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision, | 2210 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision, |
2180 kFragmentInput2StaticUse, kFragmentInput2Name); | 2211 kFragmentInput2StaticUse, kFragmentInput2Name); |
2181 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying( | 2212 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying( |
2182 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision, | 2213 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision, |
2183 kFragmentInput3StaticUse, kFragmentInput3Name); | 2214 kFragmentInput3StaticUse, kFragmentInput3Name); |
2184 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, | 2215 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
2185 nullptr, nullptr, nullptr, &varying_map, nullptr); | 2216 nullptr, nullptr, nullptr, &varying_map, nullptr, |
2217 nullptr); | |
2186 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, | 2218 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
2187 nullptr, nullptr, nullptr, &varying_map, nullptr); | 2219 nullptr, nullptr, nullptr, &varying_map, nullptr, |
2220 nullptr); | |
2188 Program* program = | 2221 Program* program = |
2189 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 2222 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
2190 ASSERT_TRUE(program != NULL); | 2223 ASSERT_TRUE(program != NULL); |
2191 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 2224 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
2192 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 2225 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
2193 EXPECT_TRUE(program->SetFragmentInputLocationBinding( | 2226 EXPECT_TRUE(program->SetFragmentInputLocationBinding( |
2194 kFragmentInput1Name, kFragmentInput1DesiredLocation)); | 2227 kFragmentInput1Name, kFragmentInput1DesiredLocation)); |
2195 EXPECT_TRUE(program->SetFragmentInputLocationBinding( | 2228 EXPECT_TRUE(program->SetFragmentInputLocationBinding( |
2196 kFragmentInput3Name, kFragmentInput3DesiredLocation)); | 2229 kFragmentInput3Name, kFragmentInput3DesiredLocation)); |
2197 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = { | 2230 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2248 INSTANTIATE_TEST_CASE_P( | 2281 INSTANTIATE_TEST_CASE_P( |
2249 SupportedContexts, | 2282 SupportedContexts, |
2250 ProgramManagerWithPathRenderingTest, | 2283 ProgramManagerWithPathRenderingTest, |
2251 testing::Values( | 2284 testing::Values( |
2252 make_gl_ext_tuple("3.2", | 2285 make_gl_ext_tuple("3.2", |
2253 "GL_ARB_program_interface_query " | 2286 "GL_ARB_program_interface_query " |
2254 "GL_EXT_direct_state_access GL_NV_path_rendering"), | 2287 "GL_EXT_direct_state_access GL_NV_path_rendering"), |
2255 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"), | 2288 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"), |
2256 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering"))); | 2289 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering"))); |
2257 | 2290 |
2291 class ProgramManagerDualSourceBlendingTest | |
2292 : public ProgramManagerWithShaderTest, | |
2293 public testing::WithParamInterface< | |
2294 testing::tuple<const char*, const char*>> { | |
2295 public: | |
2296 ProgramManagerDualSourceBlendingTest() {} | |
2297 | |
2298 protected: | |
2299 void SetUpWithFeatureInfo(FeatureInfo* feature_info) { | |
2300 const char* gl_version = testing::get<0>(GetParam()); | |
2301 const char* gl_extensions = testing::get<1>(GetParam()); | |
2302 SetUpBase(gl_version, gl_extensions, feature_info); | |
2303 } | |
2304 | |
2305 void SetUp() override { SetUpWithFeatureInfo(nullptr); } | |
2306 }; | |
2307 | |
2308 class ProgramManagerDualSourceBlendingES2Test | |
2309 : public ProgramManagerDualSourceBlendingTest {}; | |
2310 | |
2311 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragCoord) { | |
2312 DCHECK(feature_info_->feature_flags().ext_blend_func_extended); | |
2313 | |
2314 const VarInfo kFragmentVaryings[] = { | |
2315 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_SecondaryFragColorEXT", | |
2316 kVarOutput}, | |
2317 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_FragColor", kVarOutput}, | |
2318 }; | |
2319 | |
2320 int shader_version = 100; | |
2321 Program* program = | |
2322 SetupProgramForVariables(nullptr, 0, kFragmentVaryings, | |
2323 arraysize(kFragmentVaryings), &shader_version); | |
2324 | |
2325 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info(); | |
2326 if (!gl_version.is_es) { | |
2327 // The call is expected only for OpenGL. OpenGL ES expects to | |
2328 // output GLES SL 1.00, which does not bind. | |
2329 EXPECT_CALL(*(gl_.get()), | |
2330 BindFragDataLocationIndexed(kServiceProgramId, 0, 1, | |
2331 StrEq("angle_SecondaryFragColor"))) | |
2332 .Times(1) | |
2333 .RetiresOnSaturation(); | |
2334 } | |
2335 | |
2336 EXPECT_TRUE(LinkAsExpected(program, true)); | |
2337 } | |
2338 | |
2339 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragData) { | |
2340 const VarInfo kFragmentVaryings[] = { | |
2341 {GL_FLOAT_VEC4, kMaxDualSourceDrawBuffers, GL_MEDIUM_FLOAT, true, | |
2342 "gl_SecondaryFragDataEXT", kVarOutput}, | |
2343 {GL_FLOAT_VEC4, kMaxDrawBuffers, GL_MEDIUM_FLOAT, true, "gl_FragData", | |
2344 kVarOutput}, | |
2345 }; | |
2346 | |
2347 int shader_version = 100; | |
2348 Program* program = | |
2349 SetupProgramForVariables(nullptr, 0, kFragmentVaryings, | |
2350 arraysize(kFragmentVaryings), &shader_version); | |
2351 | |
2352 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info(); | |
2353 if (!gl_version.is_es) { | |
2354 // The call is expected only for OpenGL. OpenGL ES expects to | |
2355 // output GLES SL 1.00, which does not bind. | |
2356 EXPECT_CALL(*(gl_.get()), | |
2357 BindFragDataLocationIndexed(kServiceProgramId, 0, 1, | |
2358 StrEq("angle_SecondaryFragData"))) | |
2359 .Times(1) | |
2360 .RetiresOnSaturation(); | |
2361 } | |
2362 | |
2363 EXPECT_TRUE(LinkAsExpected(program, true)); | |
2364 } | |
2365 | |
2366 INSTANTIATE_TEST_CASE_P( | |
2367 SupportedContexts, | |
2368 ProgramManagerDualSourceBlendingES2Test, | |
2369 testing::Values( | |
2370 testing::make_tuple("3.2", | |
2371 "GL_ARB_draw_buffers GL_ARB_blend_func_extended"), | |
2372 testing::make_tuple("opengl es 2.0", | |
2373 "GL_EXT_draw_buffers GL_EXT_blend_func_extended"), | |
2374 testing::make_tuple("opengl es 3.0", | |
2375 "GL_EXT_draw_buffers GL_EXT_blend_func_extended"))); | |
2376 | |
Mark Kilgard
2015/08/28 19:53:24
good testing for the various variants allowed
| |
2258 } // namespace gles2 | 2377 } // namespace gles2 |
2259 } // namespace gpu | 2378 } // namespace gpu |
OLD | NEW |