Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: gpu/command_buffer/service/program_manager_unittest.cc

Issue 10534173: GPU Program Caching (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Style fixes, thorough tests Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698