Chromium Code Reviews| 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/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 28 using ::testing::SetArrayArgument; | 28 using ::testing::SetArrayArgument; |
| 29 using ::testing::SetArgumentPointee; | 29 using ::testing::SetArgumentPointee; |
| 30 using ::testing::StrEq; | 30 using ::testing::StrEq; |
| 31 using ::testing::StrictMock; | 31 using ::testing::StrictMock; |
| 32 | 32 |
| 33 namespace gpu { | 33 namespace gpu { |
| 34 namespace gles2 { | 34 namespace gles2 { |
| 35 | 35 |
| 36 class ProgramManagerTest : public testing::Test { | 36 class ProgramManagerTest : public testing::Test { |
| 37 public: | 37 public: |
| 38 ProgramManagerTest() { } | 38 ProgramManagerTest() : manager_(NULL) { } |
| 39 ~ProgramManagerTest() { | 39 ~ProgramManagerTest() { |
| 40 manager_.Destroy(false); | 40 manager_.Destroy(false); |
| 41 } | 41 } |
| 42 | 42 |
| 43 protected: | 43 protected: |
| 44 virtual void SetUp() { | 44 virtual void SetUp() { |
| 45 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); | 45 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); |
| 46 ::gfx::GLInterface::SetGLInterface(gl_.get()); | 46 ::gfx::GLInterface::SetGLInterface(gl_.get()); |
| 47 } | 47 } |
| 48 | 48 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 127 EXPECT_FALSE(info1->InUse()); | 127 EXPECT_FALSE(info1->InUse()); |
| 128 EXPECT_FALSE(info1->IsValid()); | 128 EXPECT_FALSE(info1->IsValid()); |
| 129 EXPECT_FALSE(info1->IsDeleted()); | 129 EXPECT_FALSE(info1->IsDeleted()); |
| 130 EXPECT_FALSE(info1->CanLink()); | 130 EXPECT_FALSE(info1->CanLink()); |
| 131 EXPECT_TRUE(info1->log_info() == NULL); | 131 EXPECT_TRUE(info1->log_info() == NULL); |
| 132 } | 132 } |
| 133 | 133 |
| 134 class ProgramManagerWithShaderTest : public testing::Test { | 134 class ProgramManagerWithShaderTest : public testing::Test { |
| 135 public: | 135 public: |
| 136 ProgramManagerWithShaderTest() | 136 ProgramManagerWithShaderTest() |
| 137 : program_info_(NULL) { | 137 : manager_(NULL), program_info_(NULL) { |
| 138 } | 138 } |
| 139 | 139 |
| 140 ~ProgramManagerWithShaderTest() { | 140 ~ProgramManagerWithShaderTest() { |
| 141 manager_.Destroy(false); | 141 manager_.Destroy(false); |
| 142 shader_manager_.Destroy(false); | 142 shader_manager_.Destroy(false); |
| 143 } | 143 } |
| 144 | 144 |
| 145 static const GLint kNumVertexAttribs = 16; | 145 static const GLint kNumVertexAttribs = 16; |
| 146 | 146 |
| 147 static const GLuint kClientProgramId = 123; | 147 static const GLuint kClientProgramId = 123; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 208 ASSERT_TRUE(fragment_shader != NULL); | 208 ASSERT_TRUE(fragment_shader != NULL); |
| 209 vertex_shader->SetStatus(true, NULL, NULL); | 209 vertex_shader->SetStatus(true, NULL, NULL); |
| 210 fragment_shader->SetStatus(true, NULL, NULL); | 210 fragment_shader->SetStatus(true, NULL, NULL); |
| 211 | 211 |
| 212 program_info_ = manager_.CreateProgramInfo( | 212 program_info_ = manager_.CreateProgramInfo( |
| 213 kClientProgramId, kServiceProgramId); | 213 kClientProgramId, kServiceProgramId); |
| 214 ASSERT_TRUE(program_info_ != NULL); | 214 ASSERT_TRUE(program_info_ != NULL); |
| 215 | 215 |
| 216 program_info_->AttachShader(&shader_manager_, vertex_shader); | 216 program_info_->AttachShader(&shader_manager_, vertex_shader); |
| 217 program_info_->AttachShader(&shader_manager_, fragment_shader); | 217 program_info_->AttachShader(&shader_manager_, fragment_shader); |
| 218 program_info_->Link(); | 218 program_info_->Link(NULL, NULL, NULL, NULL); |
| 219 } | 219 } |
| 220 | 220 |
| 221 void SetupShader(AttribInfo* attribs, size_t num_attribs, | 221 void SetupShader(AttribInfo* attribs, size_t num_attribs, |
| 222 UniformInfo* uniforms, size_t num_uniforms, | 222 UniformInfo* uniforms, size_t num_uniforms, |
| 223 GLuint service_id) { | 223 GLuint service_id) { |
| 224 TestHelper::SetupShader( | 224 TestHelper::SetupShader( |
| 225 gl_.get(), attribs, num_attribs, uniforms, num_uniforms, service_id); | 225 gl_.get(), attribs, num_attribs, uniforms, num_uniforms, service_id); |
| 226 } | 226 } |
| 227 | 227 |
| 228 void SetupDefaultShaderExpectations() { | 228 void SetupDefaultShaderExpectations() { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 241 } | 241 } |
| 242 | 242 |
| 243 // Return true if link status matches expected_link_status | 243 // Return true if link status matches expected_link_status |
| 244 bool LinkAsExpected(ProgramManager::ProgramInfo* program_info, | 244 bool LinkAsExpected(ProgramManager::ProgramInfo* program_info, |
| 245 bool expected_link_status) { | 245 bool expected_link_status) { |
| 246 GLuint service_id = program_info->service_id(); | 246 GLuint service_id = program_info->service_id(); |
| 247 if (expected_link_status) { | 247 if (expected_link_status) { |
| 248 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 248 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 249 service_id); | 249 service_id); |
| 250 } | 250 } |
| 251 program_info->Link(); | 251 program_info->Link(NULL, NULL, NULL, NULL); |
| 252 GLint link_status; | 252 GLint link_status; |
| 253 program_info->GetProgramiv(GL_LINK_STATUS, &link_status); | 253 program_info->GetProgramiv(GL_LINK_STATUS, &link_status); |
| 254 return (static_cast<bool>(link_status) == expected_link_status); | 254 return (static_cast<bool>(link_status) == expected_link_status); |
| 255 } | 255 } |
| 256 | 256 |
| 257 static AttribInfo kAttribs[]; | 257 static AttribInfo kAttribs[]; |
| 258 static UniformInfo kUniforms[]; | 258 static UniformInfo kUniforms[]; |
| 259 | 259 |
| 260 scoped_ptr<StrictMock<gfx::MockGLInterface> > gl_; | 260 scoped_ptr<StrictMock<gfx::MockGLInterface> > gl_; |
| 261 | 261 |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 565 vshader->SetStatus(true, "", NULL); | 565 vshader->SetStatus(true, "", NULL); |
| 566 ShaderManager::ShaderInfo* fshader = shader_manager_.CreateShaderInfo( | 566 ShaderManager::ShaderInfo* fshader = shader_manager_.CreateShaderInfo( |
| 567 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); | 567 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); |
| 568 ASSERT_TRUE(fshader != NULL); | 568 ASSERT_TRUE(fshader != NULL); |
| 569 fshader->SetStatus(true, "", NULL); | 569 fshader->SetStatus(true, "", NULL); |
| 570 ProgramManager::ProgramInfo* program_info = | 570 ProgramManager::ProgramInfo* program_info = |
| 571 manager_.CreateProgramInfo(kClientProgramId, kServiceProgramId); | 571 manager_.CreateProgramInfo(kClientProgramId, kServiceProgramId); |
| 572 ASSERT_TRUE(program_info != NULL); | 572 ASSERT_TRUE(program_info != NULL); |
| 573 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, vshader)); | 573 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, vshader)); |
| 574 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, fshader)); | 574 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, fshader)); |
| 575 program_info->Link(); | 575 program_info->Link(NULL, NULL, NULL, NULL); |
| 576 GLint value = 0; | 576 GLint value = 0; |
| 577 program_info->GetProgramiv(GL_ACTIVE_ATTRIBUTES, &value); | 577 program_info->GetProgramiv(GL_ACTIVE_ATTRIBUTES, &value); |
| 578 EXPECT_EQ(3, value); | 578 EXPECT_EQ(3, value); |
| 579 // Check that we skipped the "gl_" uniform. | 579 // Check that we skipped the "gl_" uniform. |
| 580 program_info->GetProgramiv(GL_ACTIVE_UNIFORMS, &value); | 580 program_info->GetProgramiv(GL_ACTIVE_UNIFORMS, &value); |
| 581 EXPECT_EQ(2, value); | 581 EXPECT_EQ(2, value); |
| 582 // Check that our max length adds room for the array spec and is not as long | 582 // Check that our max length adds room for the array spec and is not as long |
| 583 // as the "gl_" uniform we skipped. | 583 // as the "gl_" uniform we skipped. |
| 584 // +4u is to account for "gl_" and NULL terminator. | 584 // +4u is to account for "gl_" and NULL terminator. |
| 585 program_info->GetProgramiv(GL_ACTIVE_UNIFORM_MAX_LENGTH, &value); | 585 program_info->GetProgramiv(GL_ACTIVE_UNIFORM_MAX_LENGTH, &value); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 656 const size_t kNumUniforms = arraysize(kUniforms); | 656 const size_t kNumUniforms = arraysize(kUniforms); |
| 657 static const GLuint kClientProgramId = 1234; | 657 static const GLuint kClientProgramId = 1234; |
| 658 static const GLuint kServiceProgramId = 5679; | 658 static const GLuint kServiceProgramId = 5679; |
| 659 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 659 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 660 kServiceProgramId); | 660 kServiceProgramId); |
| 661 ProgramManager::ProgramInfo* program_info = manager_.CreateProgramInfo( | 661 ProgramManager::ProgramInfo* program_info = manager_.CreateProgramInfo( |
| 662 kClientProgramId, kServiceProgramId); | 662 kClientProgramId, kServiceProgramId); |
| 663 ASSERT_TRUE(program_info != NULL); | 663 ASSERT_TRUE(program_info != NULL); |
| 664 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, vshader)); | 664 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, vshader)); |
| 665 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, fshader)); | 665 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, fshader)); |
| 666 program_info->Link(); | 666 program_info->Link(NULL, NULL, NULL, NULL); |
| 667 // Check that we got the good type, not the bad. | 667 // Check that we got the good type, not the bad. |
| 668 // Check Attribs | 668 // Check Attribs |
| 669 for (unsigned index = 0; index < kNumAttribs; ++index) { | 669 for (unsigned index = 0; index < kNumAttribs; ++index) { |
| 670 const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info = | 670 const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info = |
| 671 program_info->GetAttribInfo(index); | 671 program_info->GetAttribInfo(index); |
| 672 ASSERT_TRUE(attrib_info != NULL); | 672 ASSERT_TRUE(attrib_info != NULL); |
| 673 ShaderTranslator::VariableMap::const_iterator it = attrib_map.find( | 673 ShaderTranslator::VariableMap::const_iterator it = attrib_map.find( |
| 674 attrib_info->name); | 674 attrib_info->name); |
| 675 ASSERT_TRUE(it != attrib_map.end()); | 675 ASSERT_TRUE(it != attrib_map.end()); |
| 676 EXPECT_EQ(it->first, attrib_info->name); | 676 EXPECT_EQ(it->first, attrib_info->name); |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 972 kUniform3Type, | 972 kUniform3Type, |
| 973 kUniform3FakeLocation, | 973 kUniform3FakeLocation, |
| 974 kUniform3RealLocation, | 974 kUniform3RealLocation, |
| 975 kUniform3GoodName, | 975 kUniform3GoodName, |
| 976 }, | 976 }, |
| 977 }; | 977 }; |
| 978 const size_t kNumAttribs = arraysize(kAttribs); | 978 const size_t kNumAttribs = arraysize(kAttribs); |
| 979 const size_t kNumUniforms = arraysize(kUniforms); | 979 const size_t kNumUniforms = arraysize(kUniforms); |
| 980 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 980 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 981 kServiceProgramId); | 981 kServiceProgramId); |
| 982 program_info->Link(); | 982 program_info->Link(NULL, NULL, NULL, NULL); |
| 983 SetupExpectationsForClearingUniforms(kUniforms, kNumUniforms); | 983 SetupExpectationsForClearingUniforms(kUniforms, kNumUniforms); |
| 984 manager_.ClearUniforms(program_info); | 984 manager_.ClearUniforms(program_info); |
| 985 } | 985 } |
| 986 } | 986 } |
| 987 | 987 |
| 988 TEST_F(ProgramManagerWithShaderTest, UniformsAreSorted) { | 988 TEST_F(ProgramManagerWithShaderTest, UniformsAreSorted) { |
| 989 const GLuint kVShaderClientId = 2001; | 989 const GLuint kVShaderClientId = 2001; |
| 990 const GLuint kFShaderClientId = 2002; | 990 const GLuint kFShaderClientId = 2002; |
| 991 const GLuint kVShaderServiceId = 3001; | 991 const GLuint kVShaderServiceId = 3001; |
| 992 const GLuint kFShaderServiceId = 3002; | 992 const GLuint kFShaderServiceId = 3002; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1030 const size_t kNumUniforms = arraysize(kUniforms); | 1030 const size_t kNumUniforms = arraysize(kUniforms); |
| 1031 static const GLuint kClientProgramId = 1234; | 1031 static const GLuint kClientProgramId = 1234; |
| 1032 static const GLuint kServiceProgramId = 5679; | 1032 static const GLuint kServiceProgramId = 5679; |
| 1033 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 1033 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 1034 kServiceProgramId); | 1034 kServiceProgramId); |
| 1035 ProgramManager::ProgramInfo* program_info = manager_.CreateProgramInfo( | 1035 ProgramManager::ProgramInfo* program_info = manager_.CreateProgramInfo( |
| 1036 kClientProgramId, kServiceProgramId); | 1036 kClientProgramId, kServiceProgramId); |
| 1037 ASSERT_TRUE(program_info != NULL); | 1037 ASSERT_TRUE(program_info != NULL); |
| 1038 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, vshader)); | 1038 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, vshader)); |
| 1039 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, fshader)); | 1039 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, fshader)); |
| 1040 program_info->Link(); | 1040 program_info->Link(NULL, NULL, NULL, NULL); |
| 1041 // Check Uniforms | 1041 // Check Uniforms |
| 1042 const ProgramManager::ProgramInfo::UniformInfo* uniform_info = | 1042 const ProgramManager::ProgramInfo::UniformInfo* uniform_info = |
| 1043 program_info->GetUniformInfo(0); | 1043 program_info->GetUniformInfo(0); |
| 1044 ASSERT_TRUE(uniform_info != NULL); | 1044 ASSERT_TRUE(uniform_info != NULL); |
| 1045 EXPECT_STREQ(kUniform1Name, uniform_info->name.c_str()); | 1045 EXPECT_STREQ(kUniform1Name, uniform_info->name.c_str()); |
| 1046 EXPECT_EQ(0, uniform_info->fake_location_base); | 1046 EXPECT_EQ(0, uniform_info->fake_location_base); |
| 1047 uniform_info = program_info->GetUniformInfo(1); | 1047 uniform_info = program_info->GetUniformInfo(1); |
| 1048 ASSERT_TRUE(uniform_info != NULL); | 1048 ASSERT_TRUE(uniform_info != NULL); |
| 1049 EXPECT_STREQ(kUniform2Name, uniform_info->name.c_str()); | 1049 EXPECT_STREQ(kUniform2Name, uniform_info->name.c_str()); |
| 1050 EXPECT_EQ(1, uniform_info->fake_location_base); | 1050 EXPECT_EQ(1, uniform_info->fake_location_base); |
| 1051 uniform_info = program_info->GetUniformInfo(2); | 1051 uniform_info = program_info->GetUniformInfo(2); |
| 1052 ASSERT_TRUE(uniform_info != NULL); | 1052 ASSERT_TRUE(uniform_info != NULL); |
| 1053 EXPECT_STREQ(kUniform3GoodName, uniform_info->name.c_str()); | 1053 EXPECT_STREQ(kUniform3GoodName, uniform_info->name.c_str()); |
| 1054 EXPECT_EQ(2, uniform_info->fake_location_base); | 1054 EXPECT_EQ(2, uniform_info->fake_location_base); |
| 1055 } | 1055 } |
| 1056 | 1056 |
|
greggman
2012/06/26 23:00:27
You need to add a bunch of unit tests here using a
| |
| 1057 } // namespace gles2 | 1057 } // namespace gles2 |
| 1058 } // namespace gpu | 1058 } // namespace gpu |
| 1059 | 1059 |
| 1060 | 1060 |
| OLD | NEW |