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(nullptr, 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 } |
(...skipping 143 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 = nullptr) { |
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 |
391 TestHelper::SetShaderStates( | 418 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
392 gl_.get(), vshader, true, NULL, NULL, NULL, | 419 shader_version, &vertex_attrib_map, |
393 &vertex_attrib_map, &vertex_uniform_map, &vertex_varying_map, NULL); | 420 &vertex_uniform_map, &vertex_varying_map, |
394 TestHelper::SetShaderStates( | 421 &vertex_output_variable_list, nullptr); |
395 gl_.get(), fshader, true, NULL, NULL, NULL, | 422 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
396 &frag_attrib_map, &frag_uniform_map, &frag_varying_map, NULL); | 423 shader_version, &frag_attrib_map, |
| 424 &frag_uniform_map, &frag_varying_map, |
| 425 &frag_output_variable_list, nullptr); |
397 | 426 |
398 // Set up program | 427 // Set up program |
399 Program* program = | 428 Program* program = |
400 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 429 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
401 EXPECT_TRUE(program != NULL); | 430 EXPECT_TRUE(program != NULL); |
402 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 431 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
403 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 432 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
404 return program; | 433 return program; |
405 } | 434 } |
406 | 435 |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1"; | 526 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1"; |
498 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2"; | 527 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2"; |
499 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3"; | 528 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3"; |
500 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1"; | 529 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1"; |
501 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2"; | 530 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2"; |
502 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex = | 531 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex = |
503 "uniform2[0]"; | 532 "uniform2[0]"; |
504 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3"; | 533 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3"; |
505 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex = | 534 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex = |
506 "uniform3[0]"; | 535 "uniform3[0]"; |
| 536 const char* ProgramManagerWithShaderTest::kOutputVariable1Name = "outputVar1"; |
507 | 537 |
508 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) { | 538 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) { |
509 const Program* program = SetupDefaultProgram(); | 539 const Program* program = SetupDefaultProgram(); |
510 ASSERT_TRUE(program != NULL); | 540 ASSERT_TRUE(program != NULL); |
511 const Program::AttribInfoVector& infos = | 541 const Program::AttribInfoVector& infos = |
512 program->GetAttribInfos(); | 542 program->GetAttribInfos(); |
513 ASSERT_EQ(kNumAttribs, infos.size()); | 543 ASSERT_EQ(kNumAttribs, infos.size()); |
514 for (size_t ii = 0; ii < kNumAttribs; ++ii) { | 544 for (size_t ii = 0; ii < kNumAttribs; ++ii) { |
515 const Program::VertexAttrib& info = infos[ii]; | 545 const Program::VertexAttrib& info = infos[ii]; |
516 const AttribInfo& expected = kAttribs[ii]; | 546 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 | 830 // 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. | 831 // GL_FLOAT_VEC2 when they should return GL_FLOAT_MAT2. Check we handle this. |
802 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) { | 832 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) { |
803 static GLenum kAttrib2BadType = GL_FLOAT_VEC2; | 833 static GLenum kAttrib2BadType = GL_FLOAT_VEC2; |
804 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2; | 834 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2; |
805 static GLenum kUniform2BadType = GL_FLOAT_VEC3; | 835 static GLenum kUniform2BadType = GL_FLOAT_VEC3; |
806 static GLenum kUniform2GoodType = GL_FLOAT_MAT3; | 836 static GLenum kUniform2GoodType = GL_FLOAT_MAT3; |
807 AttributeMap attrib_map; | 837 AttributeMap attrib_map; |
808 UniformMap uniform_map; | 838 UniformMap uniform_map; |
809 VaryingMap varying_map; | 839 VaryingMap varying_map; |
| 840 AttributeList output_variable_list; |
810 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute( | 841 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute( |
811 kAttrib1Type, kAttrib1Size, kAttrib1Precision, | 842 kAttrib1Type, kAttrib1Size, kAttrib1Precision, |
812 kAttribStaticUse, kAttrib1Name); | 843 kAttribStaticUse, kAttrib1Name); |
813 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute( | 844 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute( |
814 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision, | 845 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision, |
815 kAttribStaticUse, kAttrib2Name); | 846 kAttribStaticUse, kAttrib2Name); |
816 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute( | 847 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute( |
817 kAttrib3Type, kAttrib3Size, kAttrib3Precision, | 848 kAttrib3Type, kAttrib3Size, kAttrib3Precision, |
818 kAttribStaticUse, kAttrib3Name); | 849 kAttribStaticUse, kAttrib3Name); |
819 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( | 850 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( |
820 kUniform1Type, kUniform1Size, kUniform1Precision, | 851 kUniform1Type, kUniform1Size, kUniform1Precision, |
821 kUniform1StaticUse, kUniform1Name); | 852 kUniform1StaticUse, kUniform1Name); |
822 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( | 853 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( |
823 kUniform2GoodType, kUniform2Size, kUniform2Precision, | 854 kUniform2GoodType, kUniform2Size, kUniform2Precision, |
824 kUniform2StaticUse, kUniform2Name); | 855 kUniform2StaticUse, kUniform2Name); |
825 uniform_map[kUniform3Name] = TestHelper::ConstructUniform( | 856 uniform_map[kUniform3Name] = TestHelper::ConstructUniform( |
826 kUniform3Type, kUniform3Size, kUniform3Precision, | 857 kUniform3Type, kUniform3Size, kUniform3Precision, |
827 kUniform3StaticUse, kUniform3Name); | 858 kUniform3StaticUse, kUniform3Name); |
| 859 output_variable_list.push_back(TestHelper::ConstructAttribute( |
| 860 kOutputVariable1Type, kOutputVariable1Size, kOutputVariable1Precision, |
| 861 kOutputVariable1StaticUse, kOutputVariable1Name)); |
| 862 |
828 Shader* vshader = shader_manager_.CreateShader( | 863 Shader* vshader = shader_manager_.CreateShader( |
829 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 864 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
830 ASSERT_TRUE(vshader != NULL); | 865 ASSERT_TRUE(vshader != NULL); |
831 TestHelper::SetShaderStates( | 866 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
832 gl_.get(), vshader, true, NULL, NULL, NULL, | 867 nullptr, &attrib_map, &uniform_map, &varying_map, |
833 &attrib_map, &uniform_map, &varying_map, NULL); | 868 &output_variable_list, nullptr); |
834 Shader* fshader = shader_manager_.CreateShader( | 869 Shader* fshader = shader_manager_.CreateShader( |
835 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 870 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
836 ASSERT_TRUE(fshader != NULL); | 871 ASSERT_TRUE(fshader != NULL); |
837 TestHelper::SetShaderStates( | 872 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
838 gl_.get(), fshader, true, NULL, NULL, NULL, | 873 nullptr, &attrib_map, &uniform_map, &varying_map, |
839 &attrib_map, &uniform_map, &varying_map, NULL); | 874 &output_variable_list, nullptr); |
840 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = { | 875 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = { |
841 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, | 876 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, |
842 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, }, | 877 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, }, |
843 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, | 878 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, |
844 }; | 879 }; |
845 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = { | 880 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = { |
846 { kUniform1Name, | 881 { kUniform1Name, |
847 kUniform1Size, | 882 kUniform1Size, |
848 kUniform1Type, | 883 kUniform1Type, |
849 kUniform1FakeLocation, | 884 kUniform1FakeLocation, |
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1468 kAttribStaticUse, | 1503 kAttribStaticUse, |
1469 kAttribMatName); | 1504 kAttribMatName); |
1470 // Check we can create shader. | 1505 // Check we can create shader. |
1471 Shader* vshader = shader_manager_.CreateShader( | 1506 Shader* vshader = shader_manager_.CreateShader( |
1472 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1507 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1473 Shader* fshader = shader_manager_.CreateShader( | 1508 Shader* fshader = shader_manager_.CreateShader( |
1474 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1509 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
1475 // Check shader got created. | 1510 // Check shader got created. |
1476 ASSERT_TRUE(vshader != NULL && fshader != NULL); | 1511 ASSERT_TRUE(vshader != NULL && fshader != NULL); |
1477 // Set Status | 1512 // Set Status |
1478 TestHelper::SetShaderStates( | 1513 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
1479 gl_.get(), vshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, | 1514 nullptr, &attrib_map, nullptr, nullptr, nullptr, |
1480 NULL); | 1515 nullptr); |
1481 // Check attrib infos got copied. | 1516 // Check attrib infos got copied. |
1482 for (AttributeMap::const_iterator it = attrib_map.begin(); | 1517 for (AttributeMap::const_iterator it = attrib_map.begin(); |
1483 it != attrib_map.end(); ++it) { | 1518 it != attrib_map.end(); ++it) { |
1484 const sh::Attribute* variable_info = | 1519 const sh::Attribute* variable_info = |
1485 vshader->GetAttribInfo(it->first); | 1520 vshader->GetAttribInfo(it->first); |
1486 ASSERT_TRUE(variable_info != NULL); | 1521 ASSERT_TRUE(variable_info != NULL); |
1487 EXPECT_EQ(it->second.type, variable_info->type); | 1522 EXPECT_EQ(it->second.type, variable_info->type); |
1488 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); | 1523 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); |
1489 EXPECT_EQ(it->second.precision, variable_info->precision); | 1524 EXPECT_EQ(it->second.precision, variable_info->precision); |
1490 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); | 1525 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); |
1491 EXPECT_EQ(it->second.name, variable_info->name); | 1526 EXPECT_EQ(it->second.name, variable_info->name); |
1492 } | 1527 } |
1493 TestHelper::SetShaderStates( | 1528 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
1494 gl_.get(), fshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, | 1529 nullptr, &attrib_map, nullptr, nullptr, nullptr, |
1495 NULL); | 1530 nullptr); |
1496 | 1531 |
1497 // Set up program | 1532 // Set up program |
1498 Program* program = | 1533 Program* program = |
1499 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1534 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
1500 ASSERT_TRUE(program != NULL); | 1535 ASSERT_TRUE(program != NULL); |
1501 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 1536 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
1502 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 1537 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
1503 | 1538 |
1504 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts()); | 1539 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts()); |
1505 EXPECT_TRUE(LinkAsExpected(program, true)); | 1540 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"); | 1587 GL_FLOAT, 3, GL_LOW_FLOAT, true, "a"); |
1553 | 1588 |
1554 // Check we can create shader. | 1589 // Check we can create shader. |
1555 Shader* vshader = shader_manager_.CreateShader( | 1590 Shader* vshader = shader_manager_.CreateShader( |
1556 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1591 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1557 Shader* fshader = shader_manager_.CreateShader( | 1592 Shader* fshader = shader_manager_.CreateShader( |
1558 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1593 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
1559 // Check shader got created. | 1594 // Check shader got created. |
1560 ASSERT_TRUE(vshader != NULL && fshader != NULL); | 1595 ASSERT_TRUE(vshader != NULL && fshader != NULL); |
1561 // Set Status | 1596 // Set Status |
1562 TestHelper::SetShaderStates( | 1597 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
1563 gl_.get(), vshader, true, NULL, NULL, NULL, NULL, | 1598 nullptr, nullptr, &vertex_uniform_map, nullptr, |
1564 &vertex_uniform_map, NULL, NULL); | 1599 nullptr, nullptr); |
1565 TestHelper::SetShaderStates( | 1600 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
1566 gl_.get(), fshader, true, NULL, NULL, NULL, NULL, | 1601 nullptr, nullptr, &frag_uniform_map, nullptr, |
1567 &frag_uniform_map, NULL, NULL); | 1602 nullptr, nullptr); |
1568 | 1603 |
1569 // Set up program | 1604 // Set up program |
1570 Program* program = | 1605 Program* program = |
1571 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1606 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
1572 ASSERT_TRUE(program != NULL); | 1607 ASSERT_TRUE(program != NULL); |
1573 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 1608 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
1574 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 1609 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
1575 | 1610 |
1576 std::string conflicting_name; | 1611 std::string conflicting_name; |
1577 | 1612 |
1578 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name)); | 1613 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name)); |
1579 EXPECT_EQ("a", conflicting_name); | 1614 EXPECT_EQ("a", conflicting_name); |
1580 EXPECT_TRUE(LinkAsExpected(program, false)); | 1615 EXPECT_TRUE(LinkAsExpected(program, false)); |
1581 } | 1616 } |
1582 | 1617 |
1583 // If a varying has different type in the vertex and fragment | 1618 // If a varying has different type in the vertex and fragment |
1584 // shader, linking should fail. | 1619 // shader, linking should fail. |
1585 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { | 1620 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { |
1586 const VarInfo kVertexVarying = | 1621 const VarInfo kVertexVarying = |
1587 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1622 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1588 const VarInfo kFragmentVarying = | 1623 const VarInfo kFragmentVarying = |
1589 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1624 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1590 Program* program = SetupShaderVariableTest( | 1625 Program* program = |
1591 &kVertexVarying, 1, &kFragmentVarying, 1); | 1626 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
1592 | 1627 |
1593 std::string conflicting_name; | 1628 std::string conflicting_name; |
1594 | 1629 |
1595 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1630 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
1596 EXPECT_EQ("a", conflicting_name); | 1631 EXPECT_EQ("a", conflicting_name); |
1597 EXPECT_TRUE(LinkAsExpected(program, false)); | 1632 EXPECT_TRUE(LinkAsExpected(program, false)); |
1598 } | 1633 } |
1599 | 1634 |
1600 // If a varying has different array size in the vertex and fragment | 1635 // If a varying has different array size in the vertex and fragment |
1601 // shader, linking should fail. | 1636 // shader, linking should fail. |
1602 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { | 1637 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { |
1603 const VarInfo kVertexVarying = | 1638 const VarInfo kVertexVarying = |
1604 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1639 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1605 const VarInfo kFragmentVarying = | 1640 const VarInfo kFragmentVarying = |
1606 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1641 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1607 Program* program = SetupShaderVariableTest( | 1642 Program* program = |
1608 &kVertexVarying, 1, &kFragmentVarying, 1); | 1643 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
1609 | 1644 |
1610 std::string conflicting_name; | 1645 std::string conflicting_name; |
1611 | 1646 |
1612 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1647 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
1613 EXPECT_EQ("a", conflicting_name); | 1648 EXPECT_EQ("a", conflicting_name); |
1614 EXPECT_TRUE(LinkAsExpected(program, false)); | 1649 EXPECT_TRUE(LinkAsExpected(program, false)); |
1615 } | 1650 } |
1616 | 1651 |
1617 // If a varying has different precision in the vertex and fragment | 1652 // If a varying has different precision in the vertex and fragment |
1618 // shader, linking should succeed. | 1653 // shader, linking should succeed. |
1619 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { | 1654 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { |
1620 const VarInfo kVertexVarying = | 1655 const VarInfo kVertexVarying = |
1621 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying }; | 1656 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying }; |
1622 const VarInfo kFragmentVarying = | 1657 const VarInfo kFragmentVarying = |
1623 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1658 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1624 Program* program = SetupShaderVariableTest( | 1659 Program* program = |
1625 &kVertexVarying, 1, &kFragmentVarying, 1); | 1660 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
1626 | 1661 |
1627 std::string conflicting_name; | 1662 std::string conflicting_name; |
1628 | 1663 |
1629 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); | 1664 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); |
1630 EXPECT_TRUE(conflicting_name.empty()); | 1665 EXPECT_TRUE(conflicting_name.empty()); |
1631 EXPECT_TRUE(LinkAsExpected(program, true)); | 1666 EXPECT_TRUE(LinkAsExpected(program, true)); |
1632 } | 1667 } |
1633 | 1668 |
1634 // If a varying is statically used in fragment shader but not | 1669 // If a varying is statically used in fragment shader but not |
1635 // declared in vertex shader, link should fail. | 1670 // declared in vertex shader, link should fail. |
1636 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { | 1671 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { |
1637 const VarInfo kFragmentVarying = | 1672 const VarInfo kFragmentVarying = |
1638 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1673 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
1639 Program* program = SetupShaderVariableTest( | 1674 Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1); |
1640 NULL, 0, &kFragmentVarying, 1); | |
1641 | 1675 |
1642 std::string conflicting_name; | 1676 std::string conflicting_name; |
1643 | 1677 |
1644 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1678 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
1645 EXPECT_EQ("a", conflicting_name); | 1679 EXPECT_EQ("a", conflicting_name); |
1646 EXPECT_TRUE(LinkAsExpected(program, false)); | 1680 EXPECT_TRUE(LinkAsExpected(program, false)); |
1647 } | 1681 } |
1648 | 1682 |
1649 // If a varying is declared but not statically used in fragment | 1683 // If a varying is declared but not statically used in fragment |
1650 // shader, even if it's not declared in vertex shader, link should | 1684 // shader, even if it's not declared in vertex shader, link should |
1651 // succeed. | 1685 // succeed. |
1652 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { | 1686 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { |
1653 const VarInfo kFragmentVarying = | 1687 const VarInfo kFragmentVarying = |
1654 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying }; | 1688 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying }; |
1655 Program* program = SetupShaderVariableTest( | 1689 Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1); |
1656 NULL, 0, &kFragmentVarying, 1); | |
1657 | 1690 |
1658 std::string conflicting_name; | 1691 std::string conflicting_name; |
1659 | 1692 |
1660 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); | 1693 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); |
1661 EXPECT_TRUE(conflicting_name.empty()); | 1694 EXPECT_TRUE(conflicting_name.empty()); |
1662 EXPECT_TRUE(LinkAsExpected(program, true)); | 1695 EXPECT_TRUE(LinkAsExpected(program, true)); |
1663 } | 1696 } |
1664 | 1697 |
1665 // Uniforms and attributes are both global variables, thus sharing | 1698 // Uniforms and attributes are both global variables, thus sharing |
1666 // the same namespace. Any name conflicts should cause link | 1699 // the same namespace. Any name conflicts should cause link |
1667 // failure. | 1700 // failure. |
1668 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { | 1701 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { |
1669 const VarInfo kVertexAttribute = | 1702 const VarInfo kVertexAttribute = |
1670 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute }; | 1703 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute }; |
1671 const VarInfo kFragmentUniform = | 1704 const VarInfo kFragmentUniform = |
1672 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform }; | 1705 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform }; |
1673 Program* program = SetupShaderVariableTest( | 1706 Program* program = |
1674 &kVertexAttribute, 1, &kFragmentUniform, 1); | 1707 SetupProgramForVariables(&kVertexAttribute, 1, &kFragmentUniform, 1); |
1675 | 1708 |
1676 std::string conflicting_name; | 1709 std::string conflicting_name; |
1677 | 1710 |
1678 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); | 1711 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); |
1679 EXPECT_EQ("a", conflicting_name); | 1712 EXPECT_EQ("a", conflicting_name); |
1680 EXPECT_TRUE(LinkAsExpected(program, false)); | 1713 EXPECT_TRUE(LinkAsExpected(program, false)); |
1681 } | 1714 } |
1682 | 1715 |
1683 // Varyings go over 8 rows. | 1716 // Varyings go over 8 rows. |
1684 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { | 1717 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { |
1685 const VarInfo kVertexVaryings[] = { | 1718 const VarInfo kVertexVaryings[] = { |
1686 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1719 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1687 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1720 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1688 }; | 1721 }; |
1689 const VarInfo kFragmentVaryings[] = { | 1722 const VarInfo kFragmentVaryings[] = { |
1690 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1723 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1691 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1724 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1692 }; | 1725 }; |
1693 Program* program = SetupShaderVariableTest( | 1726 Program* program = |
1694 kVertexVaryings, 2, kFragmentVaryings, 2); | 1727 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
1695 | 1728 |
1696 EXPECT_FALSE( | 1729 EXPECT_FALSE( |
1697 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); | 1730 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); |
1698 EXPECT_TRUE(LinkAsExpected(program, false)); | 1731 EXPECT_TRUE(LinkAsExpected(program, false)); |
1699 } | 1732 } |
1700 | 1733 |
1701 // Varyings go over 8 rows but some are inactive | 1734 // Varyings go over 8 rows but some are inactive |
1702 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) { | 1735 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) { |
1703 const VarInfo kVertexVaryings[] = { | 1736 const VarInfo kVertexVaryings[] = { |
1704 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1737 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1705 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1738 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1706 }; | 1739 }; |
1707 const VarInfo kFragmentVaryings[] = { | 1740 const VarInfo kFragmentVaryings[] = { |
1708 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, | 1741 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, |
1709 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1742 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1710 }; | 1743 }; |
1711 Program* program = SetupShaderVariableTest( | 1744 Program* program = |
1712 kVertexVaryings, 2, kFragmentVaryings, 2); | 1745 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
1713 | 1746 |
1714 EXPECT_TRUE( | 1747 EXPECT_TRUE( |
1715 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); | 1748 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); |
1716 EXPECT_TRUE(LinkAsExpected(program, true)); | 1749 EXPECT_TRUE(LinkAsExpected(program, true)); |
1717 } | 1750 } |
1718 | 1751 |
1719 // Varyings go over 8 rows but some are inactive. | 1752 // Varyings go over 8 rows but some are inactive. |
1720 // However, we still fail the check if kCountAll option is used. | 1753 // However, we still fail the check if kCountAll option is used. |
1721 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) { | 1754 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) { |
1722 const VarInfo kVertexVaryings[] = { | 1755 const VarInfo kVertexVaryings[] = { |
1723 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1756 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
1724 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1757 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1725 }; | 1758 }; |
1726 const VarInfo kFragmentVaryings[] = { | 1759 const VarInfo kFragmentVaryings[] = { |
1727 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, | 1760 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, |
1728 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1761 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
1729 }; | 1762 }; |
1730 Program* program = SetupShaderVariableTest( | 1763 Program* program = |
1731 kVertexVaryings, 2, kFragmentVaryings, 2); | 1764 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
1732 | 1765 |
1733 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll)); | 1766 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll)); |
1734 } | 1767 } |
1735 | 1768 |
1736 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) { | 1769 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) { |
1737 Shader* vshader = shader_manager_.CreateShader( | 1770 Shader* vshader = shader_manager_.CreateShader( |
1738 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1771 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1739 ASSERT_TRUE(vshader != NULL); | 1772 ASSERT_TRUE(vshader != NULL); |
1740 TestHelper::SetShaderStates(gl_.get(), vshader, true); | 1773 TestHelper::SetShaderStates(gl_.get(), vshader, true); |
1741 Shader* fshader = shader_manager_.CreateShader( | 1774 Shader* fshader = shader_manager_.CreateShader( |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1881 ProgramManagerWithCacheTest() | 1914 ProgramManagerWithCacheTest() |
1882 : cache_(new MockProgramCache()), | 1915 : cache_(new MockProgramCache()), |
1883 vertex_shader_(NULL), | 1916 vertex_shader_(NULL), |
1884 fragment_shader_(NULL), | 1917 fragment_shader_(NULL), |
1885 program_(NULL) { | 1918 program_(NULL) { |
1886 } | 1919 } |
1887 | 1920 |
1888 protected: | 1921 protected: |
1889 void SetupProgramManager() override { | 1922 void SetupProgramManager() override { |
1890 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors, | 1923 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors, |
| 1924 kMaxDualSourceDrawBuffers, |
1891 feature_info_.get())); | 1925 feature_info_.get())); |
1892 } | 1926 } |
1893 | 1927 |
1894 void SetUp() override { | 1928 void SetUp() override { |
1895 ProgramManagerTestBase::SetUp(); | 1929 ProgramManagerTestBase::SetUp(); |
1896 | 1930 |
1897 vertex_shader_ = shader_manager_.CreateShader( | 1931 vertex_shader_ = shader_manager_.CreateShader( |
1898 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1932 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1899 fragment_shader_ = shader_manager_.CreateShader( | 1933 fragment_shader_ = shader_manager_.CreateShader( |
1900 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1934 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
1901 ASSERT_TRUE(vertex_shader_ != NULL); | 1935 ASSERT_TRUE(vertex_shader_ != NULL); |
1902 ASSERT_TRUE(fragment_shader_ != NULL); | 1936 ASSERT_TRUE(fragment_shader_ != NULL); |
1903 vertex_shader_->set_source("lka asjf bjajsdfj"); | 1937 vertex_shader_->set_source("lka asjf bjajsdfj"); |
1904 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj"); | 1938 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj"); |
1905 | 1939 |
1906 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1940 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
1907 ASSERT_TRUE(program_ != NULL); | 1941 ASSERT_TRUE(program_ != NULL); |
1908 | 1942 |
1909 program_->AttachShader(&shader_manager_, vertex_shader_); | 1943 program_->AttachShader(&shader_manager_, vertex_shader_); |
1910 program_->AttachShader(&shader_manager_, fragment_shader_); | 1944 program_->AttachShader(&shader_manager_, fragment_shader_); |
1911 } | 1945 } |
| 1946 |
1912 void TearDown() override { | 1947 void TearDown() override { |
1913 shader_manager_.Destroy(false); | 1948 shader_manager_.Destroy(false); |
1914 ProgramManagerTestBase::TearDown(); | 1949 ProgramManagerTestBase::TearDown(); |
1915 } | 1950 } |
| 1951 |
1916 void SetShadersCompiled() { | 1952 void SetShadersCompiled() { |
1917 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); | 1953 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); |
1918 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); | 1954 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); |
1919 } | 1955 } |
1920 | 1956 |
1921 void SetProgramCached() { | 1957 void SetProgramCached() { |
1922 cache_->LinkedProgramCacheSuccess( | 1958 cache_->LinkedProgramCacheSuccess( |
1923 vertex_shader_->source(), | 1959 vertex_shader_->source(), |
1924 fragment_shader_->source(), | 1960 fragment_shader_->source(), |
1925 &program_->bind_attrib_location_map(), | 1961 &program_->bind_attrib_location_map(), |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2175 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying( | 2211 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying( |
2176 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision, | 2212 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision, |
2177 kFragmentInput1StaticUse, kFragmentInput1Name); | 2213 kFragmentInput1StaticUse, kFragmentInput1Name); |
2178 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying( | 2214 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying( |
2179 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision, | 2215 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision, |
2180 kFragmentInput2StaticUse, kFragmentInput2Name); | 2216 kFragmentInput2StaticUse, kFragmentInput2Name); |
2181 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying( | 2217 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying( |
2182 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision, | 2218 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision, |
2183 kFragmentInput3StaticUse, kFragmentInput3Name); | 2219 kFragmentInput3StaticUse, kFragmentInput3Name); |
2184 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, | 2220 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
2185 nullptr, nullptr, nullptr, &varying_map, nullptr); | 2221 nullptr, nullptr, nullptr, &varying_map, nullptr, |
| 2222 nullptr); |
2186 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, | 2223 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
2187 nullptr, nullptr, nullptr, &varying_map, nullptr); | 2224 nullptr, nullptr, nullptr, &varying_map, nullptr, |
| 2225 nullptr); |
2188 Program* program = | 2226 Program* program = |
2189 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 2227 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
2190 ASSERT_TRUE(program != NULL); | 2228 ASSERT_TRUE(program != NULL); |
2191 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 2229 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
2192 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 2230 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
2193 EXPECT_TRUE(program->SetFragmentInputLocationBinding( | 2231 EXPECT_TRUE(program->SetFragmentInputLocationBinding( |
2194 kFragmentInput1Name, kFragmentInput1DesiredLocation)); | 2232 kFragmentInput1Name, kFragmentInput1DesiredLocation)); |
2195 EXPECT_TRUE(program->SetFragmentInputLocationBinding( | 2233 EXPECT_TRUE(program->SetFragmentInputLocationBinding( |
2196 kFragmentInput3Name, kFragmentInput3DesiredLocation)); | 2234 kFragmentInput3Name, kFragmentInput3DesiredLocation)); |
2197 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = { | 2235 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2248 INSTANTIATE_TEST_CASE_P( | 2286 INSTANTIATE_TEST_CASE_P( |
2249 SupportedContexts, | 2287 SupportedContexts, |
2250 ProgramManagerWithPathRenderingTest, | 2288 ProgramManagerWithPathRenderingTest, |
2251 testing::Values( | 2289 testing::Values( |
2252 make_gl_ext_tuple("3.2", | 2290 make_gl_ext_tuple("3.2", |
2253 "GL_ARB_program_interface_query " | 2291 "GL_ARB_program_interface_query " |
2254 "GL_EXT_direct_state_access GL_NV_path_rendering"), | 2292 "GL_EXT_direct_state_access GL_NV_path_rendering"), |
2255 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"), | 2293 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"), |
2256 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering"))); | 2294 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering"))); |
2257 | 2295 |
| 2296 class ProgramManagerDualSourceBlendingTest |
| 2297 : public ProgramManagerWithShaderTest, |
| 2298 public testing::WithParamInterface< |
| 2299 testing::tuple<const char*, const char*>> { |
| 2300 public: |
| 2301 ProgramManagerDualSourceBlendingTest() {} |
| 2302 |
| 2303 protected: |
| 2304 void SetUpWithFeatureInfo(FeatureInfo* feature_info) { |
| 2305 const char* gl_version = testing::get<0>(GetParam()); |
| 2306 const char* gl_extensions = testing::get<1>(GetParam()); |
| 2307 SetUpBase(gl_version, gl_extensions, feature_info); |
| 2308 } |
| 2309 |
| 2310 void SetUp() override { SetUpWithFeatureInfo(nullptr); } |
| 2311 }; |
| 2312 |
| 2313 class ProgramManagerDualSourceBlendingES2Test |
| 2314 : public ProgramManagerDualSourceBlendingTest {}; |
| 2315 |
| 2316 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragCoord) { |
| 2317 DCHECK(feature_info_->feature_flags().ext_blend_func_extended); |
| 2318 |
| 2319 const VarInfo kFragmentVaryings[] = { |
| 2320 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_SecondaryFragColorEXT", |
| 2321 kVarOutput}, |
| 2322 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_FragColor", kVarOutput}, |
| 2323 }; |
| 2324 |
| 2325 int shader_version = 100; |
| 2326 Program* program = |
| 2327 SetupProgramForVariables(nullptr, 0, kFragmentVaryings, |
| 2328 arraysize(kFragmentVaryings), &shader_version); |
| 2329 |
| 2330 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info(); |
| 2331 if (!gl_version.is_es) { |
| 2332 // The call is expected only for OpenGL. OpenGL ES expects to |
| 2333 // output GLES SL 1.00, which does not bind. |
| 2334 EXPECT_CALL(*(gl_.get()), |
| 2335 BindFragDataLocationIndexed(kServiceProgramId, 0, 1, |
| 2336 StrEq("angle_SecondaryFragColor"))) |
| 2337 .Times(1) |
| 2338 .RetiresOnSaturation(); |
| 2339 } |
| 2340 |
| 2341 EXPECT_TRUE(LinkAsExpected(program, true)); |
| 2342 } |
| 2343 |
| 2344 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragData) { |
| 2345 const VarInfo kFragmentVaryings[] = { |
| 2346 {GL_FLOAT_VEC4, kMaxDualSourceDrawBuffers, GL_MEDIUM_FLOAT, true, |
| 2347 "gl_SecondaryFragDataEXT", kVarOutput}, |
| 2348 {GL_FLOAT_VEC4, kMaxDrawBuffers, GL_MEDIUM_FLOAT, true, "gl_FragData", |
| 2349 kVarOutput}, |
| 2350 }; |
| 2351 |
| 2352 int shader_version = 100; |
| 2353 Program* program = |
| 2354 SetupProgramForVariables(nullptr, 0, kFragmentVaryings, |
| 2355 arraysize(kFragmentVaryings), &shader_version); |
| 2356 |
| 2357 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info(); |
| 2358 if (!gl_version.is_es) { |
| 2359 // The call is expected only for OpenGL. OpenGL ES expects to |
| 2360 // output GLES SL 1.00, which does not bind. |
| 2361 EXPECT_CALL(*(gl_.get()), |
| 2362 BindFragDataLocationIndexed(kServiceProgramId, 0, 1, |
| 2363 StrEq("angle_SecondaryFragData"))) |
| 2364 .Times(1) |
| 2365 .RetiresOnSaturation(); |
| 2366 } |
| 2367 |
| 2368 EXPECT_TRUE(LinkAsExpected(program, true)); |
| 2369 } |
| 2370 |
| 2371 INSTANTIATE_TEST_CASE_P( |
| 2372 SupportedContexts, |
| 2373 ProgramManagerDualSourceBlendingES2Test, |
| 2374 testing::Values( |
| 2375 testing::make_tuple("3.2", |
| 2376 "GL_ARB_draw_buffers GL_ARB_blend_func_extended"), |
| 2377 testing::make_tuple("opengl es 2.0", |
| 2378 "GL_EXT_draw_buffers GL_EXT_blend_func_extended"), |
| 2379 testing::make_tuple("opengl es 3.0", |
| 2380 "GL_EXT_draw_buffers GL_EXT_blend_func_extended"))); |
| 2381 |
2258 } // namespace gles2 | 2382 } // namespace gles2 |
2259 } // namespace gpu | 2383 } // namespace gpu |
OLD | NEW |