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

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: tiny fix for android and windows build 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) {
greggman 2012/07/16 19:41:24 style: one space between : and manager_
dmurph 2012/07/17 18:17:13 Done.
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 = 1;
1086 static const GLuint kServiceProgramId = 10;
1087 static const GLuint kVertexShaderClientId = 2;
1088 static const GLuint kFragmentShaderClientId = 20;
1089 static const GLuint kVertexShaderServiceId = 3;
1090 static const GLuint kFragmentShaderServiceId = 30;
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);
greggman 2012/07/16 19:41:24 style: indenting
dmurph 2012/07/17 18:17:13 Done.
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 cache_->ShaderCompilationSucceeded(*vertex_shader_->source());
1132 cache_->ShaderCompilationSucceeded(*fragment_shader_->source());
1133 vertex_shader_->SetStatus(true, NULL, NULL);
1134 fragment_shader_->SetStatus(true, NULL, NULL);
1135 }
1136
1137 void SetShadersCached() {
1138 SetShadersCompiled();
1139 vertex_shader_->SetSourceAsCompiled(true);
1140 fragment_shader_->SetSourceAsCompiled(true);
1141 }
1142
1143 void SetProgramCached() {
1144 cache_->LinkedProgramCacheSuccess(
1145 vertex_shader_->source()->c_str(),
1146 fragment_shader_->source()->c_str(),
1147 &program_info_->bind_attrib_location_map());
1148 }
1149
1150 void SetExpectationsForProgramCached() {
1151 SetExpectationsForProgramCached(program_info_,
1152 vertex_shader_,
1153 fragment_shader_);
1154 }
1155
1156 void SetExpectationsForProgramCached(
1157 ProgramManager::ProgramInfo* program_info,
1158 ShaderManager::ShaderInfo* vertex_shader,
1159 ShaderManager::ShaderInfo* fragment_shader) {
1160 EXPECT_CALL(*cache_.get(), SaveLinkedProgram(
1161 program_info->service_id(),
1162 vertex_shader,
1163 fragment_shader,
1164 &program_info->bind_attrib_location_map())).Times(1);
1165 }
1166
1167 void SetExpectationsForNotCachingProgram() {
1168 SetExpectationsForNotCachingProgram(program_info_,
1169 vertex_shader_,
1170 fragment_shader_);
1171 }
1172
1173 void SetExpectationsForNotCachingProgram(
1174 ProgramManager::ProgramInfo* program_info,
1175 ShaderManager::ShaderInfo* vertex_shader,
1176 ShaderManager::ShaderInfo* fragment_shader) {
1177 EXPECT_CALL(*cache_.get(), SaveLinkedProgram(
1178 program_info->service_id(),
1179 vertex_shader,
1180 fragment_shader,
1181 &program_info->bind_attrib_location_map())).Times(0);
1182 }
1183
1184 void SetExpectationsForProgramLoad(ProgramCache::ProgramLoadResult result) {
1185 SetExpectationsForProgramLoad(kServiceProgramId,
1186 program_info_,
1187 vertex_shader_,
1188 fragment_shader_,
1189 result);
1190 }
1191
1192 void SetExpectationsForProgramLoad(
1193 GLuint service_program_id,
1194 ProgramManager::ProgramInfo* program_info,
1195 ShaderManager::ShaderInfo* vertex_shader,
1196 ShaderManager::ShaderInfo* fragment_shader,
1197 ProgramCache::ProgramLoadResult result) {
1198 EXPECT_CALL(*cache_.get(),
1199 LoadLinkedProgram(service_program_id,
1200 vertex_shader,
1201 fragment_shader,
1202 &program_info->bind_attrib_location_map()))
1203 .WillOnce(Return(result));
1204 }
1205
1206 void SetExpectationsForProgramLoadSuccess() {
1207 SetExpectationsForProgramLoadSuccess(kServiceProgramId);
1208 }
1209
1210 void SetExpectationsForProgramLoadSuccess(GLuint service_program_id) {
1211 TestHelper::SetupProgramSuccessExpectations(gl_.get(),
1212 NULL,
1213 0,
1214 NULL,
1215 0,
1216 service_program_id);
1217 }
1218
1219 void SetExpectationsForProgramLink() {
1220 SetExpectationsForProgramLink(kServiceProgramId);
1221 }
1222
1223 void SetExpectationsForProgramLink(GLuint service_program_id) {
1224 TestHelper::SetupShader(gl_.get(), NULL, 0, NULL, 0, service_program_id);
1225 }
1226
1227 void SetExpectationsForSuccessCompile(
1228 const ShaderManager::ShaderInfo* shader) {
1229 const GLuint shader_id = shader->service_id();
1230 const char* src = shader->source()->c_str();
1231 EXPECT_CALL(*gl_.get(),
1232 ShaderSource(shader_id, 1, Pointee(src), NULL)).Times(1);
1233 EXPECT_CALL(*gl_.get(), CompileShader(shader_id)).Times(1);
1234 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_COMPILE_STATUS, _))
1235 .WillOnce(SetArgumentPointee<2>(GL_TRUE));
1236 }
1237
1238 void SetExpectationsForNoCompile(const ShaderManager::ShaderInfo* shader) {
1239 const GLuint shader_id = shader->service_id();
1240 const char* src = shader->source()->c_str();
1241 EXPECT_CALL(*gl_.get(),
1242 ShaderSource(shader_id, 1, Pointee(src), NULL)).Times(0);
1243 EXPECT_CALL(*gl_.get(), CompileShader(shader_id)).Times(0);
1244 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_COMPILE_STATUS, _))
1245 .Times(0);
1246 }
1247
1248 void SetExpectationsForErrorCompile(const ShaderManager::ShaderInfo* shader) {
1249 const GLuint shader_id = shader->service_id();
1250 const char* src = shader->source()->c_str();
1251 EXPECT_CALL(*gl_.get(),
1252 ShaderSource(shader_id, 1, Pointee(src), NULL)).Times(1);
1253 EXPECT_CALL(*gl_.get(), CompileShader(shader_id)).Times(1);
1254 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_COMPILE_STATUS, _))
1255 .WillOnce(SetArgumentPointee<2>(GL_FALSE));
1256 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_INFO_LOG_LENGTH, _))
1257 .WillOnce(SetArgumentPointee<2>(0));
1258 EXPECT_CALL(*gl_.get(), GetShaderInfoLog(shader_id, 0, _, _))
1259 .Times(1);
1260 }
1261
1262 scoped_ptr<StrictMock<gfx::MockGLInterface> > gl_;
1263
1264 scoped_ptr<MockProgramCache> cache_;
1265 ProgramManager manager_;
1266
1267 ShaderManager::ShaderInfo* vertex_shader_;
1268 ShaderManager::ShaderInfo* fragment_shader_;
1269 ProgramManager::ProgramInfo* program_info_;
1270 ShaderManager shader_manager_;
1271 };
1272
1273 // GCC requires these declarations, but MSVC requires they not be present
1274 #ifndef COMPILER_MSVC
1275 const GLuint ProgramManagerWithCacheTest::kClientProgramId;
1276 const GLuint ProgramManagerWithCacheTest::kServiceProgramId;
1277 const GLuint ProgramManagerWithCacheTest::kVertexShaderClientId;
1278 const GLuint ProgramManagerWithCacheTest::kFragmentShaderClientId;
1279 const GLuint ProgramManagerWithCacheTest::kVertexShaderServiceId;
1280 const GLuint ProgramManagerWithCacheTest::kFragmentShaderServiceId;
1281 #endif
1282
1283 TEST_F(ProgramManagerWithCacheTest, CacheSuccessAfterShaderCompile) {
1284 SetExpectationsForSuccessCompile(vertex_shader_);
1285 FeatureInfo::Ref info(new FeatureInfo());
1286 manager_.DoCompileShader(vertex_shader_, NULL, info.get());
1287 EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED,
1288 cache_->GetShaderCompilationStatus(*vertex_shader_->source()));
1289 }
1290
1291 TEST_F(ProgramManagerWithCacheTest, CacheUnknownAfterShaderError) {
1292 SetExpectationsForErrorCompile(vertex_shader_);
1293 FeatureInfo::Ref info(new FeatureInfo());
1294 manager_.DoCompileShader(vertex_shader_, NULL, info.get());
1295 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
1296 cache_->GetShaderCompilationStatus(*vertex_shader_->source()));
1297 }
1298
1299 TEST_F(ProgramManagerWithCacheTest, NoCompileWhenShaderCached) {
1300 cache_->ShaderCompilationSucceeded(vertex_shader_->source()->c_str());
1301 SetExpectationsForNoCompile(vertex_shader_);
1302 FeatureInfo::Ref info(new FeatureInfo());
1303 manager_.DoCompileShader(vertex_shader_, NULL, info.get());
1304 }
1305
1306 TEST_F(ProgramManagerWithCacheTest, CacheProgramOnSuccessfulLink) {
1307 SetShadersCompiled();
1308 SetExpectationsForProgramLink();
1309 SetExpectationsForProgramCached();
1310 EXPECT_TRUE(program_info_->Link(NULL, NULL, NULL, NULL));
1311 }
1312
1313 TEST_F(ProgramManagerWithCacheTest, CompileShaderOnLinkCacheMiss) {
1314 SetShadersCompiled();
1315 vertex_shader_->SetSourceAsCompiled(true);
1316
1317 FeatureInfo::Ref info(new FeatureInfo());
1318
1319 SetExpectationsForSuccessCompile(vertex_shader_);
1320 SetExpectationsForProgramLink();
1321 SetExpectationsForProgramCached();
1322 EXPECT_TRUE(program_info_->Link(&shader_manager_, NULL, NULL, info.get()));
1323 }
1324
1325 TEST_F(ProgramManagerWithCacheTest, LoadProgramOnProgramCacheHit) {
1326 SetShadersCached();
1327 SetProgramCached();
1328
1329 SetExpectationsForNoCompile(vertex_shader_);
1330 SetExpectationsForNoCompile(fragment_shader_);
1331 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_SUCCESS);
1332 SetExpectationsForNotCachingProgram();
1333 SetExpectationsForProgramLoadSuccess();
1334
1335 EXPECT_TRUE(program_info_->Link(NULL, NULL, NULL, NULL));
1336 }
1337
1338 TEST_F(ProgramManagerWithCacheTest, CompileAndLinkOnProgramCacheError) {
1339 SetShadersCached();
1340 SetProgramCached();
1341
1342 SetExpectationsForSuccessCompile(vertex_shader_);
1343 SetExpectationsForSuccessCompile(fragment_shader_);
1344 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_FAILURE);
1345 SetExpectationsForProgramLink();
1346 SetExpectationsForProgramCached();
1347
1348 FeatureInfo::Ref info(new FeatureInfo());
1349 EXPECT_TRUE(program_info_->Link(&shader_manager_, NULL, NULL, info.get()));
1350 }
1351
1352 TEST_F(ProgramManagerWithCacheTest, CorrectCompileOnSourceChangeNoCompile) {
1353 SetShadersCached();
1354 SetProgramCached();
1355
1356 const GLuint kNewShaderClientId = 4;
1357 const GLuint kNewShaderServiceId = 40;
1358 const GLuint kNewProgramClientId = 5;
1359 const GLuint kNewProgramServiceId = 50;
1360
1361 ShaderManager::ShaderInfo* new_vertex_shader =
1362 shader_manager_.CreateShaderInfo(kNewShaderClientId,
1363 kNewShaderServiceId,
1364 GL_VERTEX_SHADER);
1365
1366 const std::string* originalSource = vertex_shader_->source();
greggman 2012/07/16 21:57:26 style: variables are under_score Also, doesn't Upd
dmurph 2012/07/17 18:17:13 If vertex_shader_ is updated and compiled, then ye
1367 new_vertex_shader->UpdateSource(originalSource->c_str());
1368
1369 ProgramManager::ProgramInfo* program_info = manager_.CreateProgramInfo(
1370 kNewProgramClientId, kNewProgramServiceId);
1371 ASSERT_TRUE(program_info != NULL);
1372 program_info->AttachShader(&shader_manager_, new_vertex_shader);
1373 program_info->AttachShader(&shader_manager_, fragment_shader_);
1374
1375 SetExpectationsForNoCompile(new_vertex_shader);
1376
1377 manager_.DoCompileShader(new_vertex_shader, NULL, NULL);
1378
1379 new_vertex_shader->UpdateSource("different!");
1380 EXPECT_EQ(*originalSource,
1381 *new_vertex_shader->compilation_source());
1382
1383 EXPECT_EQ(true, new_vertex_shader->pending_compilation());
1384 EXPECT_EQ(true, fragment_shader_->pending_compilation());
1385
1386 SetExpectationsForNoCompile(fragment_shader_);
1387 SetExpectationsForNotCachingProgram(program_info,
1388 new_vertex_shader,
1389 fragment_shader_);
1390 SetExpectationsForProgramLoad(kNewProgramServiceId,
1391 program_info,
1392 new_vertex_shader,
1393 fragment_shader_,
1394 ProgramCache::PROGRAM_LOAD_SUCCESS);
1395 SetExpectationsForProgramLoadSuccess(kNewProgramServiceId);
1396
1397 FeatureInfo::Ref info(new FeatureInfo());
1398 EXPECT_TRUE(program_info->Link(&shader_manager_, NULL, NULL, info.get()));
1399 }
1400
1401 TEST_F(ProgramManagerWithCacheTest, CorrectCompileOnSourceChangeWithCompile) {
1402 SetShadersCached();
1403 SetProgramCached();
1404
1405 const GLuint kNewShaderClientId = 4;
1406 const GLuint kNewShaderServiceId = 40;
1407 const GLuint kNewProgramClientId = 5;
1408 const GLuint kNewProgramServiceId = 50;
1409
1410 ShaderManager::ShaderInfo* new_vertex_shader =
1411 shader_manager_.CreateShaderInfo(kNewShaderClientId,
1412 kNewShaderServiceId,
1413 GL_VERTEX_SHADER);
1414
1415 new_vertex_shader->UpdateSource(vertex_shader_->source()->c_str());
1416
1417 ProgramManager::ProgramInfo* program_info = manager_.CreateProgramInfo(
1418 kNewProgramClientId, kNewProgramServiceId);
1419 ASSERT_TRUE(program_info != NULL);
1420 program_info->AttachShader(&shader_manager_, new_vertex_shader);
1421 program_info->AttachShader(&shader_manager_, fragment_shader_);
1422
1423 SetExpectationsForNoCompile(new_vertex_shader);
1424
1425 manager_.DoCompileShader(new_vertex_shader, NULL, NULL);
1426
1427 const std::string differentSource = "different!";
1428 new_vertex_shader->UpdateSource(differentSource.c_str());
1429 SetExpectationsForSuccessCompile(new_vertex_shader);
1430
1431 FeatureInfo::Ref info(new FeatureInfo());
1432 manager_.DoCompileShader(new_vertex_shader, NULL, info.get());
1433 EXPECT_EQ(differentSource,
1434 *new_vertex_shader->compilation_source());
1435
1436 EXPECT_EQ(false, new_vertex_shader->pending_compilation());
1437 EXPECT_EQ(true, fragment_shader_->pending_compilation());
1438
1439 // so we don't recompile because we were pending originally
1440 SetExpectationsForNoCompile(new_vertex_shader);
1441 SetExpectationsForSuccessCompile(fragment_shader_);
1442 SetExpectationsForProgramCached(program_info,
1443 new_vertex_shader,
1444 fragment_shader_);
1445 SetExpectationsForProgramLink(kNewProgramServiceId);
1446
1447 EXPECT_TRUE(program_info->Link(&shader_manager_, NULL, NULL, info.get()));
1448 }
1449
1082 } // namespace gles2 1450 } // namespace gles2
1083 } // namespace gpu 1451 } // namespace gpu
1084
1085
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698