| 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 7d9ea9dd5a2cb2abf5e8f10f7685ba4326f37a25..99678f4588cd2215300c548b0b6404d423896873 100644
|
| --- a/gpu/command_buffer/service/program_manager_unittest.cc
|
| +++ b/gpu/command_buffer/service/program_manager_unittest.cc
|
| @@ -242,7 +242,7 @@ class ProgramManagerWithShaderTest : public GpuServiceTest {
|
|
|
| program_->AttachShader(&shader_manager_, vertex_shader);
|
| program_->AttachShader(&shader_manager_, fragment_shader);
|
| - program_->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed,
|
| + program_->Link(NULL, Program::kCountOnlyStaticallyUsed,
|
| base::Bind(&ShaderCacheCb));
|
| }
|
|
|
| @@ -272,7 +272,7 @@ class ProgramManagerWithShaderTest : public GpuServiceTest {
|
| SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms,
|
| service_id);
|
| }
|
| - program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed,
|
| + program->Link(NULL, Program::kCountOnlyStaticallyUsed,
|
| base::Bind(&ShaderCacheCb));
|
| GLint link_status;
|
| program->GetProgramiv(GL_LINK_STATUS, &link_status);
|
| @@ -715,7 +715,7 @@ TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsGLUnderscoreUniform) {
|
| ASSERT_TRUE(program != NULL);
|
| EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
|
| EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
|
| - program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed,
|
| + program->Link(NULL, Program::kCountOnlyStaticallyUsed,
|
| base::Bind(&ShaderCacheCb));
|
| GLint value = 0;
|
| program->GetProgramiv(GL_ACTIVE_ATTRIBUTES, &value);
|
| @@ -784,7 +784,7 @@ TEST_F(ProgramManagerWithShaderTest, SimilarArrayNames) {
|
| ASSERT_TRUE(program != NULL);
|
| EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
|
| EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
|
| - program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed,
|
| + program->Link(NULL, Program::kCountOnlyStaticallyUsed,
|
| base::Bind(&ShaderCacheCb));
|
|
|
| // Check that we get the correct locations.
|
| @@ -880,7 +880,7 @@ TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) {
|
| ASSERT_TRUE(program!= NULL);
|
| EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
|
| EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
|
| - program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed,
|
| + program->Link(NULL, Program::kCountOnlyStaticallyUsed,
|
| base::Bind(&ShaderCacheCb));
|
| // Check that we got the good type, not the bad.
|
| // Check Attribs
|
| @@ -1227,6 +1227,199 @@ TEST_F(ProgramManagerWithShaderTest, ProgramInfoGetUniformBlocksValid) {
|
| EXPECT_EQ(0, memcmp(&data, bucket_data, sizeof(Data)));
|
| }
|
|
|
| +TEST_F(ProgramManagerWithShaderTest,
|
| + ProgramInfoGetTransformFeedbackVaryingsNone) {
|
| + 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->GetTransformFeedbackVaryings(&bucket));
|
| + EXPECT_EQ(sizeof(TransformFeedbackVaryingsHeader), bucket.size());
|
| + TransformFeedbackVaryingsHeader* header =
|
| + bucket.GetDataAs<TransformFeedbackVaryingsHeader*>(
|
| + 0, sizeof(TransformFeedbackVaryingsHeader));
|
| + EXPECT_TRUE(header != NULL);
|
| + EXPECT_EQ(0u, header->num_transform_feedback_varyings);
|
| + // 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_TRANSFORM_FEEDBACK_VARYINGS, _))
|
| + .WillOnce(SetArgPointee<2>(0))
|
| + .RetiresOnSaturation();
|
| + EXPECT_TRUE(program->GetTransformFeedbackVaryings(&bucket));
|
| + EXPECT_EQ(sizeof(TransformFeedbackVaryingsHeader), bucket.size());
|
| + header = bucket.GetDataAs<TransformFeedbackVaryingsHeader*>(
|
| + 0, sizeof(TransformFeedbackVaryingsHeader));
|
| + EXPECT_TRUE(header != NULL);
|
| + EXPECT_EQ(0u, header->num_transform_feedback_varyings);
|
| +}
|
| +
|
| +TEST_F(ProgramManagerWithShaderTest,
|
| + ProgramInfoGetTransformFeedbackVaryingsValid) {
|
| + CommonDecoder::Bucket bucket;
|
| + const Program* program = manager_.GetProgram(kClientProgramId);
|
| + ASSERT_TRUE(program != NULL);
|
| + struct Data {
|
| + TransformFeedbackVaryingsHeader header;
|
| + TransformFeedbackVaryingInfo entry[2];
|
| + char name0[4];
|
| + char name1[8];
|
| + };
|
| + 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" };
|
| + data.header.num_transform_feedback_varyings = 2;
|
| + data.entry[0].size = 1;
|
| + data.entry[0].type = GL_FLOAT_VEC2;
|
| + data.entry[0].name_offset = ComputeOffset(&data, data.name0);
|
| + data.entry[0].name_length = arraysize(data.name0);
|
| + data.entry[1].size = 2;
|
| + data.entry[1].type = GL_FLOAT;
|
| + data.entry[1].name_offset = ComputeOffset(&data, data.name1);
|
| + data.entry[1].name_length = arraysize(data.name1);
|
| + memcpy(data.name0, kName[0], arraysize(data.name0));
|
| + memcpy(data.name1, kName[1], arraysize(data.name1));
|
| +
|
| + EXPECT_CALL(*(gl_.get()),
|
| + GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
|
| + .WillOnce(SetArgPointee<2>(GL_TRUE))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*(gl_.get()),
|
| + GetProgramiv(
|
| + kServiceProgramId, GL_TRANSFORM_FEEDBACK_VARYINGS, _))
|
| + .WillOnce(SetArgPointee<2>(data.header.num_transform_feedback_varyings))
|
| + .RetiresOnSaturation();
|
| + GLsizei max_length = 1 + std::max(strlen(kName[0]), strlen(kName[1]));
|
| + EXPECT_CALL(*(gl_.get()),
|
| + GetProgramiv(kServiceProgramId,
|
| + GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, _))
|
| + .WillOnce(SetArgPointee<2>(max_length))
|
| + .RetiresOnSaturation();
|
| + for (uint32_t ii = 0; ii < data.header.num_transform_feedback_varyings;
|
| + ++ii) {
|
| + EXPECT_CALL(*(gl_.get()),
|
| + GetTransformFeedbackVarying(
|
| + kServiceProgramId, ii, max_length, _, _, _, _))
|
| + .WillOnce(DoAll(
|
| + SetArgPointee<3>(data.entry[ii].name_length - 1),
|
| + SetArgPointee<4>(data.entry[ii].size),
|
| + SetArgPointee<5>(data.entry[ii].type),
|
| + SetArrayArgument<6>(
|
| + kName[ii], kName[ii] + data.entry[ii].name_length)))
|
| + .RetiresOnSaturation();
|
| + }
|
| + program->GetTransformFeedbackVaryings(&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)));
|
| +}
|
| +
|
| +TEST_F(ProgramManagerWithShaderTest, ProgramInfoGetUniformsES3None) {
|
| + 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->GetUniformsES3(&bucket));
|
| + EXPECT_EQ(sizeof(UniformsES3Header), bucket.size());
|
| + UniformsES3Header* header =
|
| + bucket.GetDataAs<UniformsES3Header*>(0, sizeof(UniformsES3Header));
|
| + EXPECT_TRUE(header != NULL);
|
| + EXPECT_EQ(0u, header->num_uniforms);
|
| + // 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_UNIFORMS, _))
|
| + .WillOnce(SetArgPointee<2>(0))
|
| + .RetiresOnSaturation();
|
| + EXPECT_TRUE(program->GetUniformsES3(&bucket));
|
| + EXPECT_EQ(sizeof(UniformsES3Header), bucket.size());
|
| + header =
|
| + bucket.GetDataAs<UniformsES3Header*>(0, sizeof(UniformsES3Header));
|
| + EXPECT_TRUE(header != NULL);
|
| + EXPECT_EQ(0u, header->num_uniforms);
|
| +}
|
| +
|
| +TEST_F(ProgramManagerWithShaderTest, ProgramInfoGetUniformsES3Valid) {
|
| + CommonDecoder::Bucket bucket;
|
| + const Program* program = manager_.GetProgram(kClientProgramId);
|
| + ASSERT_TRUE(program != NULL);
|
| + struct Data {
|
| + UniformsES3Header header;
|
| + UniformES3Info entry[2];
|
| + };
|
| + Data data;
|
| + const GLint kBlockIndex[] = { -1, 2 };
|
| + const GLint kOffset[] = { 3, 4 };
|
| + const GLint kArrayStride[] = { 7, 8 };
|
| + const GLint kMatrixStride[] = { 9, 10 };
|
| + const GLint kIsRowMajor[] = { 0, 1 };
|
| + data.header.num_uniforms = 2;
|
| + for (uint32_t ii = 0; ii < data.header.num_uniforms; ++ii) {
|
| + data.entry[ii].block_index = kBlockIndex[ii];
|
| + data.entry[ii].offset = kOffset[ii];
|
| + data.entry[ii].array_stride = kArrayStride[ii];
|
| + data.entry[ii].matrix_stride = kMatrixStride[ii];
|
| + data.entry[ii].is_row_major = kIsRowMajor[ii];
|
| + }
|
| +
|
| + EXPECT_CALL(*(gl_.get()),
|
| + GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
|
| + .WillOnce(SetArgPointee<2>(GL_TRUE))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*(gl_.get()),
|
| + GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORMS, _))
|
| + .WillOnce(SetArgPointee<2>(data.header.num_uniforms))
|
| + .RetiresOnSaturation();
|
| +
|
| + const GLenum kPname[] = {
|
| + GL_UNIFORM_BLOCK_INDEX,
|
| + GL_UNIFORM_OFFSET,
|
| + GL_UNIFORM_ARRAY_STRIDE,
|
| + GL_UNIFORM_MATRIX_STRIDE,
|
| + GL_UNIFORM_IS_ROW_MAJOR,
|
| + };
|
| + const GLint* kParams[] = {
|
| + kBlockIndex,
|
| + kOffset,
|
| + kArrayStride,
|
| + kMatrixStride,
|
| + kIsRowMajor,
|
| + };
|
| + const size_t kNumIterations = arraysize(kPname);
|
| + for (size_t ii = 0; ii < kNumIterations; ++ii) {
|
| + EXPECT_CALL(*(gl_.get()),
|
| + GetActiveUniformsiv(
|
| + kServiceProgramId, data.header.num_uniforms, _,
|
| + kPname[ii], _))
|
| + .WillOnce(SetArrayArgument<4>(
|
| + kParams[ii], kParams[ii] + data.header.num_uniforms))
|
| + .RetiresOnSaturation();
|
| + }
|
| +
|
| + program->GetUniformsES3(&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) {
|
| @@ -1631,7 +1824,7 @@ TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) {
|
| const size_t kNumUniforms = arraysize(kUniforms);
|
| SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms,
|
| kServiceProgramId);
|
| - program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed,
|
| + program->Link(NULL, Program::kCountOnlyStaticallyUsed,
|
| base::Bind(&ShaderCacheCb));
|
| SetupExpectationsForClearingUniforms(kUniforms, kNumUniforms);
|
| manager_.ClearUniforms(program);
|
| @@ -1704,7 +1897,7 @@ TEST_F(ProgramManagerWithShaderTest, BindUniformLocation) {
|
| const size_t kNumUniforms = arraysize(kUniforms);
|
| SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms,
|
| kServiceProgramId);
|
| - program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed,
|
| + program->Link(NULL, Program::kCountOnlyStaticallyUsed,
|
| base::Bind(&ShaderCacheCb));
|
|
|
| EXPECT_EQ(kUniform1DesiredLocation,
|
| @@ -1765,9 +1958,7 @@ class ProgramManagerWithCacheTest : public GpuServiceTest {
|
| void SetProgramCached() {
|
| cache_->LinkedProgramCacheSuccess(
|
| vertex_shader_->source(),
|
| - NULL,
|
| fragment_shader_->source(),
|
| - NULL,
|
| &program_->bind_attrib_location_map());
|
| }
|
|
|
| @@ -1784,9 +1975,7 @@ class ProgramManagerWithCacheTest : public GpuServiceTest {
|
| EXPECT_CALL(*cache_.get(), SaveLinkedProgram(
|
| program->service_id(),
|
| vertex_shader,
|
| - NULL,
|
| fragment_shader,
|
| - NULL,
|
| &program->bind_attrib_location_map(),
|
| _)).Times(1);
|
| }
|
| @@ -1804,9 +1993,7 @@ class ProgramManagerWithCacheTest : public GpuServiceTest {
|
| EXPECT_CALL(*cache_.get(), SaveLinkedProgram(
|
| program->service_id(),
|
| vertex_shader,
|
| - NULL,
|
| fragment_shader,
|
| - NULL,
|
| &program->bind_attrib_location_map(),
|
| _)).Times(0);
|
| }
|
| @@ -1828,9 +2015,7 @@ class ProgramManagerWithCacheTest : public GpuServiceTest {
|
| EXPECT_CALL(*cache_.get(),
|
| LoadLinkedProgram(service_program_id,
|
| vertex_shader,
|
| - NULL,
|
| fragment_shader,
|
| - NULL,
|
| &program->bind_attrib_location_map(),
|
| _))
|
| .WillOnce(Return(result));
|
| @@ -1921,8 +2106,8 @@ TEST_F(ProgramManagerWithCacheTest, CacheProgramOnSuccessfulLink) {
|
| SetShadersCompiled();
|
| SetExpectationsForProgramLink();
|
| SetExpectationsForProgramCached();
|
| - EXPECT_TRUE(program_->Link(NULL, NULL, NULL,
|
| - Program::kCountOnlyStaticallyUsed, base::Bind(&ShaderCacheCb)));
|
| + EXPECT_TRUE(program_->Link(NULL, Program::kCountOnlyStaticallyUsed,
|
| + base::Bind(&ShaderCacheCb)));
|
| }
|
|
|
| TEST_F(ProgramManagerWithCacheTest, LoadProgramOnProgramCacheHit) {
|
| @@ -1935,8 +2120,8 @@ TEST_F(ProgramManagerWithCacheTest, LoadProgramOnProgramCacheHit) {
|
| SetExpectationsForNotCachingProgram();
|
| SetExpectationsForProgramLoadSuccess();
|
|
|
| - EXPECT_TRUE(program_->Link(NULL, NULL, NULL,
|
| - Program::kCountOnlyStaticallyUsed, base::Bind(&ShaderCacheCb)));
|
| + EXPECT_TRUE(program_->Link(NULL, Program::kCountOnlyStaticallyUsed,
|
| + base::Bind(&ShaderCacheCb)));
|
| }
|
|
|
| } // namespace gles2
|
|
|