Index: gpu/command_buffer/client/program_info_manager_unittest.cc |
diff --git a/gpu/command_buffer/client/program_info_manager_unittest.cc b/gpu/command_buffer/client/program_info_manager_unittest.cc |
index a2fc722c68c5c583d8934f24ee910cfdcadb3890..6b0576cf82c11ca727ad2d85f40a8c414aaae509 100644 |
--- a/gpu/command_buffer/client/program_info_manager_unittest.cc |
+++ b/gpu/command_buffer/client/program_info_manager_unittest.cc |
@@ -12,6 +12,8 @@ uint32 ComputeOffset(const void* start, const void* position) { |
static_cast<const uint8*>(start); |
} |
+const GLuint kClientProgramId = 321; |
+ |
} // namespace anonymous |
namespace gpu { |
@@ -23,13 +25,9 @@ class ProgramInfoManagerTest : public testing::Test { |
~ProgramInfoManagerTest() override {} |
protected: |
- void SetUp() override {} |
- |
- void TearDown() override {} |
-}; |
+ typedef ProgramInfoManager::Program Program; |
-TEST_F(ProgramInfoManagerTest, UpdateES3UniformBlocks) { |
- struct Data { |
+ struct UniformBlocksData { |
UniformBlocksHeader header; |
UniformBlockInfo entry[2]; |
char name0[4]; |
@@ -37,55 +35,77 @@ TEST_F(ProgramInfoManagerTest, UpdateES3UniformBlocks) { |
char name1[8]; |
uint32_t indices1[1]; |
}; |
- Data data; |
- // The names needs to be of size 4*k-1 to avoid padding in the struct Data. |
- // This is a testing only problem. |
- const char* kName[] = { "cow", "chicken" }; |
- const uint32_t kIndices0[] = { 1, 2 }; |
- const uint32_t kIndices1[] = { 3 }; |
- const uint32_t* kIndices[] = { kIndices0, kIndices1 }; |
- data.header.num_uniform_blocks = 2; |
- data.entry[0].binding = 0; |
- data.entry[0].data_size = 8; |
- data.entry[0].name_offset = ComputeOffset(&data, data.name0); |
- data.entry[0].name_length = arraysize(data.name0); |
- data.entry[0].active_uniforms = arraysize(data.indices0); |
- data.entry[0].active_uniform_offset = ComputeOffset(&data, data.indices0); |
- data.entry[0].referenced_by_vertex_shader = static_cast<uint32_t>(true); |
- data.entry[0].referenced_by_fragment_shader = static_cast<uint32_t>(false); |
- data.entry[1].binding = 1; |
- data.entry[1].data_size = 4; |
- data.entry[1].name_offset = ComputeOffset(&data, data.name1); |
- data.entry[1].name_length = arraysize(data.name1); |
- data.entry[1].active_uniforms = arraysize(data.indices1); |
- data.entry[1].active_uniform_offset = ComputeOffset(&data, data.indices1); |
- data.entry[1].referenced_by_vertex_shader = static_cast<uint32_t>(false); |
- data.entry[1].referenced_by_fragment_shader = static_cast<uint32_t>(true); |
- memcpy(data.name0, kName[0], arraysize(data.name0)); |
- data.indices0[0] = kIndices[0][0]; |
- data.indices0[1] = kIndices[0][1]; |
- memcpy(data.name1, kName[1], arraysize(data.name1)); |
- data.indices1[0] = kIndices[1][0]; |
+ void SetUp() override { |
+ program_info_manager_.reset(new ProgramInfoManager); |
+ program_info_manager_->CreateInfo(kClientProgramId); |
+ { |
+ base::AutoLock auto_lock(program_info_manager_->lock_); |
+ program_ = program_info_manager_->GetProgramInfo( |
+ NULL, kClientProgramId, ProgramInfoManager::kNone); |
+ ASSERT_TRUE(program_ != NULL); |
+ } |
+ } |
+ |
+ void TearDown() override {} |
+ |
+ void SetupUniformBlocksData(UniformBlocksData* data) { |
+ // The names needs to be of size 4*k-1 to avoid padding in the struct Data. |
+ // This is a testing only problem. |
+ const char* kName[] = { "cow", "chicken" }; |
+ const uint32_t kIndices0[] = { 1, 2 }; |
+ const uint32_t kIndices1[] = { 3 }; |
+ const uint32_t* kIndices[] = { kIndices0, kIndices1 }; |
+ data->header.num_uniform_blocks = 2; |
+ data->entry[0].binding = 0; |
+ data->entry[0].data_size = 8; |
+ data->entry[0].name_offset = ComputeOffset(data, data->name0); |
+ data->entry[0].name_length = arraysize(data->name0); |
+ data->entry[0].active_uniforms = arraysize(data->indices0); |
+ data->entry[0].active_uniform_offset = ComputeOffset(data, data->indices0); |
+ data->entry[0].referenced_by_vertex_shader = static_cast<uint32_t>(true); |
+ data->entry[0].referenced_by_fragment_shader = static_cast<uint32_t>(false); |
+ data->entry[1].binding = 1; |
+ data->entry[1].data_size = 4; |
+ data->entry[1].name_offset = ComputeOffset(data, data->name1); |
+ data->entry[1].name_length = arraysize(data->name1); |
+ data->entry[1].active_uniforms = arraysize(data->indices1); |
+ data->entry[1].active_uniform_offset = ComputeOffset(data, data->indices1); |
+ data->entry[1].referenced_by_vertex_shader = static_cast<uint32_t>(false); |
+ data->entry[1].referenced_by_fragment_shader = static_cast<uint32_t>(true); |
+ memcpy(data->name0, kName[0], arraysize(data->name0)); |
+ data->indices0[0] = kIndices[0][0]; |
+ data->indices0[1] = kIndices[0][1]; |
+ memcpy(data->name1, kName[1], arraysize(data->name1)); |
+ data->indices1[0] = kIndices[1][0]; |
+ } |
+ |
+ scoped_ptr<ProgramInfoManager> program_info_manager_; |
+ Program* program_; |
+}; |
+ |
+TEST_F(ProgramInfoManagerTest, UpdateES3UniformBlocks) { |
+ UniformBlocksData data; |
+ SetupUniformBlocksData(&data); |
+ const std::string kName[] = { data.name0, data.name1 }; |
+ const uint32_t* kIndices[] = { data.indices0, data.indices1 }; |
std::vector<int8> result(sizeof(data)); |
memcpy(&result[0], &data, sizeof(data)); |
+ EXPECT_FALSE(program_->IsCached(ProgramInfoManager::kES3UniformBlocks)); |
+ program_->UpdateES3UniformBlocks(result); |
+ EXPECT_TRUE(program_->IsCached(ProgramInfoManager::kES3UniformBlocks)); |
- ProgramInfoManager::Program program; |
- EXPECT_FALSE(program.IsCached(ProgramInfoManager::kES3UniformBlocks)); |
- program.UpdateES3UniformBlocks(result); |
- EXPECT_TRUE(program.IsCached(ProgramInfoManager::kES3UniformBlocks)); |
GLint uniform_block_count = 0; |
- EXPECT_TRUE(program.GetProgramiv( |
+ EXPECT_TRUE(program_->GetProgramiv( |
GL_ACTIVE_UNIFORM_BLOCKS, &uniform_block_count)); |
EXPECT_EQ(data.header.num_uniform_blocks, |
static_cast<uint32_t>(uniform_block_count)); |
GLint max_name_length = 0; |
- EXPECT_TRUE(program.GetProgramiv( |
+ EXPECT_TRUE(program_->GetProgramiv( |
GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, &max_name_length)); |
for (uint32_t ii = 0; ii < data.header.num_uniform_blocks; ++ii) { |
- EXPECT_EQ(ii, program.GetUniformBlockIndex(kName[ii])); |
- const ProgramInfoManager::Program::UniformBlock* info = |
- program.GetUniformBlock(ii); |
+ EXPECT_EQ(ii, program_->GetUniformBlockIndex(kName[ii])); |
+ const Program::UniformBlock* info = program_->GetUniformBlock(ii); |
EXPECT_TRUE(info != NULL); |
EXPECT_EQ(data.entry[ii].binding, info->binding); |
EXPECT_EQ(data.entry[ii].data_size, info->data_size); |
@@ -102,8 +122,61 @@ TEST_F(ProgramInfoManagerTest, UpdateES3UniformBlocks) { |
EXPECT_GE(max_name_length, static_cast<GLint>(info->name.size()) + 1); |
} |
- EXPECT_EQ(GL_INVALID_INDEX, program.GetUniformBlockIndex("BadName")); |
- EXPECT_EQ(NULL, program.GetUniformBlock(data.header.num_uniform_blocks)); |
+ EXPECT_EQ(GL_INVALID_INDEX, program_->GetUniformBlockIndex("BadName")); |
+ EXPECT_EQ(NULL, program_->GetUniformBlock(data.header.num_uniform_blocks)); |
+} |
+ |
+TEST_F(ProgramInfoManagerTest, GetUniformBlockIndexCached) { |
+ UniformBlocksData data; |
+ SetupUniformBlocksData(&data); |
+ std::vector<int8> result(sizeof(data)); |
+ memcpy(&result[0], &data, sizeof(data)); |
+ program_->UpdateES3UniformBlocks(result); |
+ |
+ EXPECT_EQ(0u, program_info_manager_->GetUniformBlockIndex( |
+ NULL, kClientProgramId, data.name0)); |
+ EXPECT_EQ(1u, program_info_manager_->GetUniformBlockIndex( |
+ NULL, kClientProgramId, data.name1)); |
+ EXPECT_EQ(GL_INVALID_INDEX, program_info_manager_->GetUniformBlockIndex( |
+ NULL, kClientProgramId, "BadName")); |
+} |
+ |
+TEST_F(ProgramInfoManagerTest, GetActiveUniformBlockNameCached) { |
+ UniformBlocksData data; |
+ SetupUniformBlocksData(&data); |
+ std::vector<int8> result(sizeof(data)); |
+ memcpy(&result[0], &data, sizeof(data)); |
+ program_->UpdateES3UniformBlocks(result); |
+ |
+ GLsizei buf_size = std::max(strlen(data.name0), strlen(data.name1)) + 1; |
+ std::vector<char> buffer(buf_size); |
+ GLsizei length = 0; |
+ EXPECT_EQ(true, program_info_manager_->GetActiveUniformBlockName( |
+ NULL, kClientProgramId, 0, buf_size, &length, &buffer[0])); |
+ EXPECT_EQ(static_cast<GLsizei>(strlen(data.name0)), length); |
+ EXPECT_STREQ(data.name0, &buffer[0]); |
+ |
+ EXPECT_EQ(true, program_info_manager_->GetActiveUniformBlockName( |
+ NULL, kClientProgramId, 1, buf_size, &length, &buffer[0])); |
+ EXPECT_EQ(static_cast<GLsizei>(strlen(data.name1)), length); |
+ EXPECT_STREQ(data.name1, &buffer[0]); |
+ |
+ // Test length == NULL. |
+ EXPECT_EQ(true, program_info_manager_->GetActiveUniformBlockName( |
+ NULL, kClientProgramId, 0, buf_size, NULL, &buffer[0])); |
+ EXPECT_STREQ(data.name0, &buffer[0]); |
+ |
+ // Test buffer == NULL. |
+ EXPECT_EQ(true, program_info_manager_->GetActiveUniformBlockName( |
+ NULL, kClientProgramId, 0, buf_size, &length, NULL)); |
+ EXPECT_EQ(0, length); |
+ |
+ // Test buf_size smaller than string size. |
+ buf_size = strlen(data.name0); |
+ EXPECT_EQ(true, program_info_manager_->GetActiveUniformBlockName( |
+ NULL, kClientProgramId, 0, buf_size, &length, &buffer[0])); |
+ EXPECT_EQ(buf_size, length + 1); |
+ EXPECT_STREQ(std::string(data.name0).substr(0, length).c_str(), &buffer[0]); |
} |
} // namespace gles2 |