| 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 OutputVariableList 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( |
| 357 TestHelper::ConstructOutputVariable( |
| 358 vertex_variables[ii].type, vertex_variables[ii].size, |
| 359 vertex_variables[ii].precision, |
| 360 vertex_variables[ii].static_use, vertex_variables[ii].name)); |
| 361 break; |
| 341 default: | 362 default: |
| 342 NOTREACHED(); | 363 NOTREACHED(); |
| 343 } | 364 } |
| 344 } | 365 } |
| 345 | 366 |
| 346 AttributeMap frag_attrib_map; | 367 AttributeMap frag_attrib_map; |
| 347 UniformMap frag_uniform_map; | 368 UniformMap frag_uniform_map; |
| 348 VaryingMap frag_varying_map; | 369 VaryingMap frag_varying_map; |
| 370 OutputVariableList frag_output_variable_list; |
| 349 for (size_t ii = 0; ii < fragment_variable_size; ++ii) { | 371 for (size_t ii = 0; ii < fragment_variable_size; ++ii) { |
| 350 switch (fragment_variables[ii].category) { | 372 switch (fragment_variables[ii].category) { |
| 351 case kVarAttribute: | 373 case kVarAttribute: |
| 352 frag_attrib_map[fragment_variables[ii].name] = | 374 frag_attrib_map[fragment_variables[ii].name] = |
| 353 TestHelper::ConstructAttribute( | 375 TestHelper::ConstructAttribute( |
| 354 fragment_variables[ii].type, | 376 fragment_variables[ii].type, |
| 355 fragment_variables[ii].size, | 377 fragment_variables[ii].size, |
| 356 fragment_variables[ii].precision, | 378 fragment_variables[ii].precision, |
| 357 fragment_variables[ii].static_use, | 379 fragment_variables[ii].static_use, |
| 358 fragment_variables[ii].name); | 380 fragment_variables[ii].name); |
| 359 break; | 381 break; |
| 360 case kVarUniform: | 382 case kVarUniform: |
| 361 frag_uniform_map[fragment_variables[ii].name] = | 383 frag_uniform_map[fragment_variables[ii].name] = |
| 362 TestHelper::ConstructUniform( | 384 TestHelper::ConstructUniform( |
| 363 fragment_variables[ii].type, | 385 fragment_variables[ii].type, |
| 364 fragment_variables[ii].size, | 386 fragment_variables[ii].size, |
| 365 fragment_variables[ii].precision, | 387 fragment_variables[ii].precision, |
| 366 fragment_variables[ii].static_use, | 388 fragment_variables[ii].static_use, |
| 367 fragment_variables[ii].name); | 389 fragment_variables[ii].name); |
| 368 break; | 390 break; |
| 369 case kVarVarying: | 391 case kVarVarying: |
| 370 frag_varying_map[fragment_variables[ii].name] = | 392 frag_varying_map[fragment_variables[ii].name] = |
| 371 TestHelper::ConstructVarying( | 393 TestHelper::ConstructVarying( |
| 372 fragment_variables[ii].type, | 394 fragment_variables[ii].type, |
| 373 fragment_variables[ii].size, | 395 fragment_variables[ii].size, |
| 374 fragment_variables[ii].precision, | 396 fragment_variables[ii].precision, |
| 375 fragment_variables[ii].static_use, | 397 fragment_variables[ii].static_use, |
| 376 fragment_variables[ii].name); | 398 fragment_variables[ii].name); |
| 377 break; | 399 break; |
| 400 case kVarOutput: |
| 401 frag_output_variable_list.push_back( |
| 402 TestHelper::ConstructOutputVariable( |
| 403 fragment_variables[ii].type, fragment_variables[ii].size, |
| 404 fragment_variables[ii].precision, |
| 405 fragment_variables[ii].static_use, |
| 406 fragment_variables[ii].name)); |
| 407 break; |
| 378 default: | 408 default: |
| 379 NOTREACHED(); | 409 NOTREACHED(); |
| 380 } | 410 } |
| 381 } | 411 } |
| 382 | 412 |
| 383 // Check we can create shader. | 413 // Check we can create shader. |
| 384 Shader* vshader = shader_manager_.CreateShader( | 414 Shader* vshader = shader_manager_.CreateShader( |
| 385 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 415 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
| 386 Shader* fshader = shader_manager_.CreateShader( | 416 Shader* fshader = shader_manager_.CreateShader( |
| 387 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 417 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
| 388 // Check shader got created. | 418 // Check shader got created. |
| 389 EXPECT_TRUE(vshader != NULL && fshader != NULL); | 419 EXPECT_TRUE(vshader != NULL && fshader != NULL); |
| 390 // Set Status | 420 // Set Status |
| 391 TestHelper::SetShaderStates( | 421 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
| 392 gl_.get(), vshader, true, NULL, NULL, NULL, | 422 shader_version, &vertex_attrib_map, |
| 393 &vertex_attrib_map, &vertex_uniform_map, &vertex_varying_map, NULL); | 423 &vertex_uniform_map, &vertex_varying_map, |
| 394 TestHelper::SetShaderStates( | 424 &vertex_output_variable_list, nullptr); |
| 395 gl_.get(), fshader, true, NULL, NULL, NULL, | 425 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
| 396 &frag_attrib_map, &frag_uniform_map, &frag_varying_map, NULL); | 426 shader_version, &frag_attrib_map, |
| 427 &frag_uniform_map, &frag_varying_map, |
| 428 &frag_output_variable_list, nullptr); |
| 397 | 429 |
| 398 // Set up program | 430 // Set up program |
| 399 Program* program = | 431 Program* program = |
| 400 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 432 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
| 401 EXPECT_TRUE(program != NULL); | 433 EXPECT_TRUE(program != NULL); |
| 402 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 434 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
| 403 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 435 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
| 404 return program; | 436 return program; |
| 405 } | 437 } |
| 406 | 438 |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1"; | 529 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1"; |
| 498 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2"; | 530 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2"; |
| 499 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3"; | 531 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3"; |
| 500 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1"; | 532 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1"; |
| 501 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2"; | 533 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2"; |
| 502 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex = | 534 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex = |
| 503 "uniform2[0]"; | 535 "uniform2[0]"; |
| 504 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3"; | 536 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3"; |
| 505 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex = | 537 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex = |
| 506 "uniform3[0]"; | 538 "uniform3[0]"; |
| 539 const char* ProgramManagerWithShaderTest::kOutputVariable1Name = "outputVar1"; |
| 507 | 540 |
| 508 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) { | 541 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) { |
| 509 const Program* program = SetupDefaultProgram(); | 542 const Program* program = SetupDefaultProgram(); |
| 510 ASSERT_TRUE(program != NULL); | 543 ASSERT_TRUE(program != NULL); |
| 511 const Program::AttribInfoVector& infos = | 544 const Program::AttribInfoVector& infos = |
| 512 program->GetAttribInfos(); | 545 program->GetAttribInfos(); |
| 513 ASSERT_EQ(kNumAttribs, infos.size()); | 546 ASSERT_EQ(kNumAttribs, infos.size()); |
| 514 for (size_t ii = 0; ii < kNumAttribs; ++ii) { | 547 for (size_t ii = 0; ii < kNumAttribs; ++ii) { |
| 515 const Program::VertexAttrib& info = infos[ii]; | 548 const Program::VertexAttrib& info = infos[ii]; |
| 516 const AttribInfo& expected = kAttribs[ii]; | 549 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 | 833 // 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. | 834 // GL_FLOAT_VEC2 when they should return GL_FLOAT_MAT2. Check we handle this. |
| 802 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) { | 835 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) { |
| 803 static GLenum kAttrib2BadType = GL_FLOAT_VEC2; | 836 static GLenum kAttrib2BadType = GL_FLOAT_VEC2; |
| 804 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2; | 837 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2; |
| 805 static GLenum kUniform2BadType = GL_FLOAT_VEC3; | 838 static GLenum kUniform2BadType = GL_FLOAT_VEC3; |
| 806 static GLenum kUniform2GoodType = GL_FLOAT_MAT3; | 839 static GLenum kUniform2GoodType = GL_FLOAT_MAT3; |
| 807 AttributeMap attrib_map; | 840 AttributeMap attrib_map; |
| 808 UniformMap uniform_map; | 841 UniformMap uniform_map; |
| 809 VaryingMap varying_map; | 842 VaryingMap varying_map; |
| 843 OutputVariableList output_variable_list; |
| 810 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute( | 844 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute( |
| 811 kAttrib1Type, kAttrib1Size, kAttrib1Precision, | 845 kAttrib1Type, kAttrib1Size, kAttrib1Precision, |
| 812 kAttribStaticUse, kAttrib1Name); | 846 kAttribStaticUse, kAttrib1Name); |
| 813 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute( | 847 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute( |
| 814 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision, | 848 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision, |
| 815 kAttribStaticUse, kAttrib2Name); | 849 kAttribStaticUse, kAttrib2Name); |
| 816 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute( | 850 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute( |
| 817 kAttrib3Type, kAttrib3Size, kAttrib3Precision, | 851 kAttrib3Type, kAttrib3Size, kAttrib3Precision, |
| 818 kAttribStaticUse, kAttrib3Name); | 852 kAttribStaticUse, kAttrib3Name); |
| 819 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( | 853 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( |
| 820 kUniform1Type, kUniform1Size, kUniform1Precision, | 854 kUniform1Type, kUniform1Size, kUniform1Precision, |
| 821 kUniform1StaticUse, kUniform1Name); | 855 kUniform1StaticUse, kUniform1Name); |
| 822 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( | 856 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( |
| 823 kUniform2GoodType, kUniform2Size, kUniform2Precision, | 857 kUniform2GoodType, kUniform2Size, kUniform2Precision, |
| 824 kUniform2StaticUse, kUniform2Name); | 858 kUniform2StaticUse, kUniform2Name); |
| 825 uniform_map[kUniform3Name] = TestHelper::ConstructUniform( | 859 uniform_map[kUniform3Name] = TestHelper::ConstructUniform( |
| 826 kUniform3Type, kUniform3Size, kUniform3Precision, | 860 kUniform3Type, kUniform3Size, kUniform3Precision, |
| 827 kUniform3StaticUse, kUniform3Name); | 861 kUniform3StaticUse, kUniform3Name); |
| 862 output_variable_list.push_back(TestHelper::ConstructOutputVariable( |
| 863 kOutputVariable1Type, kOutputVariable1Size, kOutputVariable1Precision, |
| 864 kOutputVariable1StaticUse, kOutputVariable1Name)); |
| 865 |
| 828 Shader* vshader = shader_manager_.CreateShader( | 866 Shader* vshader = shader_manager_.CreateShader( |
| 829 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 867 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
| 830 ASSERT_TRUE(vshader != NULL); | 868 ASSERT_TRUE(vshader != NULL); |
| 831 TestHelper::SetShaderStates( | 869 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
| 832 gl_.get(), vshader, true, NULL, NULL, NULL, | 870 nullptr, &attrib_map, &uniform_map, &varying_map, |
| 833 &attrib_map, &uniform_map, &varying_map, NULL); | 871 &output_variable_list, nullptr); |
| 834 Shader* fshader = shader_manager_.CreateShader( | 872 Shader* fshader = shader_manager_.CreateShader( |
| 835 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 873 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
| 836 ASSERT_TRUE(fshader != NULL); | 874 ASSERT_TRUE(fshader != NULL); |
| 837 TestHelper::SetShaderStates( | 875 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
| 838 gl_.get(), fshader, true, NULL, NULL, NULL, | 876 nullptr, &attrib_map, &uniform_map, &varying_map, |
| 839 &attrib_map, &uniform_map, &varying_map, NULL); | 877 &output_variable_list, nullptr); |
| 840 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = { | 878 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = { |
| 841 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, | 879 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, |
| 842 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, }, | 880 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, }, |
| 843 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, | 881 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, |
| 844 }; | 882 }; |
| 845 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = { | 883 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = { |
| 846 { kUniform1Name, | 884 { kUniform1Name, |
| 847 kUniform1Size, | 885 kUniform1Size, |
| 848 kUniform1Type, | 886 kUniform1Type, |
| 849 kUniform1FakeLocation, | 887 kUniform1FakeLocation, |
| (...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1492 kAttribStaticUse, | 1530 kAttribStaticUse, |
| 1493 kAttribMatName); | 1531 kAttribMatName); |
| 1494 // Check we can create shader. | 1532 // Check we can create shader. |
| 1495 Shader* vshader = shader_manager_.CreateShader( | 1533 Shader* vshader = shader_manager_.CreateShader( |
| 1496 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1534 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
| 1497 Shader* fshader = shader_manager_.CreateShader( | 1535 Shader* fshader = shader_manager_.CreateShader( |
| 1498 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1536 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
| 1499 // Check shader got created. | 1537 // Check shader got created. |
| 1500 ASSERT_TRUE(vshader != NULL && fshader != NULL); | 1538 ASSERT_TRUE(vshader != NULL && fshader != NULL); |
| 1501 // Set Status | 1539 // Set Status |
| 1502 TestHelper::SetShaderStates( | 1540 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
| 1503 gl_.get(), vshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, | 1541 nullptr, &attrib_map, nullptr, nullptr, nullptr, |
| 1504 NULL); | 1542 nullptr); |
| 1505 // Check attrib infos got copied. | 1543 // Check attrib infos got copied. |
| 1506 for (AttributeMap::const_iterator it = attrib_map.begin(); | 1544 for (AttributeMap::const_iterator it = attrib_map.begin(); |
| 1507 it != attrib_map.end(); ++it) { | 1545 it != attrib_map.end(); ++it) { |
| 1508 const sh::Attribute* variable_info = | 1546 const sh::Attribute* variable_info = |
| 1509 vshader->GetAttribInfo(it->first); | 1547 vshader->GetAttribInfo(it->first); |
| 1510 ASSERT_TRUE(variable_info != NULL); | 1548 ASSERT_TRUE(variable_info != NULL); |
| 1511 EXPECT_EQ(it->second.type, variable_info->type); | 1549 EXPECT_EQ(it->second.type, variable_info->type); |
| 1512 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); | 1550 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); |
| 1513 EXPECT_EQ(it->second.precision, variable_info->precision); | 1551 EXPECT_EQ(it->second.precision, variable_info->precision); |
| 1514 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); | 1552 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); |
| 1515 EXPECT_EQ(it->second.name, variable_info->name); | 1553 EXPECT_EQ(it->second.name, variable_info->name); |
| 1516 } | 1554 } |
| 1517 TestHelper::SetShaderStates( | 1555 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
| 1518 gl_.get(), fshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, | 1556 nullptr, &attrib_map, nullptr, nullptr, nullptr, |
| 1519 NULL); | 1557 nullptr); |
| 1520 | 1558 |
| 1521 // Set up program | 1559 // Set up program |
| 1522 Program* program = | 1560 Program* program = |
| 1523 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1561 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
| 1524 ASSERT_TRUE(program != NULL); | 1562 ASSERT_TRUE(program != NULL); |
| 1525 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 1563 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
| 1526 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 1564 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
| 1527 | 1565 |
| 1528 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts()); | 1566 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts()); |
| 1529 EXPECT_TRUE(LinkAsExpected(program, true)); | 1567 EXPECT_TRUE(LinkAsExpected(program, true)); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1576 GL_FLOAT, 3, GL_LOW_FLOAT, true, "a"); | 1614 GL_FLOAT, 3, GL_LOW_FLOAT, true, "a"); |
| 1577 | 1615 |
| 1578 // Check we can create shader. | 1616 // Check we can create shader. |
| 1579 Shader* vshader = shader_manager_.CreateShader( | 1617 Shader* vshader = shader_manager_.CreateShader( |
| 1580 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1618 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
| 1581 Shader* fshader = shader_manager_.CreateShader( | 1619 Shader* fshader = shader_manager_.CreateShader( |
| 1582 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1620 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
| 1583 // Check shader got created. | 1621 // Check shader got created. |
| 1584 ASSERT_TRUE(vshader != NULL && fshader != NULL); | 1622 ASSERT_TRUE(vshader != NULL && fshader != NULL); |
| 1585 // Set Status | 1623 // Set Status |
| 1586 TestHelper::SetShaderStates( | 1624 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
| 1587 gl_.get(), vshader, true, NULL, NULL, NULL, NULL, | 1625 nullptr, nullptr, &vertex_uniform_map, nullptr, |
| 1588 &vertex_uniform_map, NULL, NULL); | 1626 nullptr, nullptr); |
| 1589 TestHelper::SetShaderStates( | 1627 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
| 1590 gl_.get(), fshader, true, NULL, NULL, NULL, NULL, | 1628 nullptr, nullptr, &frag_uniform_map, nullptr, |
| 1591 &frag_uniform_map, NULL, NULL); | 1629 nullptr, nullptr); |
| 1592 | 1630 |
| 1593 // Set up program | 1631 // Set up program |
| 1594 Program* program = | 1632 Program* program = |
| 1595 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1633 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
| 1596 ASSERT_TRUE(program != NULL); | 1634 ASSERT_TRUE(program != NULL); |
| 1597 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 1635 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
| 1598 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 1636 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
| 1599 | 1637 |
| 1600 std::string conflicting_name; | 1638 std::string conflicting_name; |
| 1601 | 1639 |
| 1602 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name)); | 1640 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name)); |
| 1603 EXPECT_EQ("a", conflicting_name); | 1641 EXPECT_EQ("a", conflicting_name); |
| 1604 EXPECT_TRUE(LinkAsExpected(program, false)); | 1642 EXPECT_TRUE(LinkAsExpected(program, false)); |
| 1605 } | 1643 } |
| 1606 | 1644 |
| 1607 // If a varying has different type in the vertex and fragment | 1645 // If a varying has different type in the vertex and fragment |
| 1608 // shader, linking should fail. | 1646 // shader, linking should fail. |
| 1609 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { | 1647 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { |
| 1610 const VarInfo kVertexVarying = | 1648 const VarInfo kVertexVarying = |
| 1611 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1649 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
| 1612 const VarInfo kFragmentVarying = | 1650 const VarInfo kFragmentVarying = |
| 1613 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1651 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
| 1614 Program* program = SetupShaderVariableTest( | 1652 Program* program = |
| 1615 &kVertexVarying, 1, &kFragmentVarying, 1); | 1653 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
| 1616 | 1654 |
| 1617 std::string conflicting_name; | 1655 std::string conflicting_name; |
| 1618 | 1656 |
| 1619 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1657 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
| 1620 EXPECT_EQ("a", conflicting_name); | 1658 EXPECT_EQ("a", conflicting_name); |
| 1621 EXPECT_TRUE(LinkAsExpected(program, false)); | 1659 EXPECT_TRUE(LinkAsExpected(program, false)); |
| 1622 } | 1660 } |
| 1623 | 1661 |
| 1624 // If a varying has different array size in the vertex and fragment | 1662 // If a varying has different array size in the vertex and fragment |
| 1625 // shader, linking should fail. | 1663 // shader, linking should fail. |
| 1626 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { | 1664 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { |
| 1627 const VarInfo kVertexVarying = | 1665 const VarInfo kVertexVarying = |
| 1628 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1666 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
| 1629 const VarInfo kFragmentVarying = | 1667 const VarInfo kFragmentVarying = |
| 1630 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1668 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
| 1631 Program* program = SetupShaderVariableTest( | 1669 Program* program = |
| 1632 &kVertexVarying, 1, &kFragmentVarying, 1); | 1670 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
| 1633 | 1671 |
| 1634 std::string conflicting_name; | 1672 std::string conflicting_name; |
| 1635 | 1673 |
| 1636 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1674 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
| 1637 EXPECT_EQ("a", conflicting_name); | 1675 EXPECT_EQ("a", conflicting_name); |
| 1638 EXPECT_TRUE(LinkAsExpected(program, false)); | 1676 EXPECT_TRUE(LinkAsExpected(program, false)); |
| 1639 } | 1677 } |
| 1640 | 1678 |
| 1641 // If a varying has different precision in the vertex and fragment | 1679 // If a varying has different precision in the vertex and fragment |
| 1642 // shader, linking should succeed. | 1680 // shader, linking should succeed. |
| 1643 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { | 1681 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { |
| 1644 const VarInfo kVertexVarying = | 1682 const VarInfo kVertexVarying = |
| 1645 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying }; | 1683 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying }; |
| 1646 const VarInfo kFragmentVarying = | 1684 const VarInfo kFragmentVarying = |
| 1647 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1685 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
| 1648 Program* program = SetupShaderVariableTest( | 1686 Program* program = |
| 1649 &kVertexVarying, 1, &kFragmentVarying, 1); | 1687 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1); |
| 1650 | 1688 |
| 1651 std::string conflicting_name; | 1689 std::string conflicting_name; |
| 1652 | 1690 |
| 1653 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); | 1691 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); |
| 1654 EXPECT_TRUE(conflicting_name.empty()); | 1692 EXPECT_TRUE(conflicting_name.empty()); |
| 1655 EXPECT_TRUE(LinkAsExpected(program, true)); | 1693 EXPECT_TRUE(LinkAsExpected(program, true)); |
| 1656 } | 1694 } |
| 1657 | 1695 |
| 1658 // If a varying is statically used in fragment shader but not | 1696 // If a varying is statically used in fragment shader but not |
| 1659 // declared in vertex shader, link should fail. | 1697 // declared in vertex shader, link should fail. |
| 1660 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { | 1698 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { |
| 1661 const VarInfo kFragmentVarying = | 1699 const VarInfo kFragmentVarying = |
| 1662 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; | 1700 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; |
| 1663 Program* program = SetupShaderVariableTest( | 1701 Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1); |
| 1664 NULL, 0, &kFragmentVarying, 1); | |
| 1665 | 1702 |
| 1666 std::string conflicting_name; | 1703 std::string conflicting_name; |
| 1667 | 1704 |
| 1668 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); | 1705 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); |
| 1669 EXPECT_EQ("a", conflicting_name); | 1706 EXPECT_EQ("a", conflicting_name); |
| 1670 EXPECT_TRUE(LinkAsExpected(program, false)); | 1707 EXPECT_TRUE(LinkAsExpected(program, false)); |
| 1671 } | 1708 } |
| 1672 | 1709 |
| 1673 // If a varying is declared but not statically used in fragment | 1710 // If a varying is declared but not statically used in fragment |
| 1674 // shader, even if it's not declared in vertex shader, link should | 1711 // shader, even if it's not declared in vertex shader, link should |
| 1675 // succeed. | 1712 // succeed. |
| 1676 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { | 1713 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { |
| 1677 const VarInfo kFragmentVarying = | 1714 const VarInfo kFragmentVarying = |
| 1678 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying }; | 1715 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying }; |
| 1679 Program* program = SetupShaderVariableTest( | 1716 Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1); |
| 1680 NULL, 0, &kFragmentVarying, 1); | |
| 1681 | 1717 |
| 1682 std::string conflicting_name; | 1718 std::string conflicting_name; |
| 1683 | 1719 |
| 1684 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); | 1720 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); |
| 1685 EXPECT_TRUE(conflicting_name.empty()); | 1721 EXPECT_TRUE(conflicting_name.empty()); |
| 1686 EXPECT_TRUE(LinkAsExpected(program, true)); | 1722 EXPECT_TRUE(LinkAsExpected(program, true)); |
| 1687 } | 1723 } |
| 1688 | 1724 |
| 1689 // Uniforms and attributes are both global variables, thus sharing | 1725 // Uniforms and attributes are both global variables, thus sharing |
| 1690 // the same namespace. Any name conflicts should cause link | 1726 // the same namespace. Any name conflicts should cause link |
| 1691 // failure. | 1727 // failure. |
| 1692 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { | 1728 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { |
| 1693 const VarInfo kVertexAttribute = | 1729 const VarInfo kVertexAttribute = |
| 1694 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute }; | 1730 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute }; |
| 1695 const VarInfo kFragmentUniform = | 1731 const VarInfo kFragmentUniform = |
| 1696 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform }; | 1732 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform }; |
| 1697 Program* program = SetupShaderVariableTest( | 1733 Program* program = |
| 1698 &kVertexAttribute, 1, &kFragmentUniform, 1); | 1734 SetupProgramForVariables(&kVertexAttribute, 1, &kFragmentUniform, 1); |
| 1699 | 1735 |
| 1700 std::string conflicting_name; | 1736 std::string conflicting_name; |
| 1701 | 1737 |
| 1702 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); | 1738 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); |
| 1703 EXPECT_EQ("a", conflicting_name); | 1739 EXPECT_EQ("a", conflicting_name); |
| 1704 EXPECT_TRUE(LinkAsExpected(program, false)); | 1740 EXPECT_TRUE(LinkAsExpected(program, false)); |
| 1705 } | 1741 } |
| 1706 | 1742 |
| 1707 // Varyings go over 8 rows. | 1743 // Varyings go over 8 rows. |
| 1708 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { | 1744 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { |
| 1709 const VarInfo kVertexVaryings[] = { | 1745 const VarInfo kVertexVaryings[] = { |
| 1710 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1746 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
| 1711 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1747 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
| 1712 }; | 1748 }; |
| 1713 const VarInfo kFragmentVaryings[] = { | 1749 const VarInfo kFragmentVaryings[] = { |
| 1714 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1750 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
| 1715 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1751 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
| 1716 }; | 1752 }; |
| 1717 Program* program = SetupShaderVariableTest( | 1753 Program* program = |
| 1718 kVertexVaryings, 2, kFragmentVaryings, 2); | 1754 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
| 1719 | 1755 |
| 1720 EXPECT_FALSE( | 1756 EXPECT_FALSE( |
| 1721 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); | 1757 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); |
| 1722 EXPECT_TRUE(LinkAsExpected(program, false)); | 1758 EXPECT_TRUE(LinkAsExpected(program, false)); |
| 1723 } | 1759 } |
| 1724 | 1760 |
| 1725 // Varyings go over 8 rows but some are inactive | 1761 // Varyings go over 8 rows but some are inactive |
| 1726 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) { | 1762 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) { |
| 1727 const VarInfo kVertexVaryings[] = { | 1763 const VarInfo kVertexVaryings[] = { |
| 1728 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1764 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
| 1729 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1765 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
| 1730 }; | 1766 }; |
| 1731 const VarInfo kFragmentVaryings[] = { | 1767 const VarInfo kFragmentVaryings[] = { |
| 1732 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, | 1768 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, |
| 1733 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1769 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
| 1734 }; | 1770 }; |
| 1735 Program* program = SetupShaderVariableTest( | 1771 Program* program = |
| 1736 kVertexVaryings, 2, kFragmentVaryings, 2); | 1772 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
| 1737 | 1773 |
| 1738 EXPECT_TRUE( | 1774 EXPECT_TRUE( |
| 1739 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); | 1775 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); |
| 1740 EXPECT_TRUE(LinkAsExpected(program, true)); | 1776 EXPECT_TRUE(LinkAsExpected(program, true)); |
| 1741 } | 1777 } |
| 1742 | 1778 |
| 1743 // Varyings go over 8 rows but some are inactive. | 1779 // Varyings go over 8 rows but some are inactive. |
| 1744 // However, we still fail the check if kCountAll option is used. | 1780 // However, we still fail the check if kCountAll option is used. |
| 1745 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) { | 1781 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) { |
| 1746 const VarInfo kVertexVaryings[] = { | 1782 const VarInfo kVertexVaryings[] = { |
| 1747 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, | 1783 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, |
| 1748 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1784 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
| 1749 }; | 1785 }; |
| 1750 const VarInfo kFragmentVaryings[] = { | 1786 const VarInfo kFragmentVaryings[] = { |
| 1751 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, | 1787 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, |
| 1752 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } | 1788 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } |
| 1753 }; | 1789 }; |
| 1754 Program* program = SetupShaderVariableTest( | 1790 Program* program = |
| 1755 kVertexVaryings, 2, kFragmentVaryings, 2); | 1791 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2); |
| 1756 | 1792 |
| 1757 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll)); | 1793 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll)); |
| 1758 } | 1794 } |
| 1759 | 1795 |
| 1760 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) { | 1796 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) { |
| 1761 Shader* vshader = shader_manager_.CreateShader( | 1797 Shader* vshader = shader_manager_.CreateShader( |
| 1762 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1798 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
| 1763 ASSERT_TRUE(vshader != NULL); | 1799 ASSERT_TRUE(vshader != NULL); |
| 1764 TestHelper::SetShaderStates(gl_.get(), vshader, true); | 1800 TestHelper::SetShaderStates(gl_.get(), vshader, true); |
| 1765 Shader* fshader = shader_manager_.CreateShader( | 1801 Shader* fshader = shader_manager_.CreateShader( |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1905 ProgramManagerWithCacheTest() | 1941 ProgramManagerWithCacheTest() |
| 1906 : cache_(new MockProgramCache()), | 1942 : cache_(new MockProgramCache()), |
| 1907 vertex_shader_(NULL), | 1943 vertex_shader_(NULL), |
| 1908 fragment_shader_(NULL), | 1944 fragment_shader_(NULL), |
| 1909 program_(NULL) { | 1945 program_(NULL) { |
| 1910 } | 1946 } |
| 1911 | 1947 |
| 1912 protected: | 1948 protected: |
| 1913 void SetupProgramManager() override { | 1949 void SetupProgramManager() override { |
| 1914 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors, | 1950 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors, |
| 1951 kMaxDualSourceDrawBuffers, |
| 1915 feature_info_.get())); | 1952 feature_info_.get())); |
| 1916 } | 1953 } |
| 1917 | 1954 |
| 1918 void SetUp() override { | 1955 void SetUp() override { |
| 1919 ProgramManagerTestBase::SetUp(); | 1956 ProgramManagerTestBase::SetUp(); |
| 1920 | 1957 |
| 1921 vertex_shader_ = shader_manager_.CreateShader( | 1958 vertex_shader_ = shader_manager_.CreateShader( |
| 1922 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1959 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
| 1923 fragment_shader_ = shader_manager_.CreateShader( | 1960 fragment_shader_ = shader_manager_.CreateShader( |
| 1924 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1961 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
| 1925 ASSERT_TRUE(vertex_shader_ != NULL); | 1962 ASSERT_TRUE(vertex_shader_ != NULL); |
| 1926 ASSERT_TRUE(fragment_shader_ != NULL); | 1963 ASSERT_TRUE(fragment_shader_ != NULL); |
| 1927 vertex_shader_->set_source("lka asjf bjajsdfj"); | 1964 vertex_shader_->set_source("lka asjf bjajsdfj"); |
| 1928 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj"); | 1965 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj"); |
| 1929 | 1966 |
| 1930 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 1967 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
| 1931 ASSERT_TRUE(program_ != NULL); | 1968 ASSERT_TRUE(program_ != NULL); |
| 1932 | 1969 |
| 1933 program_->AttachShader(&shader_manager_, vertex_shader_); | 1970 program_->AttachShader(&shader_manager_, vertex_shader_); |
| 1934 program_->AttachShader(&shader_manager_, fragment_shader_); | 1971 program_->AttachShader(&shader_manager_, fragment_shader_); |
| 1935 } | 1972 } |
| 1973 |
| 1936 void TearDown() override { | 1974 void TearDown() override { |
| 1937 shader_manager_.Destroy(false); | 1975 shader_manager_.Destroy(false); |
| 1938 ProgramManagerTestBase::TearDown(); | 1976 ProgramManagerTestBase::TearDown(); |
| 1939 } | 1977 } |
| 1978 |
| 1940 void SetShadersCompiled() { | 1979 void SetShadersCompiled() { |
| 1941 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); | 1980 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); |
| 1942 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); | 1981 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); |
| 1943 } | 1982 } |
| 1944 | 1983 |
| 1945 void SetProgramCached() { | 1984 void SetProgramCached() { |
| 1946 cache_->LinkedProgramCacheSuccess( | 1985 cache_->LinkedProgramCacheSuccess( |
| 1947 vertex_shader_->source(), | 1986 vertex_shader_->source(), |
| 1948 fragment_shader_->source(), | 1987 fragment_shader_->source(), |
| 1949 &program_->bind_attrib_location_map(), | 1988 &program_->bind_attrib_location_map(), |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2014 program_->transform_feedback_buffer_mode(), | 2053 program_->transform_feedback_buffer_mode(), |
| 2015 _)) | 2054 _)) |
| 2016 .WillOnce(Return(result)); | 2055 .WillOnce(Return(result)); |
| 2017 } | 2056 } |
| 2018 | 2057 |
| 2019 void SetExpectationsForProgramLoadSuccess() { | 2058 void SetExpectationsForProgramLoadSuccess() { |
| 2020 SetExpectationsForProgramLoadSuccess(kServiceProgramId); | 2059 SetExpectationsForProgramLoadSuccess(kServiceProgramId); |
| 2021 } | 2060 } |
| 2022 | 2061 |
| 2023 void SetExpectationsForProgramLoadSuccess(GLuint service_program_id) { | 2062 void SetExpectationsForProgramLoadSuccess(GLuint service_program_id) { |
| 2024 TestHelper::SetupProgramSuccessExpectations(gl_.get(), feature_info_.get(), | 2063 TestHelper::SetupProgramSuccessExpectations( |
| 2025 nullptr, 0, nullptr, 0, nullptr, | 2064 gl_.get(), feature_info_.get(), nullptr, 0, nullptr, 0, nullptr, 0, |
| 2026 0, service_program_id); | 2065 nullptr, 0, service_program_id); |
| 2027 } | 2066 } |
| 2028 | 2067 |
| 2029 void SetExpectationsForProgramLink() { | 2068 void SetExpectationsForProgramLink() { |
| 2030 SetExpectationsForProgramLink(kServiceProgramId); | 2069 SetExpectationsForProgramLink(kServiceProgramId); |
| 2031 } | 2070 } |
| 2032 | 2071 |
| 2033 void SetExpectationsForProgramLink(GLuint service_program_id) { | 2072 void SetExpectationsForProgramLink(GLuint service_program_id) { |
| 2034 TestHelper::SetupShaderExpectations(gl_.get(), feature_info_.get(), nullptr, | 2073 TestHelper::SetupShaderExpectations(gl_.get(), feature_info_.get(), nullptr, |
| 2035 0, nullptr, 0, service_program_id); | 2074 0, nullptr, 0, service_program_id); |
| 2036 if (gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary) { | 2075 if (gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary) { |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2124 void SetUp() override { | 2163 void SetUp() override { |
| 2125 base::CommandLine command_line(*base::CommandLine::ForCurrentProcess()); | 2164 base::CommandLine command_line(*base::CommandLine::ForCurrentProcess()); |
| 2126 command_line.AppendSwitch(switches::kEnableGLPathRendering); | 2165 command_line.AppendSwitch(switches::kEnableGLPathRendering); |
| 2127 FeatureInfo* feature_info = new FeatureInfo(command_line); | 2166 FeatureInfo* feature_info = new FeatureInfo(command_line); |
| 2128 SetUpBase(testing::get<0>(GetParam()), testing::get<1>(GetParam()), | 2167 SetUpBase(testing::get<0>(GetParam()), testing::get<1>(GetParam()), |
| 2129 feature_info); | 2168 feature_info); |
| 2130 } | 2169 } |
| 2131 static const char* kFragmentInput1Name; | 2170 static const char* kFragmentInput1Name; |
| 2132 static const char* kFragmentInput1GoodName; | 2171 static const char* kFragmentInput1GoodName; |
| 2133 static const char* kFragmentInput2Name; | 2172 static const char* kFragmentInput2Name; |
| 2134 static const char* kFragmentInput2GoodName; | |
| 2135 static const char* kFragmentInput3Name; | 2173 static const char* kFragmentInput3Name; |
| 2136 static const char* kFragmentInput3GoodName; | 2174 static const char* kFragmentInput3GoodName; |
| 2137 static const GLint kFragmentInput1Size = 1; | 2175 static const GLint kFragmentInput1Size = 1; |
| 2138 static const GLint kFragmentInput2Size = 3; | 2176 static const GLint kFragmentInput2Size = 3; |
| 2139 static const GLint kFragmentInput3Size = 2; | 2177 static const GLint kFragmentInput3Size = 2; |
| 2140 static const int kFragmentInput1Precision = GL_LOW_FLOAT; | 2178 static const int kFragmentInput1Precision = GL_LOW_FLOAT; |
| 2141 static const int kFragmentInput2Precision = GL_MEDIUM_INT; | 2179 static const int kFragmentInput2Precision = GL_MEDIUM_INT; |
| 2142 static const int kFragmentInput3Precision = GL_HIGH_FLOAT; | 2180 static const int kFragmentInput3Precision = GL_HIGH_FLOAT; |
| 2143 static const int kFragmentInput1StaticUse = 1; | 2181 static const int kFragmentInput1StaticUse = 1; |
| 2144 static const int kFragmentInput2StaticUse = 1; | 2182 static const int kFragmentInput2StaticUse = 1; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2171 const GLint ProgramManagerWithPathRenderingTest::kFragmentInput3RealLocation; | 2209 const GLint ProgramManagerWithPathRenderingTest::kFragmentInput3RealLocation; |
| 2172 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput1Type; | 2210 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput1Type; |
| 2173 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput2Type; | 2211 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput2Type; |
| 2174 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput3Type; | 2212 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput3Type; |
| 2175 #endif | 2213 #endif |
| 2176 | 2214 |
| 2177 const char* ProgramManagerWithPathRenderingTest::kFragmentInput1Name = "color1"; | 2215 const char* ProgramManagerWithPathRenderingTest::kFragmentInput1Name = "color1"; |
| 2178 const char* ProgramManagerWithPathRenderingTest::kFragmentInput1GoodName = | 2216 const char* ProgramManagerWithPathRenderingTest::kFragmentInput1GoodName = |
| 2179 "color1[0]"; | 2217 "color1[0]"; |
| 2180 const char* ProgramManagerWithPathRenderingTest::kFragmentInput2Name = "color2"; | 2218 const char* ProgramManagerWithPathRenderingTest::kFragmentInput2Name = "color2"; |
| 2181 const char* ProgramManagerWithPathRenderingTest::kFragmentInput2GoodName = | |
| 2182 "color2[0]"; | |
| 2183 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3Name = "color3"; | 2219 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3Name = "color3"; |
| 2184 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3GoodName = | 2220 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3GoodName = |
| 2185 "color3[0]"; | 2221 "color3[0]"; |
| 2186 | 2222 |
| 2187 TEST_P(ProgramManagerWithPathRenderingTest, BindFragmentInputLocation) { | 2223 TEST_P(ProgramManagerWithPathRenderingTest, BindFragmentInputLocation) { |
| 2188 const GLint kFragmentInput1DesiredLocation = 10; | 2224 const GLint kFragmentInput1DesiredLocation = 10; |
| 2189 const GLint kFragmentInput2DesiredLocation = -1; | 2225 const GLint kFragmentInput2DesiredLocation = -1; |
| 2190 const GLint kFragmentInput3DesiredLocation = 5; | 2226 const GLint kFragmentInput3DesiredLocation = 5; |
| 2191 | 2227 |
| 2192 Shader* vshader = shader_manager_.CreateShader( | 2228 Shader* vshader = shader_manager_.CreateShader( |
| 2193 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 2229 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
| 2194 ASSERT_TRUE(vshader != NULL); | 2230 ASSERT_TRUE(vshader != NULL); |
| 2195 Shader* fshader = shader_manager_.CreateShader( | 2231 Shader* fshader = shader_manager_.CreateShader( |
| 2196 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 2232 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
| 2197 ASSERT_TRUE(fshader != NULL); | 2233 ASSERT_TRUE(fshader != NULL); |
| 2198 VaryingMap varying_map; | 2234 VaryingMap varying_map; |
| 2199 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying( | 2235 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying( |
| 2200 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision, | 2236 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision, |
| 2201 kFragmentInput1StaticUse, kFragmentInput1Name); | 2237 kFragmentInput1StaticUse, kFragmentInput1Name); |
| 2202 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying( | 2238 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying( |
| 2203 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision, | 2239 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision, |
| 2204 kFragmentInput2StaticUse, kFragmentInput2Name); | 2240 kFragmentInput2StaticUse, kFragmentInput2Name); |
| 2205 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying( | 2241 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying( |
| 2206 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision, | 2242 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision, |
| 2207 kFragmentInput3StaticUse, kFragmentInput3Name); | 2243 kFragmentInput3StaticUse, kFragmentInput3Name); |
| 2208 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, | 2244 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, |
| 2209 nullptr, nullptr, nullptr, &varying_map, nullptr); | 2245 nullptr, nullptr, nullptr, &varying_map, nullptr, |
| 2246 nullptr); |
| 2210 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, | 2247 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, |
| 2211 nullptr, nullptr, nullptr, &varying_map, nullptr); | 2248 nullptr, nullptr, nullptr, &varying_map, nullptr, |
| 2249 nullptr); |
| 2212 Program* program = | 2250 Program* program = |
| 2213 manager_->CreateProgram(kClientProgramId, kServiceProgramId); | 2251 manager_->CreateProgram(kClientProgramId, kServiceProgramId); |
| 2214 ASSERT_TRUE(program != NULL); | 2252 ASSERT_TRUE(program != NULL); |
| 2215 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 2253 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
| 2216 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 2254 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
| 2217 EXPECT_TRUE(program->SetFragmentInputLocationBinding( | 2255 EXPECT_TRUE(program->SetFragmentInputLocationBinding( |
| 2218 kFragmentInput1Name, kFragmentInput1DesiredLocation)); | 2256 kFragmentInput1Name, kFragmentInput1DesiredLocation)); |
| 2219 EXPECT_TRUE(program->SetFragmentInputLocationBinding( | 2257 EXPECT_TRUE(program->SetFragmentInputLocationBinding( |
| 2220 kFragmentInput3Name, kFragmentInput3DesiredLocation)); | 2258 kFragmentInput3Name, kFragmentInput3DesiredLocation)); |
| 2221 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = { | 2259 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = { |
| 2222 { | 2260 { |
| 2223 kFragmentInput1Name, kFragmentInput1Size, kFragmentInput1Type, | 2261 kFragmentInput1Name, kFragmentInput1Size, kFragmentInput1Type, |
| 2224 kFragmentInput1FakeLocation, kFragmentInput1RealLocation, | 2262 kFragmentInput1FakeLocation, kFragmentInput1RealLocation, |
| 2225 kFragmentInput1DesiredLocation, | 2263 kFragmentInput1DesiredLocation, |
| 2226 }, | 2264 }, |
| 2227 { | 2265 { |
| 2228 kFragmentInput2Name, kFragmentInput2Size, kFragmentInput2Type, | 2266 kFragmentInput2Name, kFragmentInput2Size, kFragmentInput2Type, |
| 2229 kFragmentInput2FakeLocation, kFragmentInput2RealLocation, | 2267 kFragmentInput2FakeLocation, kFragmentInput2RealLocation, |
| 2230 kFragmentInput2DesiredLocation, | 2268 kFragmentInput2DesiredLocation, |
| 2231 }, | 2269 }, |
| 2232 { | 2270 { |
| 2233 kFragmentInput3Name, kFragmentInput3Size, kFragmentInput3Type, | 2271 kFragmentInput3Name, kFragmentInput3Size, kFragmentInput3Type, |
| 2234 kFragmentInput3FakeLocation, kFragmentInput3RealLocation, | 2272 kFragmentInput3FakeLocation, kFragmentInput3RealLocation, |
| 2235 kFragmentInput3DesiredLocation, | 2273 kFragmentInput3DesiredLocation, |
| 2236 }, | 2274 }, |
| 2237 }; | 2275 }; |
| 2238 TestHelper::SetupShaderExpectationsWithVaryings( | 2276 TestHelper::SetupShaderExpectationsWithVaryings( |
| 2239 gl_.get(), feature_info_.get(), nullptr, 0, nullptr, 0, | 2277 gl_.get(), feature_info_.get(), nullptr, 0, nullptr, 0, |
| 2240 kFragmentInputExpectationInfos, arraysize(kFragmentInputExpectationInfos), | 2278 kFragmentInputExpectationInfos, arraysize(kFragmentInputExpectationInfos), |
| 2241 kServiceProgramId); | 2279 nullptr, 0, kServiceProgramId); |
| 2242 program->Link(NULL, Program::kCountOnlyStaticallyUsed, | 2280 program->Link(NULL, Program::kCountOnlyStaticallyUsed, |
| 2243 base::Bind(&ShaderCacheCb)); | 2281 base::Bind(&ShaderCacheCb)); |
| 2244 GLint loc1 = 0; | 2282 GLint loc1 = 0; |
| 2245 const Program::FragmentInputInfo* info1 = | 2283 const Program::FragmentInputInfo* info1 = |
| 2246 program->GetFragmentInputInfoByFakeLocation( | 2284 program->GetFragmentInputInfoByFakeLocation( |
| 2247 kFragmentInput1DesiredLocation, &loc1); | 2285 kFragmentInput1DesiredLocation, &loc1); |
| 2248 ASSERT_NE(info1, nullptr); | 2286 ASSERT_NE(info1, nullptr); |
| 2249 EXPECT_EQ(kFragmentInput1GoodName, info1->name); | 2287 EXPECT_EQ(kFragmentInput1GoodName, info1->name); |
| 2250 EXPECT_EQ(kFragmentInput1RealLocation, info1->location); | 2288 EXPECT_EQ(kFragmentInput1RealLocation, info1->location); |
| 2251 EXPECT_EQ(kFragmentInput1RealLocation, loc1); | 2289 EXPECT_EQ(kFragmentInput1RealLocation, loc1); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2272 INSTANTIATE_TEST_CASE_P( | 2310 INSTANTIATE_TEST_CASE_P( |
| 2273 SupportedContexts, | 2311 SupportedContexts, |
| 2274 ProgramManagerWithPathRenderingTest, | 2312 ProgramManagerWithPathRenderingTest, |
| 2275 testing::Values( | 2313 testing::Values( |
| 2276 make_gl_ext_tuple("3.2", | 2314 make_gl_ext_tuple("3.2", |
| 2277 "GL_ARB_program_interface_query " | 2315 "GL_ARB_program_interface_query " |
| 2278 "GL_EXT_direct_state_access GL_NV_path_rendering"), | 2316 "GL_EXT_direct_state_access GL_NV_path_rendering"), |
| 2279 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"), | 2317 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"), |
| 2280 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering"))); | 2318 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering"))); |
| 2281 | 2319 |
| 2320 class ProgramManagerDualSourceBlendingTest |
| 2321 : public ProgramManagerWithShaderTest, |
| 2322 public testing::WithParamInterface< |
| 2323 testing::tuple<const char*, const char*>> { |
| 2324 public: |
| 2325 ProgramManagerDualSourceBlendingTest() {} |
| 2326 |
| 2327 protected: |
| 2328 void SetUpWithFeatureInfo(FeatureInfo* feature_info) { |
| 2329 const char* gl_version = testing::get<0>(GetParam()); |
| 2330 const char* gl_extensions = testing::get<1>(GetParam()); |
| 2331 SetUpBase(gl_version, gl_extensions, feature_info); |
| 2332 } |
| 2333 |
| 2334 void SetUp() override { SetUpWithFeatureInfo(nullptr); } |
| 2335 }; |
| 2336 |
| 2337 class ProgramManagerDualSourceBlendingES2Test |
| 2338 : public ProgramManagerDualSourceBlendingTest {}; |
| 2339 |
| 2340 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragCoord) { |
| 2341 DCHECK(feature_info_->feature_flags().ext_blend_func_extended); |
| 2342 |
| 2343 const VarInfo kFragmentVaryings[] = { |
| 2344 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_SecondaryFragColorEXT", |
| 2345 kVarOutput}, |
| 2346 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_FragColor", kVarOutput}, |
| 2347 }; |
| 2348 |
| 2349 int shader_version = 100; |
| 2350 Program* program = |
| 2351 SetupProgramForVariables(nullptr, 0, kFragmentVaryings, |
| 2352 arraysize(kFragmentVaryings), &shader_version); |
| 2353 |
| 2354 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info(); |
| 2355 if (!gl_version.is_es) { |
| 2356 // The call is expected only for OpenGL. OpenGL ES expects to |
| 2357 // output GLES SL 1.00, which does not bind. |
| 2358 EXPECT_CALL(*(gl_.get()), |
| 2359 BindFragDataLocationIndexed(kServiceProgramId, 0, 1, |
| 2360 StrEq("angle_SecondaryFragColor"))) |
| 2361 .Times(1) |
| 2362 .RetiresOnSaturation(); |
| 2363 } |
| 2364 |
| 2365 EXPECT_TRUE(LinkAsExpected(program, true)); |
| 2366 } |
| 2367 |
| 2368 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragData) { |
| 2369 const VarInfo kFragmentVaryings[] = { |
| 2370 {GL_FLOAT_VEC4, kMaxDualSourceDrawBuffers, GL_MEDIUM_FLOAT, true, |
| 2371 "gl_SecondaryFragDataEXT", kVarOutput}, |
| 2372 {GL_FLOAT_VEC4, kMaxDrawBuffers, GL_MEDIUM_FLOAT, true, "gl_FragData", |
| 2373 kVarOutput}, |
| 2374 }; |
| 2375 |
| 2376 int shader_version = 100; |
| 2377 Program* program = |
| 2378 SetupProgramForVariables(nullptr, 0, kFragmentVaryings, |
| 2379 arraysize(kFragmentVaryings), &shader_version); |
| 2380 |
| 2381 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info(); |
| 2382 if (!gl_version.is_es) { |
| 2383 // The call is expected only for OpenGL. OpenGL ES expects to |
| 2384 // output GLES SL 1.00, which does not bind. |
| 2385 EXPECT_CALL(*(gl_.get()), |
| 2386 BindFragDataLocationIndexed(kServiceProgramId, 0, 1, |
| 2387 StrEq("angle_SecondaryFragData"))) |
| 2388 .Times(1) |
| 2389 .RetiresOnSaturation(); |
| 2390 } |
| 2391 |
| 2392 EXPECT_TRUE(LinkAsExpected(program, true)); |
| 2393 } |
| 2394 |
| 2395 INSTANTIATE_TEST_CASE_P( |
| 2396 SupportedContexts, |
| 2397 ProgramManagerDualSourceBlendingES2Test, |
| 2398 testing::Values( |
| 2399 testing::make_tuple("3.2", |
| 2400 "GL_ARB_draw_buffers GL_ARB_blend_func_extended " |
| 2401 "GL_ARB_program_interface_query"), |
| 2402 testing::make_tuple("opengl es 3.1", |
| 2403 "GL_EXT_draw_buffers GL_EXT_blend_func_extended"))); |
| 2404 |
| 2282 } // namespace gles2 | 2405 } // namespace gles2 |
| 2283 } // namespace gpu | 2406 } // namespace gpu |
| OLD | NEW |