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/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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |