| 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 |