| 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/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 ASSERT_TRUE(fragment_shader != NULL); | 243 ASSERT_TRUE(fragment_shader != NULL); |
| 244 vertex_shader->SetStatus(true, NULL, NULL); | 244 vertex_shader->SetStatus(true, NULL, NULL); |
| 245 fragment_shader->SetStatus(true, NULL, NULL); | 245 fragment_shader->SetStatus(true, NULL, NULL); |
| 246 | 246 |
| 247 program_ = manager_.CreateProgram( | 247 program_ = manager_.CreateProgram( |
| 248 kClientProgramId, kServiceProgramId); | 248 kClientProgramId, kServiceProgramId); |
| 249 ASSERT_TRUE(program_ != NULL); | 249 ASSERT_TRUE(program_ != NULL); |
| 250 | 250 |
| 251 program_->AttachShader(&shader_manager_, vertex_shader); | 251 program_->AttachShader(&shader_manager_, vertex_shader); |
| 252 program_->AttachShader(&shader_manager_, fragment_shader); | 252 program_->AttachShader(&shader_manager_, fragment_shader); |
| 253 program_->Link(NULL, NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); | 253 program_->Link(NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); |
| 254 } | 254 } |
| 255 | 255 |
| 256 void SetupShader(AttribInfo* attribs, size_t num_attribs, | 256 void SetupShader(AttribInfo* attribs, size_t num_attribs, |
| 257 UniformInfo* uniforms, size_t num_uniforms, | 257 UniformInfo* uniforms, size_t num_uniforms, |
| 258 GLuint service_id) { | 258 GLuint service_id) { |
| 259 TestHelper::SetupShader( | 259 TestHelper::SetupShader( |
| 260 gl_.get(), attribs, num_attribs, uniforms, num_uniforms, service_id); | 260 gl_.get(), attribs, num_attribs, uniforms, num_uniforms, service_id); |
| 261 } | 261 } |
| 262 | 262 |
| 263 void SetupDefaultShaderExpectations() { | 263 void SetupDefaultShaderExpectations() { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 276 } | 276 } |
| 277 | 277 |
| 278 // Return true if link status matches expected_link_status | 278 // Return true if link status matches expected_link_status |
| 279 bool LinkAsExpected(Program* program, | 279 bool LinkAsExpected(Program* program, |
| 280 bool expected_link_status) { | 280 bool expected_link_status) { |
| 281 GLuint service_id = program->service_id(); | 281 GLuint service_id = program->service_id(); |
| 282 if (expected_link_status) { | 282 if (expected_link_status) { |
| 283 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 283 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 284 service_id); | 284 service_id); |
| 285 } | 285 } |
| 286 program->Link(NULL, NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); | 286 program->Link(NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); |
| 287 GLint link_status; | 287 GLint link_status; |
| 288 program->GetProgramiv(GL_LINK_STATUS, &link_status); | 288 program->GetProgramiv(GL_LINK_STATUS, &link_status); |
| 289 return (static_cast<bool>(link_status) == expected_link_status); | 289 return (static_cast<bool>(link_status) == expected_link_status); |
| 290 } | 290 } |
| 291 | 291 |
| 292 Program* SetupShaderVariableTest(const VarInfo* vertex_variables, | 292 Program* SetupShaderVariableTest(const VarInfo* vertex_variables, |
| 293 size_t vertex_variable_size, | 293 size_t vertex_variable_size, |
| 294 const VarInfo* fragment_variables, | 294 const VarInfo* fragment_variables, |
| 295 size_t fragment_variable_size) { | 295 size_t fragment_variable_size) { |
| 296 // Set up shader | 296 // Set up shader |
| (...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 vshader->SetStatus(true, "", NULL); | 713 vshader->SetStatus(true, "", NULL); |
| 714 Shader* fshader = shader_manager_.CreateShader( | 714 Shader* fshader = shader_manager_.CreateShader( |
| 715 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); | 715 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); |
| 716 ASSERT_TRUE(fshader != NULL); | 716 ASSERT_TRUE(fshader != NULL); |
| 717 fshader->SetStatus(true, "", NULL); | 717 fshader->SetStatus(true, "", NULL); |
| 718 Program* program = | 718 Program* program = |
| 719 manager_.CreateProgram(kClientProgramId, kServiceProgramId); | 719 manager_.CreateProgram(kClientProgramId, kServiceProgramId); |
| 720 ASSERT_TRUE(program != NULL); | 720 ASSERT_TRUE(program != NULL); |
| 721 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 721 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
| 722 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 722 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
| 723 program->Link(NULL, NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); | 723 program->Link(NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); |
| 724 GLint value = 0; | 724 GLint value = 0; |
| 725 program->GetProgramiv(GL_ACTIVE_ATTRIBUTES, &value); | 725 program->GetProgramiv(GL_ACTIVE_ATTRIBUTES, &value); |
| 726 EXPECT_EQ(3, value); | 726 EXPECT_EQ(3, value); |
| 727 // Check that we skipped the "gl_" uniform. | 727 // Check that we skipped the "gl_" uniform. |
| 728 program->GetProgramiv(GL_ACTIVE_UNIFORMS, &value); | 728 program->GetProgramiv(GL_ACTIVE_UNIFORMS, &value); |
| 729 EXPECT_EQ(2, value); | 729 EXPECT_EQ(2, value); |
| 730 // Check that our max length adds room for the array spec and is not as long | 730 // Check that our max length adds room for the array spec and is not as long |
| 731 // as the "gl_" uniform we skipped. | 731 // as the "gl_" uniform we skipped. |
| 732 // +4u is to account for "gl_" and NULL terminator. | 732 // +4u is to account for "gl_" and NULL terminator. |
| 733 program->GetProgramiv(GL_ACTIVE_UNIFORM_MAX_LENGTH, &value); | 733 program->GetProgramiv(GL_ACTIVE_UNIFORM_MAX_LENGTH, &value); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 vshader->SetStatus(true, "", NULL); | 781 vshader->SetStatus(true, "", NULL); |
| 782 Shader* fshader = shader_manager_.CreateShader( | 782 Shader* fshader = shader_manager_.CreateShader( |
| 783 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); | 783 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); |
| 784 ASSERT_TRUE(fshader != NULL); | 784 ASSERT_TRUE(fshader != NULL); |
| 785 fshader->SetStatus(true, "", NULL); | 785 fshader->SetStatus(true, "", NULL); |
| 786 Program* program = | 786 Program* program = |
| 787 manager_.CreateProgram(kClientProgramId, kServiceProgramId); | 787 manager_.CreateProgram(kClientProgramId, kServiceProgramId); |
| 788 ASSERT_TRUE(program != NULL); | 788 ASSERT_TRUE(program != NULL); |
| 789 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 789 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
| 790 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 790 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
| 791 program->Link(NULL, NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); | 791 program->Link(NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); |
| 792 | 792 |
| 793 // Check that we get the correct locations. | 793 // Check that we get the correct locations. |
| 794 EXPECT_EQ(kUniform2FakeLocation, | 794 EXPECT_EQ(kUniform2FakeLocation, |
| 795 program->GetUniformFakeLocation(kUniform2Name)); | 795 program->GetUniformFakeLocation(kUniform2Name)); |
| 796 EXPECT_EQ(kUniform3FakeLocation, | 796 EXPECT_EQ(kUniform3FakeLocation, |
| 797 program->GetUniformFakeLocation(kUniform3Name)); | 797 program->GetUniformFakeLocation(kUniform3Name)); |
| 798 } | 798 } |
| 799 | 799 |
| 800 // Some GL drivers incorrectly return the wrong type. For example they return | 800 // 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. | 801 // GL_FLOAT_VEC2 when they should return GL_FLOAT_MAT2. Check we handle this. |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 882 const size_t kNumUniforms = arraysize(kUniforms); | 882 const size_t kNumUniforms = arraysize(kUniforms); |
| 883 static const GLuint kClientProgramId = 1234; | 883 static const GLuint kClientProgramId = 1234; |
| 884 static const GLuint kServiceProgramId = 5679; | 884 static const GLuint kServiceProgramId = 5679; |
| 885 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 885 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 886 kServiceProgramId); | 886 kServiceProgramId); |
| 887 Program* program = manager_.CreateProgram( | 887 Program* program = manager_.CreateProgram( |
| 888 kClientProgramId, kServiceProgramId); | 888 kClientProgramId, kServiceProgramId); |
| 889 ASSERT_TRUE(program!= NULL); | 889 ASSERT_TRUE(program!= NULL); |
| 890 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 890 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
| 891 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 891 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
| 892 program->Link(NULL, NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); | 892 program->Link(NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); |
| 893 // Check that we got the good type, not the bad. | 893 // Check that we got the good type, not the bad. |
| 894 // Check Attribs | 894 // Check Attribs |
| 895 for (unsigned index = 0; index < kNumAttribs; ++index) { | 895 for (unsigned index = 0; index < kNumAttribs; ++index) { |
| 896 const Program::VertexAttrib* attrib_info = | 896 const Program::VertexAttrib* attrib_info = |
| 897 program->GetAttribInfo(index); | 897 program->GetAttribInfo(index); |
| 898 ASSERT_TRUE(attrib_info != NULL); | 898 ASSERT_TRUE(attrib_info != NULL); |
| 899 ShaderTranslator::VariableMap::const_iterator it = attrib_map.find( | 899 ShaderTranslator::VariableMap::const_iterator it = attrib_map.find( |
| 900 attrib_info->name); | 900 attrib_info->name); |
| 901 ASSERT_TRUE(it != attrib_map.end()); | 901 ASSERT_TRUE(it != attrib_map.end()); |
| 902 EXPECT_EQ(it->first, attrib_info->name); | 902 EXPECT_EQ(it->first, attrib_info->name); |
| (...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1454 kUniform3FakeLocation, | 1454 kUniform3FakeLocation, |
| 1455 kUniform3RealLocation, | 1455 kUniform3RealLocation, |
| 1456 kUniform3DesiredLocation, | 1456 kUniform3DesiredLocation, |
| 1457 kUniform3GoodName, | 1457 kUniform3GoodName, |
| 1458 }, | 1458 }, |
| 1459 }; | 1459 }; |
| 1460 const size_t kNumAttribs = arraysize(kAttribs); | 1460 const size_t kNumAttribs = arraysize(kAttribs); |
| 1461 const size_t kNumUniforms = arraysize(kUniforms); | 1461 const size_t kNumUniforms = arraysize(kUniforms); |
| 1462 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 1462 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 1463 kServiceProgramId); | 1463 kServiceProgramId); |
| 1464 program->Link(NULL, NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); | 1464 program->Link(NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); |
| 1465 SetupExpectationsForClearingUniforms(kUniforms, kNumUniforms); | 1465 SetupExpectationsForClearingUniforms(kUniforms, kNumUniforms); |
| 1466 manager_.ClearUniforms(program); | 1466 manager_.ClearUniforms(program); |
| 1467 } | 1467 } |
| 1468 } | 1468 } |
| 1469 | 1469 |
| 1470 TEST_F(ProgramManagerWithShaderTest, BindUniformLocation) { | 1470 TEST_F(ProgramManagerWithShaderTest, BindUniformLocation) { |
| 1471 const GLuint kVShaderClientId = 2001; | 1471 const GLuint kVShaderClientId = 2001; |
| 1472 const GLuint kFShaderClientId = 2002; | 1472 const GLuint kFShaderClientId = 2002; |
| 1473 const GLuint kVShaderServiceId = 3001; | 1473 const GLuint kVShaderServiceId = 3001; |
| 1474 const GLuint kFShaderServiceId = 3002; | 1474 const GLuint kFShaderServiceId = 3002; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1526 kUniform3RealLocation, | 1526 kUniform3RealLocation, |
| 1527 kUniform3DesiredLocation, | 1527 kUniform3DesiredLocation, |
| 1528 kUniform3GoodName, | 1528 kUniform3GoodName, |
| 1529 }, | 1529 }, |
| 1530 }; | 1530 }; |
| 1531 | 1531 |
| 1532 const size_t kNumAttribs = arraysize(kAttribs); | 1532 const size_t kNumAttribs = arraysize(kAttribs); |
| 1533 const size_t kNumUniforms = arraysize(kUniforms); | 1533 const size_t kNumUniforms = arraysize(kUniforms); |
| 1534 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 1534 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 1535 kServiceProgramId); | 1535 kServiceProgramId); |
| 1536 program->Link(NULL, NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); | 1536 program->Link(NULL, NULL, NULL, base::Bind(&ShaderCacheCb)); |
| 1537 | 1537 |
| 1538 EXPECT_EQ(kUniform1DesiredLocation, | 1538 EXPECT_EQ(kUniform1DesiredLocation, |
| 1539 program->GetUniformFakeLocation(kUniform1Name)); | 1539 program->GetUniformFakeLocation(kUniform1Name)); |
| 1540 EXPECT_EQ(kUniform3DesiredLocation, | 1540 EXPECT_EQ(kUniform3DesiredLocation, |
| 1541 program->GetUniformFakeLocation(kUniform3BadName)); | 1541 program->GetUniformFakeLocation(kUniform3BadName)); |
| 1542 EXPECT_EQ(kUniform3DesiredLocation, | 1542 EXPECT_EQ(kUniform3DesiredLocation, |
| 1543 program->GetUniformFakeLocation(kUniform3GoodName)); | 1543 program->GetUniformFakeLocation(kUniform3GoodName)); |
| 1544 } | 1544 } |
| 1545 | 1545 |
| 1546 class ProgramManagerWithCacheTest : public testing::Test { | 1546 class ProgramManagerWithCacheTest : public testing::Test { |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1749 const GLuint ProgramManagerWithCacheTest::kVertexShaderClientId; | 1749 const GLuint ProgramManagerWithCacheTest::kVertexShaderClientId; |
| 1750 const GLuint ProgramManagerWithCacheTest::kFragmentShaderClientId; | 1750 const GLuint ProgramManagerWithCacheTest::kFragmentShaderClientId; |
| 1751 const GLuint ProgramManagerWithCacheTest::kVertexShaderServiceId; | 1751 const GLuint ProgramManagerWithCacheTest::kVertexShaderServiceId; |
| 1752 const GLuint ProgramManagerWithCacheTest::kFragmentShaderServiceId; | 1752 const GLuint ProgramManagerWithCacheTest::kFragmentShaderServiceId; |
| 1753 #endif | 1753 #endif |
| 1754 | 1754 |
| 1755 TEST_F(ProgramManagerWithCacheTest, CacheProgramOnSuccessfulLink) { | 1755 TEST_F(ProgramManagerWithCacheTest, CacheProgramOnSuccessfulLink) { |
| 1756 SetShadersCompiled(); | 1756 SetShadersCompiled(); |
| 1757 SetExpectationsForProgramLink(); | 1757 SetExpectationsForProgramLink(); |
| 1758 SetExpectationsForProgramCached(); | 1758 SetExpectationsForProgramCached(); |
| 1759 EXPECT_TRUE(program_->Link(NULL, NULL, NULL, NULL, | 1759 EXPECT_TRUE(program_->Link(NULL, NULL, NULL, |
| 1760 base::Bind(&ShaderCacheCb))); | 1760 base::Bind(&ShaderCacheCb))); |
| 1761 } | 1761 } |
| 1762 | 1762 |
| 1763 TEST_F(ProgramManagerWithCacheTest, LoadProgramOnProgramCacheHit) { | 1763 TEST_F(ProgramManagerWithCacheTest, LoadProgramOnProgramCacheHit) { |
| 1764 SetShadersCompiled(); | 1764 SetShadersCompiled(); |
| 1765 SetProgramCached(); | 1765 SetProgramCached(); |
| 1766 | 1766 |
| 1767 SetExpectationsForNoCompile(vertex_shader_); | 1767 SetExpectationsForNoCompile(vertex_shader_); |
| 1768 SetExpectationsForNoCompile(fragment_shader_); | 1768 SetExpectationsForNoCompile(fragment_shader_); |
| 1769 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_SUCCESS); | 1769 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_SUCCESS); |
| 1770 SetExpectationsForNotCachingProgram(); | 1770 SetExpectationsForNotCachingProgram(); |
| 1771 SetExpectationsForProgramLoadSuccess(); | 1771 SetExpectationsForProgramLoadSuccess(); |
| 1772 | 1772 |
| 1773 EXPECT_TRUE(program_->Link(NULL, NULL, NULL, NULL, | 1773 EXPECT_TRUE(program_->Link(NULL, NULL, NULL, |
| 1774 base::Bind(&ShaderCacheCb))); | 1774 base::Bind(&ShaderCacheCb))); |
| 1775 } | 1775 } |
| 1776 | 1776 |
| 1777 } // namespace gles2 | 1777 } // namespace gles2 |
| 1778 } // namespace gpu | 1778 } // namespace gpu |
| OLD | NEW |