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

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

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 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/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 ASSERT_TRUE(fragment_shader != NULL); 235 ASSERT_TRUE(fragment_shader != NULL);
236 TestHelper::SetShaderStates(gl_.get(), vertex_shader, true); 236 TestHelper::SetShaderStates(gl_.get(), vertex_shader, true);
237 TestHelper::SetShaderStates(gl_.get(), fragment_shader, true); 237 TestHelper::SetShaderStates(gl_.get(), fragment_shader, true);
238 238
239 program_ = manager_.CreateProgram( 239 program_ = manager_.CreateProgram(
240 kClientProgramId, kServiceProgramId); 240 kClientProgramId, kServiceProgramId);
241 ASSERT_TRUE(program_ != NULL); 241 ASSERT_TRUE(program_ != NULL);
242 242
243 program_->AttachShader(&shader_manager_, vertex_shader); 243 program_->AttachShader(&shader_manager_, vertex_shader);
244 program_->AttachShader(&shader_manager_, fragment_shader); 244 program_->AttachShader(&shader_manager_, fragment_shader);
245 program_->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed, 245 program_->Link(NULL, Program::kCountOnlyStaticallyUsed,
246 base::Bind(&ShaderCacheCb)); 246 base::Bind(&ShaderCacheCb));
247 } 247 }
248 248
249 void SetupShader(AttribInfo* attribs, size_t num_attribs, 249 void SetupShader(AttribInfo* attribs, size_t num_attribs,
250 UniformInfo* uniforms, size_t num_uniforms, 250 UniformInfo* uniforms, size_t num_uniforms,
251 GLuint service_id) { 251 GLuint service_id) {
252 TestHelper::SetupShader( 252 TestHelper::SetupShader(
253 gl_.get(), attribs, num_attribs, uniforms, num_uniforms, service_id); 253 gl_.get(), attribs, num_attribs, uniforms, num_uniforms, service_id);
254 } 254 }
255 255
256 void SetupDefaultShaderExpectations() { 256 void SetupDefaultShaderExpectations() {
257 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, 257 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms,
258 kServiceProgramId); 258 kServiceProgramId);
259 } 259 }
260 260
261 void SetupExpectationsForClearingUniforms( 261 void SetupExpectationsForClearingUniforms(
262 UniformInfo* uniforms, size_t num_uniforms) { 262 UniformInfo* uniforms, size_t num_uniforms) {
263 TestHelper::SetupExpectationsForClearingUniforms( 263 TestHelper::SetupExpectationsForClearingUniforms(
264 gl_.get(), uniforms, num_uniforms); 264 gl_.get(), uniforms, num_uniforms);
265 } 265 }
266 266
267 // Return true if link status matches expected_link_status 267 // Return true if link status matches expected_link_status
268 bool LinkAsExpected(Program* program, 268 bool LinkAsExpected(Program* program,
269 bool expected_link_status) { 269 bool expected_link_status) {
270 GLuint service_id = program->service_id(); 270 GLuint service_id = program->service_id();
271 if (expected_link_status) { 271 if (expected_link_status) {
272 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, 272 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms,
273 service_id); 273 service_id);
274 } 274 }
275 program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed, 275 program->Link(NULL, Program::kCountOnlyStaticallyUsed,
276 base::Bind(&ShaderCacheCb)); 276 base::Bind(&ShaderCacheCb));
277 GLint link_status; 277 GLint link_status;
278 program->GetProgramiv(GL_LINK_STATUS, &link_status); 278 program->GetProgramiv(GL_LINK_STATUS, &link_status);
279 return (static_cast<bool>(link_status) == expected_link_status); 279 return (static_cast<bool>(link_status) == expected_link_status);
280 } 280 }
281 281
282 Program* SetupShaderVariableTest(const VarInfo* vertex_variables, 282 Program* SetupShaderVariableTest(const VarInfo* vertex_variables,
283 size_t vertex_variable_size, 283 size_t vertex_variable_size,
284 const VarInfo* fragment_variables, 284 const VarInfo* fragment_variables,
285 size_t fragment_variable_size) { 285 size_t fragment_variable_size) {
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 TestHelper::SetShaderStates(gl_.get(), vshader, true); 708 TestHelper::SetShaderStates(gl_.get(), vshader, true);
709 Shader* fshader = shader_manager_.CreateShader( 709 Shader* fshader = shader_manager_.CreateShader(
710 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); 710 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER);
711 ASSERT_TRUE(fshader != NULL); 711 ASSERT_TRUE(fshader != NULL);
712 TestHelper::SetShaderStates(gl_.get(), fshader, true); 712 TestHelper::SetShaderStates(gl_.get(), fshader, true);
713 Program* program = 713 Program* program =
714 manager_.CreateProgram(kClientProgramId, kServiceProgramId); 714 manager_.CreateProgram(kClientProgramId, kServiceProgramId);
715 ASSERT_TRUE(program != NULL); 715 ASSERT_TRUE(program != NULL);
716 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 716 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
717 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 717 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
718 program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed, 718 program->Link(NULL, Program::kCountOnlyStaticallyUsed,
719 base::Bind(&ShaderCacheCb)); 719 base::Bind(&ShaderCacheCb));
720 GLint value = 0; 720 GLint value = 0;
721 program->GetProgramiv(GL_ACTIVE_ATTRIBUTES, &value); 721 program->GetProgramiv(GL_ACTIVE_ATTRIBUTES, &value);
722 EXPECT_EQ(3, value); 722 EXPECT_EQ(3, value);
723 // Check that we skipped the "gl_" uniform. 723 // Check that we skipped the "gl_" uniform.
724 program->GetProgramiv(GL_ACTIVE_UNIFORMS, &value); 724 program->GetProgramiv(GL_ACTIVE_UNIFORMS, &value);
725 EXPECT_EQ(2, value); 725 EXPECT_EQ(2, value);
726 // Check that our max length adds room for the array spec and is not as long 726 // Check that our max length adds room for the array spec and is not as long
727 // as the "gl_" uniform we skipped. 727 // as the "gl_" uniform we skipped.
728 // +4u is to account for "gl_" and NULL terminator. 728 // +4u is to account for "gl_" and NULL terminator.
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 TestHelper::SetShaderStates(gl_.get(), vshader, true); 777 TestHelper::SetShaderStates(gl_.get(), vshader, true);
778 Shader* fshader = shader_manager_.CreateShader( 778 Shader* fshader = shader_manager_.CreateShader(
779 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); 779 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER);
780 ASSERT_TRUE(fshader != NULL); 780 ASSERT_TRUE(fshader != NULL);
781 TestHelper::SetShaderStates(gl_.get(), fshader, true); 781 TestHelper::SetShaderStates(gl_.get(), fshader, true);
782 Program* program = 782 Program* program =
783 manager_.CreateProgram(kClientProgramId, kServiceProgramId); 783 manager_.CreateProgram(kClientProgramId, kServiceProgramId);
784 ASSERT_TRUE(program != NULL); 784 ASSERT_TRUE(program != NULL);
785 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 785 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
786 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 786 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
787 program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed, 787 program->Link(NULL, Program::kCountOnlyStaticallyUsed,
788 base::Bind(&ShaderCacheCb)); 788 base::Bind(&ShaderCacheCb));
789 789
790 // Check that we get the correct locations. 790 // Check that we get the correct locations.
791 EXPECT_EQ(kUniform2FakeLocation, 791 EXPECT_EQ(kUniform2FakeLocation,
792 program->GetUniformFakeLocation(kUniform2Name)); 792 program->GetUniformFakeLocation(kUniform2Name));
793 EXPECT_EQ(kUniform3FakeLocation, 793 EXPECT_EQ(kUniform3FakeLocation,
794 program->GetUniformFakeLocation(kUniform3Name)); 794 program->GetUniformFakeLocation(kUniform3Name));
795 } 795 }
796 796
797 // Some GL drivers incorrectly return the wrong type. For example they return 797 // Some GL drivers incorrectly return the wrong type. For example they return
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 const size_t kNumUniforms = arraysize(kUniforms); 873 const size_t kNumUniforms = arraysize(kUniforms);
874 static const GLuint kClientProgramId = 1234; 874 static const GLuint kClientProgramId = 1234;
875 static const GLuint kServiceProgramId = 5679; 875 static const GLuint kServiceProgramId = 5679;
876 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, 876 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms,
877 kServiceProgramId); 877 kServiceProgramId);
878 Program* program = manager_.CreateProgram( 878 Program* program = manager_.CreateProgram(
879 kClientProgramId, kServiceProgramId); 879 kClientProgramId, kServiceProgramId);
880 ASSERT_TRUE(program!= NULL); 880 ASSERT_TRUE(program!= NULL);
881 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 881 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
882 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 882 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
883 program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed, 883 program->Link(NULL, Program::kCountOnlyStaticallyUsed,
884 base::Bind(&ShaderCacheCb)); 884 base::Bind(&ShaderCacheCb));
885 // Check that we got the good type, not the bad. 885 // Check that we got the good type, not the bad.
886 // Check Attribs 886 // Check Attribs
887 for (unsigned index = 0; index < kNumAttribs; ++index) { 887 for (unsigned index = 0; index < kNumAttribs; ++index) {
888 const Program::VertexAttrib* attrib_info = 888 const Program::VertexAttrib* attrib_info =
889 program->GetAttribInfo(index); 889 program->GetAttribInfo(index);
890 ASSERT_TRUE(attrib_info != NULL); 890 ASSERT_TRUE(attrib_info != NULL);
891 size_t pos = attrib_info->name.find_first_of("[."); 891 size_t pos = attrib_info->name.find_first_of("[.");
892 std::string top_name; 892 std::string top_name;
893 if (pos == std::string::npos) 893 if (pos == std::string::npos)
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
1220 kIndices[ii], kIndices[ii] + data.entry[ii].active_uniforms)) 1220 kIndices[ii], kIndices[ii] + data.entry[ii].active_uniforms))
1221 .RetiresOnSaturation(); 1221 .RetiresOnSaturation();
1222 } 1222 }
1223 program->GetUniformBlocks(&bucket); 1223 program->GetUniformBlocks(&bucket);
1224 EXPECT_EQ(sizeof(Data), bucket.size()); 1224 EXPECT_EQ(sizeof(Data), bucket.size());
1225 Data* bucket_data = bucket.GetDataAs<Data*>(0, sizeof(Data)); 1225 Data* bucket_data = bucket.GetDataAs<Data*>(0, sizeof(Data));
1226 EXPECT_TRUE(bucket_data != NULL); 1226 EXPECT_TRUE(bucket_data != NULL);
1227 EXPECT_EQ(0, memcmp(&data, bucket_data, sizeof(Data))); 1227 EXPECT_EQ(0, memcmp(&data, bucket_data, sizeof(Data)));
1228 } 1228 }
1229 1229
1230 TEST_F(ProgramManagerWithShaderTest,
1231 ProgramInfoGetTransformFeedbackVaryingsNone) {
1232 CommonDecoder::Bucket bucket;
1233 const Program* program = manager_.GetProgram(kClientProgramId);
1234 ASSERT_TRUE(program != NULL);
1235 // The program's previous link failed.
1236 EXPECT_CALL(*(gl_.get()),
1237 GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
1238 .WillOnce(SetArgPointee<2>(GL_FALSE))
1239 .RetiresOnSaturation();
1240 EXPECT_TRUE(program->GetTransformFeedbackVaryings(&bucket));
1241 EXPECT_EQ(sizeof(TransformFeedbackVaryingsHeader), bucket.size());
1242 TransformFeedbackVaryingsHeader* header =
1243 bucket.GetDataAs<TransformFeedbackVaryingsHeader*>(
1244 0, sizeof(TransformFeedbackVaryingsHeader));
1245 EXPECT_TRUE(header != NULL);
1246 EXPECT_EQ(0u, header->num_transform_feedback_varyings);
1247 // Zero uniform blocks.
1248 EXPECT_CALL(*(gl_.get()),
1249 GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
1250 .WillOnce(SetArgPointee<2>(GL_TRUE))
1251 .RetiresOnSaturation();
1252 EXPECT_CALL(*(gl_.get()),
1253 GetProgramiv(
1254 kServiceProgramId, GL_TRANSFORM_FEEDBACK_VARYINGS, _))
1255 .WillOnce(SetArgPointee<2>(0))
1256 .RetiresOnSaturation();
1257 EXPECT_TRUE(program->GetTransformFeedbackVaryings(&bucket));
1258 EXPECT_EQ(sizeof(TransformFeedbackVaryingsHeader), bucket.size());
1259 header = bucket.GetDataAs<TransformFeedbackVaryingsHeader*>(
1260 0, sizeof(TransformFeedbackVaryingsHeader));
1261 EXPECT_TRUE(header != NULL);
1262 EXPECT_EQ(0u, header->num_transform_feedback_varyings);
1263 }
1264
1265 TEST_F(ProgramManagerWithShaderTest,
1266 ProgramInfoGetTransformFeedbackVaryingsValid) {
1267 CommonDecoder::Bucket bucket;
1268 const Program* program = manager_.GetProgram(kClientProgramId);
1269 ASSERT_TRUE(program != NULL);
1270 struct Data {
1271 TransformFeedbackVaryingsHeader header;
1272 TransformFeedbackVaryingInfo entry[2];
1273 char name0[4];
1274 char name1[8];
1275 };
1276 Data data;
1277 // The names needs to be of size 4*k-1 to avoid padding in the struct Data.
1278 // This is a testing only problem.
1279 const char* kName[] = { "cow", "chicken" };
1280 data.header.num_transform_feedback_varyings = 2;
1281 data.entry[0].size = 1;
1282 data.entry[0].type = GL_FLOAT_VEC2;
1283 data.entry[0].name_offset = ComputeOffset(&data, data.name0);
1284 data.entry[0].name_length = arraysize(data.name0);
1285 data.entry[1].size = 2;
1286 data.entry[1].type = GL_FLOAT;
1287 data.entry[1].name_offset = ComputeOffset(&data, data.name1);
1288 data.entry[1].name_length = arraysize(data.name1);
1289 memcpy(data.name0, kName[0], arraysize(data.name0));
1290 memcpy(data.name1, kName[1], arraysize(data.name1));
1291
1292 EXPECT_CALL(*(gl_.get()),
1293 GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
1294 .WillOnce(SetArgPointee<2>(GL_TRUE))
1295 .RetiresOnSaturation();
1296 EXPECT_CALL(*(gl_.get()),
1297 GetProgramiv(
1298 kServiceProgramId, GL_TRANSFORM_FEEDBACK_VARYINGS, _))
1299 .WillOnce(SetArgPointee<2>(data.header.num_transform_feedback_varyings))
1300 .RetiresOnSaturation();
1301 GLsizei max_length = 1 + std::max(strlen(kName[0]), strlen(kName[1]));
1302 EXPECT_CALL(*(gl_.get()),
1303 GetProgramiv(kServiceProgramId,
1304 GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, _))
1305 .WillOnce(SetArgPointee<2>(max_length))
1306 .RetiresOnSaturation();
1307 for (uint32_t ii = 0; ii < data.header.num_transform_feedback_varyings;
1308 ++ii) {
1309 EXPECT_CALL(*(gl_.get()),
1310 GetTransformFeedbackVarying(
1311 kServiceProgramId, ii, max_length, _, _, _, _))
1312 .WillOnce(DoAll(
1313 SetArgPointee<3>(data.entry[ii].name_length - 1),
1314 SetArgPointee<4>(data.entry[ii].size),
1315 SetArgPointee<5>(data.entry[ii].type),
1316 SetArrayArgument<6>(
1317 kName[ii], kName[ii] + data.entry[ii].name_length)))
1318 .RetiresOnSaturation();
1319 }
1320 program->GetTransformFeedbackVaryings(&bucket);
1321 EXPECT_EQ(sizeof(Data), bucket.size());
1322 Data* bucket_data = bucket.GetDataAs<Data*>(0, sizeof(Data));
1323 EXPECT_TRUE(bucket_data != NULL);
1324 EXPECT_EQ(0, memcmp(&data, bucket_data, sizeof(Data)));
1325 }
1326
1327 TEST_F(ProgramManagerWithShaderTest, ProgramInfoGetUniformsES3None) {
1328 CommonDecoder::Bucket bucket;
1329 const Program* program = manager_.GetProgram(kClientProgramId);
1330 ASSERT_TRUE(program != NULL);
1331 // The program's previous link failed.
1332 EXPECT_CALL(*(gl_.get()),
1333 GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
1334 .WillOnce(SetArgPointee<2>(GL_FALSE))
1335 .RetiresOnSaturation();
1336 EXPECT_TRUE(program->GetUniformsES3(&bucket));
1337 EXPECT_EQ(sizeof(UniformsES3Header), bucket.size());
1338 UniformsES3Header* header =
1339 bucket.GetDataAs<UniformsES3Header*>(0, sizeof(UniformsES3Header));
1340 EXPECT_TRUE(header != NULL);
1341 EXPECT_EQ(0u, header->num_uniforms);
1342 // Zero uniform blocks.
1343 EXPECT_CALL(*(gl_.get()),
1344 GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
1345 .WillOnce(SetArgPointee<2>(GL_TRUE))
1346 .RetiresOnSaturation();
1347 EXPECT_CALL(*(gl_.get()),
1348 GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORMS, _))
1349 .WillOnce(SetArgPointee<2>(0))
1350 .RetiresOnSaturation();
1351 EXPECT_TRUE(program->GetUniformsES3(&bucket));
1352 EXPECT_EQ(sizeof(UniformsES3Header), bucket.size());
1353 header =
1354 bucket.GetDataAs<UniformsES3Header*>(0, sizeof(UniformsES3Header));
1355 EXPECT_TRUE(header != NULL);
1356 EXPECT_EQ(0u, header->num_uniforms);
1357 }
1358
1359 TEST_F(ProgramManagerWithShaderTest, ProgramInfoGetUniformsES3Valid) {
1360 CommonDecoder::Bucket bucket;
1361 const Program* program = manager_.GetProgram(kClientProgramId);
1362 ASSERT_TRUE(program != NULL);
1363 struct Data {
1364 UniformsES3Header header;
1365 UniformES3Info entry[2];
1366 };
1367 Data data;
1368 const GLint kBlockIndex[] = { -1, 2 };
1369 const GLint kOffset[] = { 3, 4 };
1370 const GLint kArrayStride[] = { 7, 8 };
1371 const GLint kMatrixStride[] = { 9, 10 };
1372 const GLint kIsRowMajor[] = { 0, 1 };
1373 data.header.num_uniforms = 2;
1374 for (uint32_t ii = 0; ii < data.header.num_uniforms; ++ii) {
1375 data.entry[ii].block_index = kBlockIndex[ii];
1376 data.entry[ii].offset = kOffset[ii];
1377 data.entry[ii].array_stride = kArrayStride[ii];
1378 data.entry[ii].matrix_stride = kMatrixStride[ii];
1379 data.entry[ii].is_row_major = kIsRowMajor[ii];
1380 }
1381
1382 EXPECT_CALL(*(gl_.get()),
1383 GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
1384 .WillOnce(SetArgPointee<2>(GL_TRUE))
1385 .RetiresOnSaturation();
1386 EXPECT_CALL(*(gl_.get()),
1387 GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORMS, _))
1388 .WillOnce(SetArgPointee<2>(data.header.num_uniforms))
1389 .RetiresOnSaturation();
1390
1391 const GLenum kPname[] = {
1392 GL_UNIFORM_BLOCK_INDEX,
1393 GL_UNIFORM_OFFSET,
1394 GL_UNIFORM_ARRAY_STRIDE,
1395 GL_UNIFORM_MATRIX_STRIDE,
1396 GL_UNIFORM_IS_ROW_MAJOR,
1397 };
1398 const GLint* kParams[] = {
1399 kBlockIndex,
1400 kOffset,
1401 kArrayStride,
1402 kMatrixStride,
1403 kIsRowMajor,
1404 };
1405 const size_t kNumIterations = arraysize(kPname);
1406 for (size_t ii = 0; ii < kNumIterations; ++ii) {
1407 EXPECT_CALL(*(gl_.get()),
1408 GetActiveUniformsiv(
1409 kServiceProgramId, data.header.num_uniforms, _,
1410 kPname[ii], _))
1411 .WillOnce(SetArrayArgument<4>(
1412 kParams[ii], kParams[ii] + data.header.num_uniforms))
1413 .RetiresOnSaturation();
1414 }
1415
1416 program->GetUniformsES3(&bucket);
1417 EXPECT_EQ(sizeof(Data), bucket.size());
1418 Data* bucket_data = bucket.GetDataAs<Data*>(0, sizeof(Data));
1419 EXPECT_TRUE(bucket_data != NULL);
1420 EXPECT_EQ(0, memcmp(&data, bucket_data, sizeof(Data)));
1421 }
1422
1230 // Some drivers optimize out unused uniform array elements, so their 1423 // Some drivers optimize out unused uniform array elements, so their
1231 // location would be -1. 1424 // location would be -1.
1232 TEST_F(ProgramManagerWithShaderTest, UnusedUniformArrayElements) { 1425 TEST_F(ProgramManagerWithShaderTest, UnusedUniformArrayElements) {
1233 CommonDecoder::Bucket bucket; 1426 CommonDecoder::Bucket bucket;
1234 const Program* program = manager_.GetProgram(kClientProgramId); 1427 const Program* program = manager_.GetProgram(kClientProgramId);
1235 ASSERT_TRUE(program != NULL); 1428 ASSERT_TRUE(program != NULL);
1236 // Emulate the situation that only the first element has a valid location. 1429 // Emulate the situation that only the first element has a valid location.
1237 // TODO(zmo): Don't assume these are in order. 1430 // TODO(zmo): Don't assume these are in order.
1238 for (size_t ii = 0; ii < arraysize(kUniforms); ++ii) { 1431 for (size_t ii = 0; ii < arraysize(kUniforms); ++ii) {
1239 Program::UniformInfo* uniform = const_cast<Program::UniformInfo*>( 1432 Program::UniformInfo* uniform = const_cast<Program::UniformInfo*>(
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
1624 kUniform3FakeLocation, 1817 kUniform3FakeLocation,
1625 kUniform3RealLocation, 1818 kUniform3RealLocation,
1626 kUniform3DesiredLocation, 1819 kUniform3DesiredLocation,
1627 kUniform3NameWithArrayIndex, 1820 kUniform3NameWithArrayIndex,
1628 }, 1821 },
1629 }; 1822 };
1630 const size_t kNumAttribs = arraysize(kAttribs); 1823 const size_t kNumAttribs = arraysize(kAttribs);
1631 const size_t kNumUniforms = arraysize(kUniforms); 1824 const size_t kNumUniforms = arraysize(kUniforms);
1632 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, 1825 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms,
1633 kServiceProgramId); 1826 kServiceProgramId);
1634 program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed, 1827 program->Link(NULL, Program::kCountOnlyStaticallyUsed,
1635 base::Bind(&ShaderCacheCb)); 1828 base::Bind(&ShaderCacheCb));
1636 SetupExpectationsForClearingUniforms(kUniforms, kNumUniforms); 1829 SetupExpectationsForClearingUniforms(kUniforms, kNumUniforms);
1637 manager_.ClearUniforms(program); 1830 manager_.ClearUniforms(program);
1638 } 1831 }
1639 } 1832 }
1640 1833
1641 TEST_F(ProgramManagerWithShaderTest, BindUniformLocation) { 1834 TEST_F(ProgramManagerWithShaderTest, BindUniformLocation) {
1642 const GLuint kVShaderClientId = 2001; 1835 const GLuint kVShaderClientId = 2001;
1643 const GLuint kFShaderClientId = 2002; 1836 const GLuint kFShaderClientId = 2002;
1644 const GLuint kVShaderServiceId = 3001; 1837 const GLuint kVShaderServiceId = 3001;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1697 kUniform3RealLocation, 1890 kUniform3RealLocation,
1698 kUniform3DesiredLocation, 1891 kUniform3DesiredLocation,
1699 kUniform3NameWithArrayIndex, 1892 kUniform3NameWithArrayIndex,
1700 }, 1893 },
1701 }; 1894 };
1702 1895
1703 const size_t kNumAttribs = arraysize(kAttribs); 1896 const size_t kNumAttribs = arraysize(kAttribs);
1704 const size_t kNumUniforms = arraysize(kUniforms); 1897 const size_t kNumUniforms = arraysize(kUniforms);
1705 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, 1898 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms,
1706 kServiceProgramId); 1899 kServiceProgramId);
1707 program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed, 1900 program->Link(NULL, Program::kCountOnlyStaticallyUsed,
1708 base::Bind(&ShaderCacheCb)); 1901 base::Bind(&ShaderCacheCb));
1709 1902
1710 EXPECT_EQ(kUniform1DesiredLocation, 1903 EXPECT_EQ(kUniform1DesiredLocation,
1711 program->GetUniformFakeLocation(kUniform1Name)); 1904 program->GetUniformFakeLocation(kUniform1Name));
1712 EXPECT_EQ(kUniform3DesiredLocation, 1905 EXPECT_EQ(kUniform3DesiredLocation,
1713 program->GetUniformFakeLocation(kUniform3Name)); 1906 program->GetUniformFakeLocation(kUniform3Name));
1714 EXPECT_EQ(kUniform3DesiredLocation, 1907 EXPECT_EQ(kUniform3DesiredLocation,
1715 program->GetUniformFakeLocation(kUniform3NameWithArrayIndex)); 1908 program->GetUniformFakeLocation(kUniform3NameWithArrayIndex));
1716 } 1909 }
1717 1910
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1758 } 1951 }
1759 1952
1760 void SetShadersCompiled() { 1953 void SetShadersCompiled() {
1761 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); 1954 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true);
1762 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); 1955 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true);
1763 } 1956 }
1764 1957
1765 void SetProgramCached() { 1958 void SetProgramCached() {
1766 cache_->LinkedProgramCacheSuccess( 1959 cache_->LinkedProgramCacheSuccess(
1767 vertex_shader_->source(), 1960 vertex_shader_->source(),
1768 NULL,
1769 fragment_shader_->source(), 1961 fragment_shader_->source(),
1770 NULL,
1771 &program_->bind_attrib_location_map()); 1962 &program_->bind_attrib_location_map());
1772 } 1963 }
1773 1964
1774 void SetExpectationsForProgramCached() { 1965 void SetExpectationsForProgramCached() {
1775 SetExpectationsForProgramCached(program_, 1966 SetExpectationsForProgramCached(program_,
1776 vertex_shader_, 1967 vertex_shader_,
1777 fragment_shader_); 1968 fragment_shader_);
1778 } 1969 }
1779 1970
1780 void SetExpectationsForProgramCached( 1971 void SetExpectationsForProgramCached(
1781 Program* program, 1972 Program* program,
1782 Shader* vertex_shader, 1973 Shader* vertex_shader,
1783 Shader* fragment_shader) { 1974 Shader* fragment_shader) {
1784 EXPECT_CALL(*cache_.get(), SaveLinkedProgram( 1975 EXPECT_CALL(*cache_.get(), SaveLinkedProgram(
1785 program->service_id(), 1976 program->service_id(),
1786 vertex_shader, 1977 vertex_shader,
1787 NULL,
1788 fragment_shader, 1978 fragment_shader,
1789 NULL,
1790 &program->bind_attrib_location_map(), 1979 &program->bind_attrib_location_map(),
1791 _)).Times(1); 1980 _)).Times(1);
1792 } 1981 }
1793 1982
1794 void SetExpectationsForNotCachingProgram() { 1983 void SetExpectationsForNotCachingProgram() {
1795 SetExpectationsForNotCachingProgram(program_, 1984 SetExpectationsForNotCachingProgram(program_,
1796 vertex_shader_, 1985 vertex_shader_,
1797 fragment_shader_); 1986 fragment_shader_);
1798 } 1987 }
1799 1988
1800 void SetExpectationsForNotCachingProgram( 1989 void SetExpectationsForNotCachingProgram(
1801 Program* program, 1990 Program* program,
1802 Shader* vertex_shader, 1991 Shader* vertex_shader,
1803 Shader* fragment_shader) { 1992 Shader* fragment_shader) {
1804 EXPECT_CALL(*cache_.get(), SaveLinkedProgram( 1993 EXPECT_CALL(*cache_.get(), SaveLinkedProgram(
1805 program->service_id(), 1994 program->service_id(),
1806 vertex_shader, 1995 vertex_shader,
1807 NULL,
1808 fragment_shader, 1996 fragment_shader,
1809 NULL,
1810 &program->bind_attrib_location_map(), 1997 &program->bind_attrib_location_map(),
1811 _)).Times(0); 1998 _)).Times(0);
1812 } 1999 }
1813 2000
1814 void SetExpectationsForProgramLoad(ProgramCache::ProgramLoadResult result) { 2001 void SetExpectationsForProgramLoad(ProgramCache::ProgramLoadResult result) {
1815 SetExpectationsForProgramLoad(kServiceProgramId, 2002 SetExpectationsForProgramLoad(kServiceProgramId,
1816 program_, 2003 program_,
1817 vertex_shader_, 2004 vertex_shader_,
1818 fragment_shader_, 2005 fragment_shader_,
1819 result); 2006 result);
1820 } 2007 }
1821 2008
1822 void SetExpectationsForProgramLoad( 2009 void SetExpectationsForProgramLoad(
1823 GLuint service_program_id, 2010 GLuint service_program_id,
1824 Program* program, 2011 Program* program,
1825 Shader* vertex_shader, 2012 Shader* vertex_shader,
1826 Shader* fragment_shader, 2013 Shader* fragment_shader,
1827 ProgramCache::ProgramLoadResult result) { 2014 ProgramCache::ProgramLoadResult result) {
1828 EXPECT_CALL(*cache_.get(), 2015 EXPECT_CALL(*cache_.get(),
1829 LoadLinkedProgram(service_program_id, 2016 LoadLinkedProgram(service_program_id,
1830 vertex_shader, 2017 vertex_shader,
1831 NULL,
1832 fragment_shader, 2018 fragment_shader,
1833 NULL,
1834 &program->bind_attrib_location_map(), 2019 &program->bind_attrib_location_map(),
1835 _)) 2020 _))
1836 .WillOnce(Return(result)); 2021 .WillOnce(Return(result));
1837 } 2022 }
1838 2023
1839 void SetExpectationsForProgramLoadSuccess() { 2024 void SetExpectationsForProgramLoadSuccess() {
1840 SetExpectationsForProgramLoadSuccess(kServiceProgramId); 2025 SetExpectationsForProgramLoadSuccess(kServiceProgramId);
1841 } 2026 }
1842 2027
1843 void SetExpectationsForProgramLoadSuccess(GLuint service_program_id) { 2028 void SetExpectationsForProgramLoadSuccess(GLuint service_program_id) {
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1914 const GLuint ProgramManagerWithCacheTest::kVertexShaderClientId; 2099 const GLuint ProgramManagerWithCacheTest::kVertexShaderClientId;
1915 const GLuint ProgramManagerWithCacheTest::kFragmentShaderClientId; 2100 const GLuint ProgramManagerWithCacheTest::kFragmentShaderClientId;
1916 const GLuint ProgramManagerWithCacheTest::kVertexShaderServiceId; 2101 const GLuint ProgramManagerWithCacheTest::kVertexShaderServiceId;
1917 const GLuint ProgramManagerWithCacheTest::kFragmentShaderServiceId; 2102 const GLuint ProgramManagerWithCacheTest::kFragmentShaderServiceId;
1918 #endif 2103 #endif
1919 2104
1920 TEST_F(ProgramManagerWithCacheTest, CacheProgramOnSuccessfulLink) { 2105 TEST_F(ProgramManagerWithCacheTest, CacheProgramOnSuccessfulLink) {
1921 SetShadersCompiled(); 2106 SetShadersCompiled();
1922 SetExpectationsForProgramLink(); 2107 SetExpectationsForProgramLink();
1923 SetExpectationsForProgramCached(); 2108 SetExpectationsForProgramCached();
1924 EXPECT_TRUE(program_->Link(NULL, NULL, NULL, 2109 EXPECT_TRUE(program_->Link(NULL, Program::kCountOnlyStaticallyUsed,
1925 Program::kCountOnlyStaticallyUsed, base::Bind(&ShaderCacheCb))); 2110 base::Bind(&ShaderCacheCb)));
1926 } 2111 }
1927 2112
1928 TEST_F(ProgramManagerWithCacheTest, LoadProgramOnProgramCacheHit) { 2113 TEST_F(ProgramManagerWithCacheTest, LoadProgramOnProgramCacheHit) {
1929 SetShadersCompiled(); 2114 SetShadersCompiled();
1930 SetProgramCached(); 2115 SetProgramCached();
1931 2116
1932 SetExpectationsForNoCompile(vertex_shader_); 2117 SetExpectationsForNoCompile(vertex_shader_);
1933 SetExpectationsForNoCompile(fragment_shader_); 2118 SetExpectationsForNoCompile(fragment_shader_);
1934 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_SUCCESS); 2119 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_SUCCESS);
1935 SetExpectationsForNotCachingProgram(); 2120 SetExpectationsForNotCachingProgram();
1936 SetExpectationsForProgramLoadSuccess(); 2121 SetExpectationsForProgramLoadSuccess();
1937 2122
1938 EXPECT_TRUE(program_->Link(NULL, NULL, NULL, 2123 EXPECT_TRUE(program_->Link(NULL, Program::kCountOnlyStaticallyUsed,
1939 Program::kCountOnlyStaticallyUsed, base::Bind(&ShaderCacheCb))); 2124 base::Bind(&ShaderCacheCb)));
1940 } 2125 }
1941 2126
1942 } // namespace gles2 2127 } // namespace gles2
1943 } // namespace gpu 2128 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/program_manager.cc ('k') | gpu/command_buffer/service/shader_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698