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" |
| 11 #include "base/string_util.h" | 11 #include "base/string_util.h" |
| 12 #include "gpu/command_buffer/common/gl_mock.h" | 12 #include "gpu/command_buffer/common/gl_mock.h" |
| 13 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 13 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
| 14 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 14 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| 15 #include "gpu/command_buffer/service/common_decoder.h" | 15 #include "gpu/command_buffer/service/common_decoder.h" |
| 16 #include "gpu/command_buffer/service/feature_info.h" | |
| 16 #include "gpu/command_buffer/service/mocks.h" | 17 #include "gpu/command_buffer/service/mocks.h" |
| 17 #include "gpu/command_buffer/service/test_helper.h" | 18 #include "gpu/command_buffer/service/test_helper.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 20 |
| 20 using ::gfx::MockGLInterface; | 21 using ::gfx::MockGLInterface; |
| 21 using ::testing::_; | 22 using ::testing::_; |
| 22 using ::testing::DoAll; | 23 using ::testing::DoAll; |
| 23 using ::testing::InSequence; | 24 using ::testing::InSequence; |
| 24 using ::testing::MatcherCast; | 25 using ::testing::MatcherCast; |
| 25 using ::testing::Pointee; | 26 using ::testing::Pointee; |
| 26 using ::testing::Return; | 27 using ::testing::Return; |
| 27 using ::testing::ReturnRef; | 28 using ::testing::ReturnRef; |
| 28 using ::testing::SetArrayArgument; | 29 using ::testing::SetArrayArgument; |
| 29 using ::testing::SetArgumentPointee; | 30 using ::testing::SetArgumentPointee; |
| 30 using ::testing::StrEq; | 31 using ::testing::StrEq; |
| 31 using ::testing::StrictMock; | 32 using ::testing::StrictMock; |
| 32 | 33 |
| 33 namespace gpu { | 34 namespace gpu { |
| 34 namespace gles2 { | 35 namespace gles2 { |
| 35 | 36 |
| 36 class ProgramManagerTest : public testing::Test { | 37 class ProgramManagerTest : public testing::Test { |
| 37 public: | 38 public: |
| 38 ProgramManagerTest() { } | 39 ProgramManagerTest() : manager_(NULL) { } |
| 39 ~ProgramManagerTest() { | 40 ~ProgramManagerTest() { |
| 40 manager_.Destroy(false); | 41 manager_.Destroy(false); |
| 41 } | 42 } |
| 42 | 43 |
| 43 protected: | 44 protected: |
| 44 virtual void SetUp() { | 45 virtual void SetUp() { |
| 45 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); | 46 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); |
| 46 ::gfx::GLInterface::SetGLInterface(gl_.get()); | 47 ::gfx::GLInterface::SetGLInterface(gl_.get()); |
| 47 } | 48 } |
| 48 | 49 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 127 EXPECT_FALSE(info1->InUse()); | 128 EXPECT_FALSE(info1->InUse()); |
| 128 EXPECT_FALSE(info1->IsValid()); | 129 EXPECT_FALSE(info1->IsValid()); |
| 129 EXPECT_FALSE(info1->IsDeleted()); | 130 EXPECT_FALSE(info1->IsDeleted()); |
| 130 EXPECT_FALSE(info1->CanLink()); | 131 EXPECT_FALSE(info1->CanLink()); |
| 131 EXPECT_TRUE(info1->log_info() == NULL); | 132 EXPECT_TRUE(info1->log_info() == NULL); |
| 132 } | 133 } |
| 133 | 134 |
| 134 class ProgramManagerWithShaderTest : public testing::Test { | 135 class ProgramManagerWithShaderTest : public testing::Test { |
| 135 public: | 136 public: |
| 136 ProgramManagerWithShaderTest() | 137 ProgramManagerWithShaderTest() |
| 137 : program_info_(NULL) { | 138 : manager_(NULL), program_info_(NULL) { |
| 138 } | 139 } |
| 139 | 140 |
| 140 ~ProgramManagerWithShaderTest() { | 141 ~ProgramManagerWithShaderTest() { |
| 141 manager_.Destroy(false); | 142 manager_.Destroy(false); |
| 142 shader_manager_.Destroy(false); | 143 shader_manager_.Destroy(false); |
| 143 } | 144 } |
| 144 | 145 |
| 145 static const GLint kNumVertexAttribs = 16; | 146 static const GLint kNumVertexAttribs = 16; |
| 146 | 147 |
| 147 static const GLuint kClientProgramId = 123; | 148 static const GLuint kClientProgramId = 123; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 211 ASSERT_TRUE(fragment_shader != NULL); | 212 ASSERT_TRUE(fragment_shader != NULL); |
| 212 vertex_shader->SetStatus(true, NULL, NULL); | 213 vertex_shader->SetStatus(true, NULL, NULL); |
| 213 fragment_shader->SetStatus(true, NULL, NULL); | 214 fragment_shader->SetStatus(true, NULL, NULL); |
| 214 | 215 |
| 215 program_info_ = manager_.CreateProgramInfo( | 216 program_info_ = manager_.CreateProgramInfo( |
| 216 kClientProgramId, kServiceProgramId); | 217 kClientProgramId, kServiceProgramId); |
| 217 ASSERT_TRUE(program_info_ != NULL); | 218 ASSERT_TRUE(program_info_ != NULL); |
| 218 | 219 |
| 219 program_info_->AttachShader(&shader_manager_, vertex_shader); | 220 program_info_->AttachShader(&shader_manager_, vertex_shader); |
| 220 program_info_->AttachShader(&shader_manager_, fragment_shader); | 221 program_info_->AttachShader(&shader_manager_, fragment_shader); |
| 221 program_info_->Link(); | 222 program_info_->Link(NULL, NULL, NULL, NULL); |
| 222 } | 223 } |
| 223 | 224 |
| 224 void SetupShader(AttribInfo* attribs, size_t num_attribs, | 225 void SetupShader(AttribInfo* attribs, size_t num_attribs, |
| 225 UniformInfo* uniforms, size_t num_uniforms, | 226 UniformInfo* uniforms, size_t num_uniforms, |
| 226 GLuint service_id) { | 227 GLuint service_id) { |
| 227 TestHelper::SetupShader( | 228 TestHelper::SetupShader( |
| 228 gl_.get(), attribs, num_attribs, uniforms, num_uniforms, service_id); | 229 gl_.get(), attribs, num_attribs, uniforms, num_uniforms, service_id); |
| 229 } | 230 } |
| 230 | 231 |
| 231 void SetupDefaultShaderExpectations() { | 232 void SetupDefaultShaderExpectations() { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 244 } | 245 } |
| 245 | 246 |
| 246 // Return true if link status matches expected_link_status | 247 // Return true if link status matches expected_link_status |
| 247 bool LinkAsExpected(ProgramManager::ProgramInfo* program_info, | 248 bool LinkAsExpected(ProgramManager::ProgramInfo* program_info, |
| 248 bool expected_link_status) { | 249 bool expected_link_status) { |
| 249 GLuint service_id = program_info->service_id(); | 250 GLuint service_id = program_info->service_id(); |
| 250 if (expected_link_status) { | 251 if (expected_link_status) { |
| 251 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 252 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 252 service_id); | 253 service_id); |
| 253 } | 254 } |
| 254 program_info->Link(); | 255 program_info->Link(NULL, NULL, NULL, NULL); |
| 255 GLint link_status; | 256 GLint link_status; |
| 256 program_info->GetProgramiv(GL_LINK_STATUS, &link_status); | 257 program_info->GetProgramiv(GL_LINK_STATUS, &link_status); |
| 257 return (static_cast<bool>(link_status) == expected_link_status); | 258 return (static_cast<bool>(link_status) == expected_link_status); |
| 258 } | 259 } |
| 259 | 260 |
| 260 static AttribInfo kAttribs[]; | 261 static AttribInfo kAttribs[]; |
| 261 static UniformInfo kUniforms[]; | 262 static UniformInfo kUniforms[]; |
| 262 | 263 |
| 263 scoped_ptr<StrictMock<gfx::MockGLInterface> > gl_; | 264 scoped_ptr<StrictMock<gfx::MockGLInterface> > gl_; |
| 264 | 265 |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 577 vshader->SetStatus(true, "", NULL); | 578 vshader->SetStatus(true, "", NULL); |
| 578 ShaderManager::ShaderInfo* fshader = shader_manager_.CreateShaderInfo( | 579 ShaderManager::ShaderInfo* fshader = shader_manager_.CreateShaderInfo( |
| 579 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); | 580 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); |
| 580 ASSERT_TRUE(fshader != NULL); | 581 ASSERT_TRUE(fshader != NULL); |
| 581 fshader->SetStatus(true, "", NULL); | 582 fshader->SetStatus(true, "", NULL); |
| 582 ProgramManager::ProgramInfo* program_info = | 583 ProgramManager::ProgramInfo* program_info = |
| 583 manager_.CreateProgramInfo(kClientProgramId, kServiceProgramId); | 584 manager_.CreateProgramInfo(kClientProgramId, kServiceProgramId); |
| 584 ASSERT_TRUE(program_info != NULL); | 585 ASSERT_TRUE(program_info != NULL); |
| 585 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, vshader)); | 586 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, vshader)); |
| 586 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, fshader)); | 587 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, fshader)); |
| 587 program_info->Link(); | 588 program_info->Link(NULL, NULL, NULL, NULL); |
| 588 GLint value = 0; | 589 GLint value = 0; |
| 589 program_info->GetProgramiv(GL_ACTIVE_ATTRIBUTES, &value); | 590 program_info->GetProgramiv(GL_ACTIVE_ATTRIBUTES, &value); |
| 590 EXPECT_EQ(3, value); | 591 EXPECT_EQ(3, value); |
| 591 // Check that we skipped the "gl_" uniform. | 592 // Check that we skipped the "gl_" uniform. |
| 592 program_info->GetProgramiv(GL_ACTIVE_UNIFORMS, &value); | 593 program_info->GetProgramiv(GL_ACTIVE_UNIFORMS, &value); |
| 593 EXPECT_EQ(2, value); | 594 EXPECT_EQ(2, value); |
| 594 // Check that our max length adds room for the array spec and is not as long | 595 // Check that our max length adds room for the array spec and is not as long |
| 595 // as the "gl_" uniform we skipped. | 596 // as the "gl_" uniform we skipped. |
| 596 // +4u is to account for "gl_" and NULL terminator. | 597 // +4u is to account for "gl_" and NULL terminator. |
| 597 program_info->GetProgramiv(GL_ACTIVE_UNIFORM_MAX_LENGTH, &value); | 598 program_info->GetProgramiv(GL_ACTIVE_UNIFORM_MAX_LENGTH, &value); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 671 const size_t kNumUniforms = arraysize(kUniforms); | 672 const size_t kNumUniforms = arraysize(kUniforms); |
| 672 static const GLuint kClientProgramId = 1234; | 673 static const GLuint kClientProgramId = 1234; |
| 673 static const GLuint kServiceProgramId = 5679; | 674 static const GLuint kServiceProgramId = 5679; |
| 674 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 675 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 675 kServiceProgramId); | 676 kServiceProgramId); |
| 676 ProgramManager::ProgramInfo* program_info = manager_.CreateProgramInfo( | 677 ProgramManager::ProgramInfo* program_info = manager_.CreateProgramInfo( |
| 677 kClientProgramId, kServiceProgramId); | 678 kClientProgramId, kServiceProgramId); |
| 678 ASSERT_TRUE(program_info != NULL); | 679 ASSERT_TRUE(program_info != NULL); |
| 679 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, vshader)); | 680 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, vshader)); |
| 680 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, fshader)); | 681 EXPECT_TRUE(program_info->AttachShader(&shader_manager_, fshader)); |
| 681 program_info->Link(); | 682 program_info->Link(NULL, NULL, NULL, NULL); |
| 682 // Check that we got the good type, not the bad. | 683 // Check that we got the good type, not the bad. |
| 683 // Check Attribs | 684 // Check Attribs |
| 684 for (unsigned index = 0; index < kNumAttribs; ++index) { | 685 for (unsigned index = 0; index < kNumAttribs; ++index) { |
| 685 const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info = | 686 const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info = |
| 686 program_info->GetAttribInfo(index); | 687 program_info->GetAttribInfo(index); |
| 687 ASSERT_TRUE(attrib_info != NULL); | 688 ASSERT_TRUE(attrib_info != NULL); |
| 688 ShaderTranslator::VariableMap::const_iterator it = attrib_map.find( | 689 ShaderTranslator::VariableMap::const_iterator it = attrib_map.find( |
| 689 attrib_info->name); | 690 attrib_info->name); |
| 690 ASSERT_TRUE(it != attrib_map.end()); | 691 ASSERT_TRUE(it != attrib_map.end()); |
| 691 EXPECT_EQ(it->first, attrib_info->name); | 692 EXPECT_EQ(it->first, attrib_info->name); |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 990 kUniform3FakeLocation, | 991 kUniform3FakeLocation, |
| 991 kUniform3RealLocation, | 992 kUniform3RealLocation, |
| 992 kUniform3DesiredLocation, | 993 kUniform3DesiredLocation, |
| 993 kUniform3GoodName, | 994 kUniform3GoodName, |
| 994 }, | 995 }, |
| 995 }; | 996 }; |
| 996 const size_t kNumAttribs = arraysize(kAttribs); | 997 const size_t kNumAttribs = arraysize(kAttribs); |
| 997 const size_t kNumUniforms = arraysize(kUniforms); | 998 const size_t kNumUniforms = arraysize(kUniforms); |
| 998 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 999 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 999 kServiceProgramId); | 1000 kServiceProgramId); |
| 1000 program_info->Link(); | 1001 program_info->Link(NULL, NULL, NULL, NULL); |
| 1001 SetupExpectationsForClearingUniforms(kUniforms, kNumUniforms); | 1002 SetupExpectationsForClearingUniforms(kUniforms, kNumUniforms); |
| 1002 manager_.ClearUniforms(program_info); | 1003 manager_.ClearUniforms(program_info); |
| 1003 } | 1004 } |
| 1004 } | 1005 } |
| 1005 | 1006 |
| 1006 TEST_F(ProgramManagerWithShaderTest, BindUniformLocation) { | 1007 TEST_F(ProgramManagerWithShaderTest, BindUniformLocation) { |
| 1007 const GLuint kVShaderClientId = 2001; | 1008 const GLuint kVShaderClientId = 2001; |
| 1008 const GLuint kFShaderClientId = 2002; | 1009 const GLuint kFShaderClientId = 2002; |
| 1009 const GLuint kVShaderServiceId = 3001; | 1010 const GLuint kVShaderServiceId = 3001; |
| 1010 const GLuint kFShaderServiceId = 3002; | 1011 const GLuint kFShaderServiceId = 3002; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1062 kUniform3RealLocation, | 1063 kUniform3RealLocation, |
| 1063 kUniform3DesiredLocation, | 1064 kUniform3DesiredLocation, |
| 1064 kUniform3GoodName, | 1065 kUniform3GoodName, |
| 1065 }, | 1066 }, |
| 1066 }; | 1067 }; |
| 1067 | 1068 |
| 1068 const size_t kNumAttribs = arraysize(kAttribs); | 1069 const size_t kNumAttribs = arraysize(kAttribs); |
| 1069 const size_t kNumUniforms = arraysize(kUniforms); | 1070 const size_t kNumUniforms = arraysize(kUniforms); |
| 1070 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 1071 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 1071 kServiceProgramId); | 1072 kServiceProgramId); |
| 1072 program_info->Link(); | 1073 program_info->Link(NULL, NULL, NULL, NULL); |
| 1073 | 1074 |
| 1074 EXPECT_EQ(kUniform1DesiredLocation, | 1075 EXPECT_EQ(kUniform1DesiredLocation, |
| 1075 program_info->GetUniformFakeLocation(kUniform1Name)); | 1076 program_info->GetUniformFakeLocation(kUniform1Name)); |
| 1076 EXPECT_EQ(kUniform3DesiredLocation, | 1077 EXPECT_EQ(kUniform3DesiredLocation, |
| 1077 program_info->GetUniformFakeLocation(kUniform3BadName)); | 1078 program_info->GetUniformFakeLocation(kUniform3BadName)); |
| 1078 EXPECT_EQ(kUniform3DesiredLocation, | 1079 EXPECT_EQ(kUniform3DesiredLocation, |
| 1079 program_info->GetUniformFakeLocation(kUniform3GoodName)); | 1080 program_info->GetUniformFakeLocation(kUniform3GoodName)); |
| 1080 } | 1081 } |
| 1081 | 1082 |
| 1083 class ProgramManagerWithCacheTest : public testing::Test { | |
| 1084 public: | |
| 1085 static const GLuint kClientProgramId = 123; | |
| 1086 static const GLuint kServiceProgramId = 456; | |
| 1087 static const GLuint kVertexShaderClientId = 201; | |
| 1088 static const GLuint kFragmentShaderClientId = 202; | |
| 1089 static const GLuint kVertexShaderServiceId = 301; | |
| 1090 static const GLuint kFragmentShaderServiceId = 302; | |
| 1091 | |
| 1092 ProgramManagerWithCacheTest() | |
| 1093 : cache_(new MockProgramCache()), | |
| 1094 manager_(cache_.get()), | |
| 1095 vertex_shader_(NULL), | |
| 1096 fragment_shader_(NULL), | |
| 1097 program_info_(NULL) { | |
| 1098 } | |
| 1099 ~ProgramManagerWithCacheTest() { | |
| 1100 manager_.Destroy(false); | |
| 1101 shader_manager_.Destroy(false); | |
| 1102 } | |
| 1103 | |
| 1104 protected: | |
| 1105 virtual void SetUp() { | |
| 1106 gl_.reset(new StrictMock<gfx::MockGLInterface>()); | |
| 1107 ::gfx::GLInterface::SetGLInterface(gl_.get()); | |
| 1108 | |
| 1109 vertex_shader_ = shader_manager_.CreateShaderInfo( | |
| 1110 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | |
| 1111 fragment_shader_ = shader_manager_.CreateShaderInfo( | |
| 1112 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | |
| 1113 ASSERT_TRUE(vertex_shader_ != NULL); | |
| 1114 ASSERT_TRUE(fragment_shader_ != NULL); | |
| 1115 vertex_shader_->UpdateSource("lka asjf bjajsdfj"); | |
| 1116 fragment_shader_->UpdateSource("lka asjf a fasgag 3rdsf3 bjajsdfj"); | |
| 1117 | |
| 1118 program_info_ = manager_.CreateProgramInfo( | |
| 1119 kClientProgramId, kServiceProgramId); | |
| 1120 ASSERT_TRUE(program_info_ != NULL); | |
| 1121 | |
| 1122 program_info_->AttachShader(&shader_manager_, vertex_shader_); | |
| 1123 program_info_->AttachShader(&shader_manager_, fragment_shader_); | |
| 1124 } | |
| 1125 | |
| 1126 virtual void TearDown() { | |
| 1127 ::gfx::GLInterface::SetGLInterface(NULL); | |
| 1128 } | |
| 1129 | |
| 1130 void SetShadersCompiled() { | |
| 1131 vertex_shader_->SetStatus(true, NULL, NULL); | |
| 1132 fragment_shader_->SetStatus(true, NULL, NULL); | |
| 1133 } | |
| 1134 | |
| 1135 void SetShadersCached() { | |
| 1136 SetShadersCompiled(); | |
| 1137 vertex_shader_->set_pending_compilation(true); | |
| 1138 fragment_shader_->set_pending_compilation(true); | |
| 1139 } | |
| 1140 | |
| 1141 void SetProgramCached() { | |
| 1142 cache_->LinkedProgramCacheSuccess( | |
| 1143 vertex_shader_->source()->c_str(), | |
| 1144 fragment_shader_->source()->c_str(), | |
| 1145 &program_info_->bind_attrib_location_map()); | |
| 1146 } | |
| 1147 | |
| 1148 void SetExpectationsForProgramCached() { | |
| 1149 EXPECT_CALL(*cache_.get(), SaveLinkedProgram( | |
| 1150 program_info_->service_id(), | |
| 1151 vertex_shader_, | |
| 1152 fragment_shader_, | |
| 1153 &program_info_->bind_attrib_location_map())).Times(1); | |
| 1154 } | |
| 1155 | |
| 1156 void SetExpectationsForProgramLoad(ProgramCache::ProgramLoadResult result) { | |
| 1157 EXPECT_CALL(*cache_.get(), | |
| 1158 LoadLinkedProgram(kServiceProgramId, | |
| 1159 vertex_shader_, | |
| 1160 fragment_shader_, | |
| 1161 &program_info_->bind_attrib_location_map())) | |
| 1162 .WillOnce(Return(result)); | |
|
greggman
2012/07/10 21:43:30
style: indent
dmurph
2012/07/11 23:32:52
Done.
| |
| 1163 } | |
| 1164 | |
| 1165 void SetExpectationsForProgramLoadSuccess() { | |
| 1166 TestHelper::SetupProgramSuccessExpectations(gl_.get(), | |
| 1167 NULL, | |
| 1168 0, | |
| 1169 NULL, | |
| 1170 0, | |
| 1171 kServiceProgramId); | |
| 1172 } | |
| 1173 | |
| 1174 void SetExpectationsForNotCachingProgram() { | |
| 1175 EXPECT_CALL(*cache_.get(), SaveLinkedProgram( | |
| 1176 program_info_->service_id(), | |
| 1177 vertex_shader_, | |
| 1178 fragment_shader_, | |
| 1179 &program_info_->bind_attrib_location_map())).Times(0); | |
| 1180 } | |
| 1181 | |
| 1182 void SetExpectationsForProgramLink() { | |
| 1183 TestHelper::SetupShader( | |
| 1184 gl_.get(), NULL, 0, NULL, 0, kServiceProgramId); | |
| 1185 } | |
| 1186 | |
| 1187 void SetExpectationsForSuccessCompile( | |
| 1188 const ShaderManager::ShaderInfo* shader) { | |
| 1189 const GLuint shader_id = shader->service_id(); | |
| 1190 const char* src = shader->source()->c_str(); | |
| 1191 EXPECT_CALL(*gl_.get(), | |
| 1192 ShaderSource(shader_id, 1, Pointee(src), NULL)).Times(1); | |
| 1193 EXPECT_CALL(*gl_.get(), CompileShader(shader_id)).Times(1); | |
| 1194 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_COMPILE_STATUS, _)) | |
| 1195 .WillOnce(SetArgumentPointee<2>(GL_TRUE)); | |
| 1196 } | |
| 1197 | |
| 1198 void SetExpectationsForNoCompile(const ShaderManager::ShaderInfo* shader) { | |
| 1199 const GLuint shader_id = shader->service_id(); | |
| 1200 const char* src = shader->source()->c_str(); | |
| 1201 EXPECT_CALL(*gl_.get(), | |
| 1202 ShaderSource(shader_id, 1, Pointee(src), NULL)).Times(0); | |
| 1203 EXPECT_CALL(*gl_.get(), CompileShader(shader_id)).Times(0); | |
| 1204 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_COMPILE_STATUS, _)) | |
| 1205 .Times(0); | |
| 1206 } | |
| 1207 | |
| 1208 void SetExpectationsForErrorCompile(const ShaderManager::ShaderInfo* shader) { | |
| 1209 const GLuint shader_id = shader->service_id(); | |
| 1210 const char* src = shader->source()->c_str(); | |
| 1211 EXPECT_CALL(*gl_.get(), | |
| 1212 ShaderSource(shader_id, 1, Pointee(src), NULL)).Times(1); | |
| 1213 EXPECT_CALL(*gl_.get(), CompileShader(shader_id)).Times(1); | |
| 1214 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_COMPILE_STATUS, _)) | |
| 1215 .WillOnce(SetArgumentPointee<2>(GL_FALSE)); | |
| 1216 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_INFO_LOG_LENGTH, _)) | |
| 1217 .WillOnce(SetArgumentPointee<2>(0)); | |
| 1218 EXPECT_CALL(*gl_.get(), GetShaderInfoLog(shader_id, 0, _, _)) | |
| 1219 .Times(1); | |
| 1220 } | |
| 1221 | |
| 1222 scoped_ptr<StrictMock<gfx::MockGLInterface> > gl_; | |
| 1223 | |
| 1224 scoped_ptr<MockProgramCache> cache_; | |
| 1225 ProgramManager manager_; | |
| 1226 | |
| 1227 ShaderManager::ShaderInfo* vertex_shader_; | |
| 1228 ShaderManager::ShaderInfo* fragment_shader_; | |
| 1229 ProgramManager::ProgramInfo* program_info_; | |
| 1230 ShaderManager shader_manager_; | |
| 1231 }; | |
| 1232 | |
| 1233 // GCC requires these declarations, but MSVC requires they not be present | |
| 1234 #ifndef COMPILER_MSVC | |
| 1235 const GLuint ProgramManagerWithCacheTest::kClientProgramId; | |
| 1236 const GLuint ProgramManagerWithCacheTest::kServiceProgramId; | |
| 1237 const GLuint ProgramManagerWithCacheTest::kVertexShaderClientId; | |
| 1238 const GLuint ProgramManagerWithCacheTest::kFragmentShaderClientId; | |
| 1239 const GLuint ProgramManagerWithCacheTest::kVertexShaderServiceId; | |
| 1240 const GLuint ProgramManagerWithCacheTest::kFragmentShaderServiceId; | |
| 1241 #endif | |
| 1242 | |
| 1243 TEST_F(ProgramManagerWithCacheTest, CacheSuccessAfterShaderCompile) { | |
| 1244 SetExpectationsForSuccessCompile(vertex_shader_); | |
| 1245 FeatureInfo::Ref info(new FeatureInfo()); | |
| 1246 manager_.DoCompileShader(vertex_shader_, NULL, info.get()); | |
| 1247 EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED, | |
| 1248 cache_->GetShaderCompilationStatus(*vertex_shader_->source())); | |
| 1249 } | |
| 1250 | |
| 1251 TEST_F(ProgramManagerWithCacheTest, CacheUnknownAfterShaderError) { | |
| 1252 SetExpectationsForErrorCompile(vertex_shader_); | |
| 1253 FeatureInfo::Ref info(new FeatureInfo()); | |
| 1254 manager_.DoCompileShader(vertex_shader_, NULL, info.get()); | |
| 1255 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 1256 cache_->GetShaderCompilationStatus(*vertex_shader_->source())); | |
| 1257 } | |
| 1258 | |
| 1259 TEST_F(ProgramManagerWithCacheTest, NoCompileWhenShaderCached) { | |
| 1260 cache_->ShaderCompilationSucceeded(vertex_shader_->source()->c_str()); | |
| 1261 SetExpectationsForNoCompile(vertex_shader_); | |
| 1262 FeatureInfo::Ref info(new FeatureInfo()); | |
| 1263 manager_.DoCompileShader(vertex_shader_, NULL, info.get()); | |
| 1264 } | |
| 1265 | |
| 1266 TEST_F(ProgramManagerWithCacheTest, CacheProgramOnSuccessfulLink) { | |
| 1267 SetShadersCompiled(); | |
| 1268 SetExpectationsForProgramLink(); | |
| 1269 SetExpectationsForProgramCached(); | |
| 1270 EXPECT_TRUE(program_info_->Link(NULL, NULL, NULL, NULL)); | |
| 1271 } | |
| 1272 | |
| 1273 TEST_F(ProgramManagerWithCacheTest, CompileShaderOnLinkCacheMiss) { | |
| 1274 SetShadersCompiled(); | |
| 1275 vertex_shader_->set_pending_compilation(true); | |
| 1276 | |
| 1277 FeatureInfo::Ref info(new FeatureInfo()); | |
| 1278 | |
| 1279 SetExpectationsForSuccessCompile(vertex_shader_); | |
| 1280 EXPECT_CALL(*gl_.get(), | |
| 1281 AttachShader(kServiceProgramId, kVertexShaderServiceId)).Times(1); | |
| 1282 SetExpectationsForProgramLink(); | |
| 1283 SetExpectationsForProgramCached(); | |
| 1284 EXPECT_TRUE(program_info_->Link(&shader_manager_, NULL, NULL, info.get())); | |
| 1285 } | |
| 1286 | |
| 1287 TEST_F(ProgramManagerWithCacheTest, LoadProgramOnProgramCacheHit) { | |
| 1288 SetShadersCached(); | |
| 1289 SetProgramCached(); | |
| 1290 SetExpectationsForNoCompile(vertex_shader_); | |
| 1291 SetExpectationsForNoCompile(fragment_shader_); | |
| 1292 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_SUCCESS); | |
| 1293 SetExpectationsForNotCachingProgram(); | |
| 1294 SetExpectationsForProgramLoadSuccess(); | |
| 1295 | |
| 1296 EXPECT_TRUE(program_info_->Link(NULL, NULL, NULL, NULL)); | |
| 1297 } | |
| 1298 | |
| 1299 TEST_F(ProgramManagerWithCacheTest, CompileAndLinkOnProgramCacheError) { | |
| 1300 SetShadersCached(); | |
| 1301 SetProgramCached(); | |
| 1302 | |
| 1303 SetExpectationsForSuccessCompile(vertex_shader_); | |
| 1304 EXPECT_CALL(*gl_.get(), | |
| 1305 AttachShader(kServiceProgramId, kVertexShaderServiceId)).Times(1); | |
| 1306 SetExpectationsForSuccessCompile(fragment_shader_); | |
| 1307 EXPECT_CALL(*gl_.get(), | |
| 1308 AttachShader(kServiceProgramId, | |
| 1309 kFragmentShaderServiceId)).Times(1); | |
| 1310 SetExpectationsForProgramLink(); | |
| 1311 SetExpectationsForProgramCached(); | |
| 1312 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_FAILURE); | |
| 1313 | |
| 1314 FeatureInfo::Ref info(new FeatureInfo()); | |
| 1315 EXPECT_TRUE(program_info_->Link(&shader_manager_, NULL, NULL, info.get())); | |
| 1316 } | |
| 1317 | |
| 1082 } // namespace gles2 | 1318 } // namespace gles2 |
| 1083 } // namespace gpu | 1319 } // namespace gpu |
| 1084 | |
| 1085 | |
| OLD | NEW |