OLD | NEW |
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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/client/program_info_manager.h" | 5 #include "gpu/command_buffer/client/program_info_manager.h" |
6 #include "testing/gtest/include/gtest/gtest.h" | 6 #include "testing/gtest/include/gtest/gtest.h" |
7 | 7 |
8 namespace { | 8 namespace { |
9 | 9 |
10 uint32 ComputeOffset(const void* start, const void* position) { | 10 uint32 ComputeOffset(const void* start, const void* position) { |
(...skipping 28 matching lines...) Expand all Loading... |
39 | 39 |
40 struct UniformBlocksData { | 40 struct UniformBlocksData { |
41 UniformBlocksHeader header; | 41 UniformBlocksHeader header; |
42 UniformBlockInfo entry[2]; | 42 UniformBlockInfo entry[2]; |
43 char name0[4]; | 43 char name0[4]; |
44 uint32_t indices0[2]; | 44 uint32_t indices0[2]; |
45 char name1[8]; | 45 char name1[8]; |
46 uint32_t indices1[1]; | 46 uint32_t indices1[1]; |
47 }; | 47 }; |
48 | 48 |
| 49 struct UniformsES3Data { |
| 50 UniformsES3Header header; |
| 51 UniformES3Info entry[2]; |
| 52 }; |
| 53 |
49 struct TransformFeedbackVaryingsData { | 54 struct TransformFeedbackVaryingsData { |
50 TransformFeedbackVaryingsHeader header; | 55 TransformFeedbackVaryingsHeader header; |
51 TransformFeedbackVaryingInfo entry[2]; | 56 TransformFeedbackVaryingInfo entry[2]; |
52 char name0[4]; | 57 char name0[4]; |
53 char name1[8]; | 58 char name1[8]; |
54 }; | 59 }; |
55 | 60 |
56 void SetUp() override { | 61 void SetUp() override { |
57 program_info_manager_.reset(new ProgramInfoManager); | 62 program_info_manager_.reset(new ProgramInfoManager); |
58 program_info_manager_->CreateInfo(kClientProgramId); | 63 program_info_manager_->CreateInfo(kClientProgramId); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 data->entry[1].active_uniform_offset = ComputeOffset(data, data->indices1); | 123 data->entry[1].active_uniform_offset = ComputeOffset(data, data->indices1); |
119 data->entry[1].referenced_by_vertex_shader = static_cast<uint32_t>(false); | 124 data->entry[1].referenced_by_vertex_shader = static_cast<uint32_t>(false); |
120 data->entry[1].referenced_by_fragment_shader = static_cast<uint32_t>(true); | 125 data->entry[1].referenced_by_fragment_shader = static_cast<uint32_t>(true); |
121 memcpy(data->name0, kName[0], arraysize(data->name0)); | 126 memcpy(data->name0, kName[0], arraysize(data->name0)); |
122 data->indices0[0] = kIndices[0][0]; | 127 data->indices0[0] = kIndices[0][0]; |
123 data->indices0[1] = kIndices[0][1]; | 128 data->indices0[1] = kIndices[0][1]; |
124 memcpy(data->name1, kName[1], arraysize(data->name1)); | 129 memcpy(data->name1, kName[1], arraysize(data->name1)); |
125 data->indices1[0] = kIndices[1][0]; | 130 data->indices1[0] = kIndices[1][0]; |
126 } | 131 } |
127 | 132 |
| 133 void SetupUniformsES3Data(UniformsES3Data* data) { |
| 134 data->header.num_uniforms = 2; |
| 135 data->entry[0].block_index = 1; |
| 136 data->entry[0].offset = 2; |
| 137 data->entry[0].array_stride = 3; |
| 138 data->entry[0].matrix_stride = 4; |
| 139 data->entry[0].is_row_major = 0; |
| 140 data->entry[1].block_index = 5; |
| 141 data->entry[1].offset = 6; |
| 142 data->entry[1].array_stride = 7; |
| 143 data->entry[1].matrix_stride = 8; |
| 144 data->entry[1].is_row_major = 1; |
| 145 } |
| 146 |
128 void SetupTransformFeedbackVaryingsData(TransformFeedbackVaryingsData* data) { | 147 void SetupTransformFeedbackVaryingsData(TransformFeedbackVaryingsData* data) { |
129 // The names needs to be of size 4*k-1 to avoid padding in the struct Data. | 148 // The names needs to be of size 4*k-1 to avoid padding in the struct Data. |
130 // This is a testing only problem. | 149 // This is a testing only problem. |
131 const char* kName[] = { "cow", "chicken" }; | 150 const char* kName[] = { "cow", "chicken" }; |
132 data->header.num_transform_feedback_varyings = 2; | 151 data->header.num_transform_feedback_varyings = 2; |
133 data->entry[0].size = 1; | 152 data->entry[0].size = 1; |
134 data->entry[0].type = GL_FLOAT_VEC2; | 153 data->entry[0].type = GL_FLOAT_VEC2; |
135 data->entry[0].name_offset = ComputeOffset(data, data->name0); | 154 data->entry[0].name_offset = ComputeOffset(data, data->name0); |
136 data->entry[0].name_length = arraysize(data->name0); | 155 data->entry[0].name_length = arraysize(data->name0); |
137 data->entry[1].size = 2; | 156 data->entry[1].size = 2; |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 const GLsizei kCount = 3; | 463 const GLsizei kCount = 3; |
445 GLuint indices[kCount]; | 464 GLuint indices[kCount]; |
446 EXPECT_TRUE(program_info_manager_->GetUniformIndices( | 465 EXPECT_TRUE(program_info_manager_->GetUniformIndices( |
447 NULL, kClientProgramId, kCount, kNames, indices)); | 466 NULL, kClientProgramId, kCount, kNames, indices)); |
448 for (GLsizei ii = 0; ii < kCount; ++ii) { | 467 for (GLsizei ii = 0; ii < kCount; ++ii) { |
449 EXPECT_EQ(kIndices[ii], indices[ii]); | 468 EXPECT_EQ(kIndices[ii], indices[ii]); |
450 } | 469 } |
451 } | 470 } |
452 } | 471 } |
453 | 472 |
| 473 TEST_F(ProgramInfoManagerTest, GetActiveUniformsivCached) { |
| 474 // ES3 only parameters. |
| 475 UniformsES3Data data_es3; |
| 476 SetupUniformsES3Data(&data_es3); |
| 477 std::vector<int8> result(sizeof(data_es3)); |
| 478 memcpy(&result[0], &data_es3, sizeof(data_es3)); |
| 479 EXPECT_FALSE(program_->IsCached(ProgramInfoManager::kES3Uniformsiv)); |
| 480 program_->UpdateES3Uniformsiv(result); |
| 481 EXPECT_TRUE(program_->IsCached(ProgramInfoManager::kES3Uniformsiv)); |
| 482 |
| 483 uint32_t count = data_es3.header.num_uniforms; |
| 484 std::vector<GLuint> indices(count); |
| 485 for (uint32_t ii = 0; ii < count; ++ii) { |
| 486 indices[ii] = ii; |
| 487 } |
| 488 std::vector<GLint> block_index(count); |
| 489 EXPECT_TRUE(program_info_manager_->GetActiveUniformsiv( |
| 490 NULL, kClientProgramId, static_cast<GLsizei>(count), &indices[0], |
| 491 GL_UNIFORM_BLOCK_INDEX, &block_index[0])); |
| 492 std::vector<GLint> offset(count); |
| 493 EXPECT_TRUE(program_info_manager_->GetActiveUniformsiv( |
| 494 NULL, kClientProgramId, static_cast<GLsizei>(count), &indices[0], |
| 495 GL_UNIFORM_OFFSET, &offset[0])); |
| 496 std::vector<GLint> array_stride(count); |
| 497 EXPECT_TRUE(program_info_manager_->GetActiveUniformsiv( |
| 498 NULL, kClientProgramId, static_cast<GLsizei>(count), &indices[0], |
| 499 GL_UNIFORM_ARRAY_STRIDE, &array_stride[0])); |
| 500 std::vector<GLint> matrix_stride(count); |
| 501 EXPECT_TRUE(program_info_manager_->GetActiveUniformsiv( |
| 502 NULL, kClientProgramId, static_cast<GLsizei>(count), &indices[0], |
| 503 GL_UNIFORM_MATRIX_STRIDE, &matrix_stride[0])); |
| 504 std::vector<GLint> is_row_major(count); |
| 505 EXPECT_TRUE(program_info_manager_->GetActiveUniformsiv( |
| 506 NULL, kClientProgramId, static_cast<GLsizei>(count), &indices[0], |
| 507 GL_UNIFORM_IS_ROW_MAJOR, &is_row_major[0])); |
| 508 |
| 509 for (uint32_t ii = 0; ii < count; ++ii) { |
| 510 EXPECT_EQ(data_es3.entry[ii].block_index, block_index[ii]); |
| 511 EXPECT_EQ(data_es3.entry[ii].offset, offset[ii]); |
| 512 EXPECT_EQ(data_es3.entry[ii].array_stride, array_stride[ii]); |
| 513 EXPECT_EQ(data_es3.entry[ii].matrix_stride, matrix_stride[ii]); |
| 514 EXPECT_EQ(data_es3.entry[ii].is_row_major, is_row_major[ii]); |
| 515 } |
| 516 |
| 517 // ES2 parameters. |
| 518 ProgramES2Data data_es2; |
| 519 SetupProgramES2Data(&data_es2); |
| 520 result.resize(sizeof(data_es2)); |
| 521 memcpy(&result[0], &data_es2, sizeof(data_es2)); |
| 522 EXPECT_FALSE(program_->IsCached(ProgramInfoManager::kES2)); |
| 523 program_->UpdateES2(result); |
| 524 EXPECT_TRUE(program_->IsCached(ProgramInfoManager::kES2)); |
| 525 |
| 526 std::vector<GLint> size(count); |
| 527 EXPECT_TRUE(program_info_manager_->GetActiveUniformsiv( |
| 528 NULL, kClientProgramId, static_cast<GLsizei>(count), &indices[0], |
| 529 GL_UNIFORM_SIZE, &size[0])); |
| 530 std::vector<GLint> type(count); |
| 531 EXPECT_TRUE(program_info_manager_->GetActiveUniformsiv( |
| 532 NULL, kClientProgramId, static_cast<GLsizei>(count), &indices[0], |
| 533 GL_UNIFORM_TYPE, &type[0])); |
| 534 std::vector<GLint> name_length(count); |
| 535 EXPECT_TRUE(program_info_manager_->GetActiveUniformsiv( |
| 536 NULL, kClientProgramId, static_cast<GLsizei>(count), &indices[0], |
| 537 GL_UNIFORM_NAME_LENGTH, &name_length[0])); |
| 538 |
| 539 for (uint32_t ii = 0; ii < count; ++ii) { |
| 540 EXPECT_EQ(data_es2.uniforms[ii].size, size[ii]); |
| 541 EXPECT_EQ(data_es2.uniforms[ii].type, static_cast<uint32_t>(type[ii])); |
| 542 EXPECT_EQ(data_es2.uniforms[ii].name_length + 1, |
| 543 static_cast<uint32_t>(name_length[ii])); |
| 544 } |
| 545 } |
| 546 |
454 } // namespace gles2 | 547 } // namespace gles2 |
455 } // namespace gpu | 548 } // namespace gpu |
456 | 549 |
OLD | NEW |