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

Unified Diff: gpu/command_buffer/service/program_manager_unittest.cc

Issue 895853003: Update from https://crrev.com/314320 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/program_manager.cc ('k') | gpu/command_buffer/service/query_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/program_manager_unittest.cc
diff --git a/gpu/command_buffer/service/program_manager_unittest.cc b/gpu/command_buffer/service/program_manager_unittest.cc
index 4acd2209ab8976db160da3f9ea1eeef1899c71af..7d9ea9dd5a2cb2abf5e8f10f7685ba4326f37a25 100644
--- a/gpu/command_buffer/service/program_manager_unittest.cc
+++ b/gpu/command_buffer/service/program_manager_unittest.cc
@@ -28,7 +28,7 @@ using ::testing::Pointee;
using ::testing::Return;
using ::testing::ReturnRef;
using ::testing::SetArrayArgument;
-using ::testing::SetArgumentPointee;
+using ::testing::SetArgPointee;
using ::testing::StrEq;
namespace gpu {
@@ -38,6 +38,12 @@ namespace {
const uint32 kMaxVaryingVectors = 8;
void ShaderCacheCb(const std::string& key, const std::string& shader) {}
+
+uint32 ComputeOffset(const void* start, const void* position) {
+ return static_cast<const uint8*>(position) -
+ static_cast<const uint8*>(start);
+}
+
} // namespace anonymous
class ProgramManagerTest : public GpuServiceTest {
@@ -214,7 +220,8 @@ class ProgramManagerWithShaderTest : public GpuServiceTest {
} VarInfo;
void SetUp() override {
- GpuServiceTest::SetUp();
+ // Need to be at leat 3.1 for UniformBlock related GL APIs.
+ GpuServiceTest::SetUpWithGLVersion("3.1", NULL);
SetupDefaultShaderExpectations();
@@ -1073,6 +1080,153 @@ TEST_F(ProgramManagerWithShaderTest, ProgramInfoGetProgramInfo) {
static_cast<uint32>(input - inputs));
}
+TEST_F(ProgramManagerWithShaderTest, ProgramInfoGetUniformBlocksNone) {
+ CommonDecoder::Bucket bucket;
+ const Program* program = manager_.GetProgram(kClientProgramId);
+ ASSERT_TRUE(program != NULL);
+ // The program's previous link failed.
+ EXPECT_CALL(*(gl_.get()),
+ GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_FALSE))
+ .RetiresOnSaturation();
+ EXPECT_TRUE(program->GetUniformBlocks(&bucket));
+ EXPECT_EQ(sizeof(UniformBlocksHeader), bucket.size());
+ UniformBlocksHeader* header =
+ bucket.GetDataAs<UniformBlocksHeader*>(0, sizeof(UniformBlocksHeader));
+ EXPECT_TRUE(header != NULL);
+ EXPECT_EQ(0u, header->num_uniform_blocks);
+ // Zero uniform blocks.
+ EXPECT_CALL(*(gl_.get()),
+ GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*(gl_.get()),
+ GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORM_BLOCKS, _))
+ .WillOnce(SetArgPointee<2>(0))
+ .RetiresOnSaturation();
+ EXPECT_TRUE(program->GetUniformBlocks(&bucket));
+ EXPECT_EQ(sizeof(UniformBlocksHeader), bucket.size());
+ header =
+ bucket.GetDataAs<UniformBlocksHeader*>(0, sizeof(UniformBlocksHeader));
+ EXPECT_TRUE(header != NULL);
+ EXPECT_EQ(0u, header->num_uniform_blocks);
+}
+
+TEST_F(ProgramManagerWithShaderTest, ProgramInfoGetUniformBlocksValid) {
+ CommonDecoder::Bucket bucket;
+ const Program* program = manager_.GetProgram(kClientProgramId);
+ ASSERT_TRUE(program != NULL);
+ struct Data {
+ UniformBlocksHeader header;
+ UniformBlockInfo entry[2];
+ char name0[4];
+ uint32_t indices0[2];
+ 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];
+
+ EXPECT_CALL(*(gl_.get()),
+ GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*(gl_.get()),
+ GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORM_BLOCKS, _))
+ .WillOnce(SetArgPointee<2>(data.header.num_uniform_blocks))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*(gl_.get()),
+ GetProgramiv(kServiceProgramId,
+ GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, _))
+ .WillOnce(SetArgPointee<2>(
+ 1 + std::max(strlen(kName[0]), strlen(kName[1]))))
+ .RetiresOnSaturation();
+ for (uint32_t ii = 0; ii < data.header.num_uniform_blocks; ++ii) {
+ EXPECT_CALL(*(gl_.get()),
+ GetActiveUniformBlockiv(
+ kServiceProgramId, ii, GL_UNIFORM_BLOCK_BINDING, _))
+ .WillOnce(SetArgPointee<3>(data.entry[ii].binding))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*(gl_.get()),
+ GetActiveUniformBlockiv(
+ kServiceProgramId, ii, GL_UNIFORM_BLOCK_DATA_SIZE, _))
+ .WillOnce(SetArgPointee<3>(data.entry[ii].data_size))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*(gl_.get()),
+ GetActiveUniformBlockiv(
+ kServiceProgramId, ii, GL_UNIFORM_BLOCK_NAME_LENGTH, _))
+ .WillOnce(SetArgPointee<3>(data.entry[ii].name_length))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*(gl_.get()),
+ GetActiveUniformBlockName(
+ kServiceProgramId, ii, data.entry[ii].name_length, _, _))
+ .WillOnce(DoAll(
+ SetArgPointee<3>(strlen(kName[ii])),
+ SetArrayArgument<4>(
+ kName[ii], kName[ii] + data.entry[ii].name_length)))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*(gl_.get()),
+ GetActiveUniformBlockiv(
+ kServiceProgramId, ii, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, _))
+ .WillOnce(SetArgPointee<3>(data.entry[ii].active_uniforms))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*(gl_.get()),
+ GetActiveUniformBlockiv(
+ kServiceProgramId, ii,
+ GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER, _))
+ .WillOnce(SetArgPointee<3>(data.entry[ii].referenced_by_vertex_shader))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*(gl_.get()),
+ GetActiveUniformBlockiv(
+ kServiceProgramId, ii,
+ GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER, _))
+ .WillOnce(SetArgPointee<3>(
+ data.entry[ii].referenced_by_fragment_shader))
+ .RetiresOnSaturation();
+ }
+ for (uint32_t ii = 0; ii < data.header.num_uniform_blocks; ++ii) {
+ EXPECT_CALL(*(gl_.get()),
+ GetActiveUniformBlockiv(
+ kServiceProgramId, ii,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, _))
+ .WillOnce(SetArrayArgument<3>(
+ kIndices[ii], kIndices[ii] + data.entry[ii].active_uniforms))
+ .RetiresOnSaturation();
+ }
+ program->GetUniformBlocks(&bucket);
+ EXPECT_EQ(sizeof(Data), bucket.size());
+ Data* bucket_data = bucket.GetDataAs<Data*>(0, sizeof(Data));
+ EXPECT_TRUE(bucket_data != NULL);
+ EXPECT_EQ(0, memcmp(&data, bucket_data, sizeof(Data)));
+}
+
// Some drivers optimize out unused uniform array elements, so their
// location would be -1.
TEST_F(ProgramManagerWithShaderTest, UnusedUniformArrayElements) {
@@ -1717,7 +1871,7 @@ class ProgramManagerWithCacheTest : public GpuServiceTest {
ShaderSource(shader_id, 1, Pointee(src), NULL)).Times(1);
EXPECT_CALL(*gl_.get(), CompileShader(shader_id)).Times(1);
EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_COMPILE_STATUS, _))
- .WillOnce(SetArgumentPointee<2>(GL_TRUE));
+ .WillOnce(SetArgPointee<2>(GL_TRUE));
}
void SetExpectationsForNoCompile(const Shader* shader) {
@@ -1737,9 +1891,9 @@ class ProgramManagerWithCacheTest : public GpuServiceTest {
ShaderSource(shader_id, 1, Pointee(src), NULL)).Times(1);
EXPECT_CALL(*gl_.get(), CompileShader(shader_id)).Times(1);
EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_COMPILE_STATUS, _))
- .WillOnce(SetArgumentPointee<2>(GL_FALSE));
+ .WillOnce(SetArgPointee<2>(GL_FALSE));
EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_INFO_LOG_LENGTH, _))
- .WillOnce(SetArgumentPointee<2>(0));
+ .WillOnce(SetArgPointee<2>(0));
EXPECT_CALL(*gl_.get(), GetShaderInfoLog(shader_id, 0, _, _))
.Times(1);
}
« no previous file with comments | « gpu/command_buffer/service/program_manager.cc ('k') | gpu/command_buffer/service/query_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698