| 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 |